JWT伪造cookie

以全国信安比赛CISCN2018的web题easyweb为例

这道题的大部分人是用非预期解做出来的

密码为空,可以登陆


JWT伪造cookie_第1张图片
image.png

JWT伪造cookie_第2张图片
image.png

该题的正解是JWT伪造cookie

注册账号密码均为 admin2333
登陆得到cookie

eyJ0eXAiOiJKV1QiLCJhbGciOiJzaGEyNTYiLCJraWQiOiI4MjAxIn0.eyJuYW1lIjoiYWRtaW4yMzMzIn0.aC0DlfB3pbeIqAQ18PaaTOPA5PSipJe651w7E0BZZRI

base64解码后有惊喜


JWT伪造cookie_第3张图片
image.png

猜测是cookie伪造

经过搜索后发现是采用了JWT机制(Json Web Token)

参考链接
http://laravelacademy.org/post/3640.html

关键信息截图

JWT伪造cookie_第4张图片
image.png

JWT伪造cookie_第5张图片
image.png

生成和调试JWT的网站: https://jwt.io

JWT伪造cookie_第6张图片
image.png

为了伪造,这里要观察一下签名的生成算法
参考链接
https://www.cnblogs.com/lyzg/p/6028341.html
https://1024tools.com/hmac

JWT伪造cookie_第7张图片
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

JWT伪造cookie_第8张图片
image.png

JWT伪造cookie_第9张图片
image.png

或者也可以通过时间盲注来,来得到签名的密钥,或者直接注出admin密码的md5,一解密,你会发现是空密码,2333

这里给出另一道可以伪造的CTF题,因为泄露了加密时的密钥
https://chybeta.github.io/2017/08/29/HITB-CTF-2017-Pasty-writeup/

低版本的JWT,密钥也可以直接设为none,来进行伪造

你可能感兴趣的:(JWT伪造cookie)