前言
在 Web 安全领域,SQL 注入是最常见且危害最大的漏洞之一。经过基础的学习,我们已经了解了 SQL 注入的基本原理和审计方法。然而,在实际的生产环境中,用户的输入输出接口不可能像教学示例那样没有任何防御措施。现代网站和 APP 普遍部署了 Web 应用防火墙(WAF),用于对业务流量进行恶意特征识别及防护,以避免服务器被恶意入侵。
WAF 通常通过正则匹配、黑名单过滤等手段拦截包含敏感关键字的请求。因此,在进行代码审计或渗透测试时,我们需要掌握绕过 WAF 的技巧。本文将通过 PHP 代码审计的方式,深入讲解几种常见的 SQL 注入 WAF 绕过方法,包括关键字过滤绕过、逻辑运算符绕过、URL 编码绕过以及字符集绕过等。
关键字过滤绕过
部分 WAF 会对 SQL 关键字进行严格的字符串替换或过滤。我们可以利用编程语言的特性或数据库的解析规则来绕过这些限制。
源代码分析
以下是一个典型的登录接口代码片段,其中定义了一个自定义函数 dl 来过滤危险字符:
<?php
require 'db.php';
header('Content-type:text/html;charset=utf8');
$username = dl($_POST['username']);
$password = dl($_POST['password']);
$dl = "SELECT * FROM xs WHERE username='$username' and password='$password'";
$ck = mysqli_query($db, $dl);
$row = mysqli_fetch_array($ck);
if ($_POST['login']) {
if ($row) {
echo "你的密码" . $row['username'];
} else {
echo "登录失败";
}
}
function dl() {
= ((, ), , );
= ((, ), , );
= ((, ), , );
= ((, ), , );
= ((, ), , );
= (, , );
= (, , );
;
}


