目录
在网络安全领域,WAF(Web 应用防火墙)是保护 web 应用程序免受攻击的重要防线。然而,攻击者也在不断寻找方法绕过 WAF 进行恶意攻击。本文将详细讲解在漏洞利用场景下,针对 SQL 注入、文件上传、跨站等常见攻击方式的 WAF 绕过方法,包括原理、步骤和相关代码。
一、课程背景与演示环境介绍
本次课程是网络安全系列课程中的一部分,原计划共 50 天,本次是第 49 天内容。由于部分准备工作原因,下节课预计在 10 月 3 号或 10 月 10 号进行。
演示环境包括宝塔、阿里云加安全狗这三个 WAF 环境,主要针对 Apache 和 Linux 搭建的中间件,多数是 PHP 类型的网站。因为 Java 网站的中间件情况不同,获取 Java 相关的 WAF 环境较困难,但绕过思路相似。
二、WAF 拦截原理与重点漏洞分析
(一)WAF 拦截原理
WAF 通过监控输入内容来判断是否存在攻击行为。对于 SQL 注入,它会检测是否有 SQL 语句输入;文件上传时,会检查文件格式;跨站攻击则留意特定标签;命令执行中会关注敏感函数或命令等。若发现这些特征,WAF 就会进行拦截。
(二)重点漏洞类型
重点关注的漏洞类型主要有 SQL 注入、文件上传、跨站等五个漏洞。这些漏洞可能对系统造成直接危害,而像逻辑漏洞、未授权访问等漏洞,WAF 可能无法准确判定是否为攻击行为,基本不会拦截。因为逻辑漏洞往往是代码逻辑问题,如根据 ID 获取信息,改变 ID 值这种情况很难被认定为攻击。
三、绕过 WAF 的方法
(一)手工绕过
手工测试的优势在于可避免因访问速度过快触发的 CC 拦截(流量拦截)。因为手工发送请求有延迟,能更自然地模拟正常用户行为。
(二)工具绕过(以 SQLmap 为例)
使用工具速度快,但可能触发 CC 规则。若使用 SQLmap 绕过,需要考虑流量防护问题。
- 解决 CC 拦截的方法
- 可通过修改 User - Agent 头模拟爬虫使其成为白名单。在 Python 中,可以使用 requests 库来设置请求头,示例代码如下:
import requests
headers = {
"User - Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/[版本号] Safari/[版本号]"
}
response = requests.get(url, headers=headers)
- 或者利用网上付费接口实现每秒换 IP 来绕过拦截。这需要根据所使用的付费接口的 API 来编写代码,一般会涉及到向接口发送请求获取新 IP 并设置为当前请求的源 IP。
- 针对安全狗和阿里云的 SQLmap 绕过方法
- 安全狗绕过
- 关闭宝塔面板的付费防护功能,先单独测试安全狗。如果本机 IP 被安全狗封锁,可以使用代理。比如之前购买的隧道代理,每请求一次换一个 IP。假设代理服务的 API 如下(这里只是示例,实际根据具体代理服务而定):
- 安全狗绕过
import requests
proxy_url = "https://proxy-api.com/get_proxy" # 获取代理的 API
proxy_info = requests.get(proxy_url).json()
proxy = {
"http": proxy_info["proxy_address"],
"https": proxy_info["proxy_address"]
}
response = requests.get(url, proxies=proxy)
- 同时,安全狗可能会检测 SQLmap 的工具标识。可将注入点按照特定思路写成.py 文件放入 SQLmap 的 tmp 目录下作为第三方模块,修改注入规则。以下是一个简单的示例(假设注入点逻辑在自定义函数 inject_rule 中):
# inject_rule.py
def inject_rule():
# 这里编写针对安全狗的注入规则修改逻辑
pass
在 SQLmap 命令中可以使用--tamper=inject_rule.py
来加载这个自定义模块。
-
此外,为了避免被安全狗识别,还可以通过自定义头(如模仿自己浏览器的头部)或使用随机头来模拟正常用户请求行为。使用 requests 库设置自定义头的示例前面已给出,使用随机头可以使用一些第三方库来生成随机的 User - Agent 等头部信息。
-
阿里云绕过
阿里云在漏洞发布方面没有特殊问题,若购买了其 WAF 则可防护流量和攻击行为,但一些简单方法(如用代理、加延迟)可能就可以绕过。可以使用类似安全狗绕过中的代理方法,若遇到网络问题,可以使用提前准备好的代理(付费插件)来继续测试。
- 宝塔 WAF 绕过思路与方法
对于宝塔的拦截,发现其检测特定符号(如百分号加星号等)。可通过在符号前加 “0%” 来截断检测,让其无法识别后面的关键内容,从而实现绕过。例如在修改 SQL 语句等涉及符号的地方都可采用此思路。以下是一个简单的 SQL 语句修改示例(假设是一个简单的 SQL 查询注入场景):
original_sql = "SELECT * FROM users WHERE username LIKE '%admin%'"
bypass_sql = "SELECT * FROM users WHERE username LIKE '0%admin%'"
在实际测试过程中,可能会遇到一些问题,如宝塔面板某些规则突然消失、画面黑屏、找不到相关设置等情况。而且网上很多公布的绕过方法可能因软件升级等原因失效,之前有效的方法在新环境下也可能不再适用。需要不断根据实际情况调整绕过策略。
在前端,如果使用 Vue3 和 TypeScript 来模拟攻击请求,可以在组件中使用 axios 库发送请求,示例代码如下:
import axios from 'axios';
axios.get('your_url', {
headers: {
// 设置请求头,如 User - Agent 等
'User - Agent': 'your_custom_agent'
}
}).then(response => {
console.log(response.data);
}).catch(error => {
console.error(error);
});
对于后端(假设是 Java),如果需要处理和分析攻击请求,可以在 Servlet 或者 Spring Boot 等框架中编写相应的逻辑来检测和防范可能的攻击,这里就不详细展开了,因为本文主要侧重于 WAF 绕过的内容。但一般来说,会涉及到对请求参数的解析和安全检查。
总之,WAF 绕过是一个复杂且需要不断实践和探索的领域,需要综合考虑多种因素和技术手段。同时,安全防护和攻击之间的对抗是持续不断的,需要持续关注安全技术的发展。