咋只有一道web,全是ai题
jwt2struts
看题目猜测考点是jwt伪造+s2漏洞
进入网站,发现是需要admin身份,也确实是jwt伪造
解析jwt
用JSON Web Tokens - jwt.io进行解析,发现确实是jwt
但是不知道密钥,
先尝试是不是空密钥,直接修改为admin
得到新的jwt
eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJhZG1pbiIsImV4cCI6MjAwNjM5MzI5N30.L0YCThgRESeqIu8mUgr_IjD6CYadVNFH4sQ29w40nnU
代入再次访问网站
结果提示token
无效,
查看网页源码发现
提示JWT_key.php
这应该就是jwt生成和身份验证的php代码
访问得到代码
1 |
|
分析代码
发现想要得到key,关键在于这段条件语句的绕过
1 | if ($username === "admin" && $password != "root") { |
$username
和$password
好实现
username
:admin
,password
:除了root
以为的字符
$_COOKIE["digest"]
要求为md5($salt.$username.$password)
也就是$_COOKIE["digest"]
要为盐+名字+密码
的字符串的md5值
现在知道,
盐的长度是
14
,且
md5($salt."adminroot")=e6ccbf12de9d33ec27a5bcfb6a3293df
hash长度拓展攻击
对于这种未知salt,但又要进行绕过MD5或者sha1加密的,就可以考虑用hash长度拓展攻击
hash长度扩展攻击 | KANGEL (j-kangel.github.io)
【个人分析写在笔记上】
利用工具hashdump
1 | Input Signature |
Input Signature: e6ccbf12de9d33ec27a5bcfb6a3293df
Input Data: adminroot
Input Key Length: 14
Input Data to Add: Jay
8ae52974e81aace9837123a520cb8179
adminroot\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb8\x00\x00\x00\x00\x00\x00\x00Jay
然后把\x
换成%
此时,
$_COOKIE["digest"]
就为
Cookie: digest=8ae52974e81aace9837123a520cb8179
$username
和$password
就为
admin
和root%80%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%b8%00%00%00%00%00%00%00Jay
然后修改请求包内容
得到sercret_key
为sk-he00lctf3r
然后修改jwt,进行jwt伪造
然后修改网站的token
刷新后,网站跳转http://140.210.223.216:55557/admiiiiiiiiiiin/
,
网站的名字就叫do you know struct2?
确定这里是需要利用s2
漏洞
抓包查看这个网页提交请求包
发现是发向/admiiiiiiiiiiin/user.action
直接用工具也可以
flag在环境变量里,执行env
可以看到
burp发包也可以,只是需要将s2
的payload进行url编码即可
ps.jwt-cracker【非预期无法解】
本来是想用jwt-cracker
进行爆破jwt
的secret
1 | docker pull epsilon95/jwtcrack |
结果CPU跑飞了也没爆破出来,看来是不是非预期能解出来,只能考虑hash长度拓展攻击
脚本利用rockyou爆破salt【不知道是不是预期可行】
在rockyou.txt
中有这个key,说明可以利用这个方法进行爆破,写个脚本即可进行
过滤rockyou中长度为14的字符,然后加到
adminroot前进行MD5计算使得计算后的值为
e6ccbf12de9d33ec27a5bcfb6a3293df
=>
最后我们就可以爆破出salt为sk-he00lctf3r
最后只要密码随便修改为root1
即可,然后再MD5计算一次得到cookie
值