通过这道题再次学习到JWT的一种考法。首先题目打开是一个登录框,默认弱口令admin/admin登陆成功,页面返回了一个key值
回到前台重新再注册一个号purplet/123456,登陆后返回如下信息
说明后端肯定判断了当前登录用户是否为admin,如果不是就返回Hello+用户
登陆后再利用BurpSuite进行抓包,看到cookie处存在JWT的信息,对前两段内容进行base64解码,可以看到
{“alg”:”HS256″,”typ”:”JWT”}.{“user”:”purplet”,”news”:”Hello purplet”}
可以看出后端通过JWT对当前用户进行了判断,从而决定页面输出内容,因此猜测user字段中可能存在sql注入漏洞,利用在线加密网站 https://jwt.io/ 进行尝试
PAYLOAD处user构造一个sql注入的检测,news随便输入即可,当user处的值为真即可输出news中的值。密钥填写admin登陆后所给密钥
然而发过去却触发了waf,因此考虑绕过,先将空格换成/**/试下
可以看到当等式不成立时输出红线所画信息,再次构造user为admin’/**/and/**/1=1#
可以看到出现了news中的值:1,那么确认是sql注入无疑了,引用大佬的脚本,利用load_file读取根目录下的flag
还有一种方法,将算法置为none,同虎符杯的easy_login一题有相似原理,将第三部分置空,但前面带上.
如上这么构造,对.左右两边分别base64加密,发包过去,得到正常回显
很明显这样也可以成功构造注入,经过Fuzz测试又发现过滤了select,可用sel<>ect绕过,借用大佬的脚本跑出flag,这波学习到了。python2下运行