以全国信安比赛CISCN2018的web题easyweb为例
这道题的大部分人是用非预期解做出来的
密码为空,可以登陆
image.png
image.png
该题的正解是JWT伪造cookie
注册账号密码均为 admin2333
登陆得到cookie
eyJ0eXAiOiJKV1QiLCJhbGciOiJzaGEyNTYiLCJraWQiOiI4MjAxIn0.eyJuYW1lIjoiYWRtaW4yMzMzIn0.aC0DlfB3pbeIqAQ18PaaTOPA5PSipJe651w7E0BZZRI
base64解码后有惊喜
image.png
猜测是cookie伪造
经过搜索后发现是采用了JWT机制(Json Web Token)
参考链接
http://laravelacademy.org/post/3640.html
关键信息截图
image.png
image.png
生成和调试JWT的网站: https://jwt.io
image.png
为了伪造,这里要观察一下签名的生成算法
参考链接
https://www.cnblogs.com/lyzg/p/6028341.html
https://1024tools.com/hmac
image.png
这里的kid是key的id,具体的密钥是key的值
这里key的值在数据库中,类似的数据库代码为
sql="select * from table where kid=$kid "
res=exec(sql)
所以我们可以构造kid=0 union select 1
,使得res=1
然后我们用1作为密钥来签名加密,就可以顺利伪造cookie
image.png
image.png
或者也可以通过时间盲注来,来得到签名的密钥,或者直接注出admin密码的md5,一解密,你会发现是空密码,2333
这里给出另一道可以伪造的CTF题,因为泄露了加密时的密钥
https://chybeta.github.io/2017/08/29/HITB-CTF-2017-Pasty-writeup/
低版本的JWT,密钥也可以直接设为none,来进行伪造