伪静态的核心是将一个动态的 URL(如 index.php?id=123)转换成一个看起来像静态文件的 URL(如 /product/123.html),对于扫描工具来说,只要它能正确地与服务器交互,它通常不会关心URL 是真实的静态文件还是由动态脚本生成的。

扫描伪静态网站的关键在于确保扫描工具能够正确地处理和跟随这些重写后的 URL。
下面我将从几个层面详细解释如何进行扫描,包括核心原理、工具选择、具体操作步骤以及针对伪静态的特殊技巧。
核心原理:伪静态对扫描的影响
-
对爬虫/扫描器透明:只要 URL 重写规则配置正确,Web 服务器(如 Apache 或 Nginx)会自动将用户/工具请求的静态风格 URL(如
/user/profile/123)内部转发给真正的动态脚本(如/user.php?id=123),对于扫描器来说,它收到的响应内容(HTML、JS、404页面等)和请求 URL 的最终形态是它关心的,而不需要知道中间的转换过程。 -
URL 发现的挑战:扫描器通常通过以下方式发现 URL:
(图片来源网络,侵删)- 爬取:从一个起始 URL 开始,解析 HTML 中的
<a>标签、<script>、<link>、<form>等,提取新的 URL。 - 字典/爆破:使用一个预设的 URL 列表(如
/admin,/login.php)或参数字典(如id=1,2,3...)去尝试访问。 - 伪静态网站的特殊性:它的 URL 结构可能更复杂,没有明显的
.php或.asp后缀,这可能会让一些基于文件名扩展名识别的扫描器“误判”,但不会阻止它访问。
- 爬取:从一个起始 URL 开始,解析 HTML 中的
-
参数混淆:伪静态的参数可能被隐藏在路径中(如
/article/2025/10/15/hello-world),而不是在查询字符串中(?year=2025&month=10&id=15),这要求扫描器具备路径参数识别和模糊测试的能力。
扫描工具的选择与使用
主流的 Web 应用漏洞扫描器(无论是主动扫描还是被动扫描)都支持对伪静态网站的扫描,关键在于如何正确配置它们。
自动化扫描器(推荐)
这些工具是专门为复杂的现代 Web 应用设计的,能很好地处理伪静态、JavaScript 渲染、复杂参数等问题。
-
Burp Suite (Professional/Community)
(图片来源网络,侵删)- 原理:作为一个本地代理,它截获你浏览器和服务器之间的所有请求,你手动浏览一遍目标网站,Burp Suite 就能自动发现所有 URL 和参数。
- 如何处理伪静态:
- 配置代理:将浏览器和 Burp Suite 的代理设置好。
- 手动爬取:在浏览器中正常访问和使用伪静态的网站(点击所有链接、提交所有表单、分页等)。
- 查看历史记录:Burp Suite 的 "HTTP history" 会记录下你访问过的所有 URL,无论它们是静态的还是伪静态的。
- 发送到扫描器:从历史记录中选中你感兴趣的请求,右键选择 "Add to scanner" 即可进行漏洞扫描。
- 优点:非常灵活,能精确控制扫描范围,能处理基于会话的复杂应用。
-
OWASP ZAP (Zed Attack Proxy)
- 原理:与 Burp Suite 类似,也是一个本地代理,但功能更开源和免费。
- 如何处理伪静态:
- 启动代理:配置好 ZAP 和浏览器。
- 主动/被动扫描:浏览网站后,ZAP 的 "History" 标签会记录所有请求,你可以使用 "Spider"(爬虫)功能自动发现更多页面,或者使用 "Active Scan"(主动扫描)对已发现的 URL 进行深度扫描。
- AJAX Spider:对于由 JavaScript 动态加载内容的单页应用,ZAP 提供了专门的 AJAX Spider,效果更好。
- 优点:免费、开源、功能强大,社区支持好。
-
Nikto / Nmap (HTTP Scripts)
- 原理:这些是命令行工具,基于字典和规则进行扫描。
- 如何处理伪静态:
- Nikto 会尝试访问一些常见的、可能被伪静态化的路径,如
/admin,/login,/test.html等,它不关心 URL 的具体形式,只要服务器返回了内容,它就会检查。 - Nmap 的
http-enum脚本也可以用来发现常见的目录和文件。
- Nikto 会尝试访问一些常见的、可能被伪静态化的路径,如
- 优点:轻量、快速,适合快速信息收集和检查明显的漏洞。
- 缺点:爬虫能力较弱,可能无法发现所有伪静态的页面,不适合深度扫描复杂应用。
自定义脚本(高级用户)
如果网站结构非常特殊,或者你需要进行高度定制化的扫描,可以编写自己的脚本。
- Python + Requests/Scrapy
- 原理:使用 Python 的
requests库发送 HTTP 请求,或使用Scrapy框架构建一个爬虫。 - 如何处理伪静态:
- 手动构造 URL:如果你知道伪静态的 URL 规则(如
/category/{id}.html),可以编写一个循环来构造不同的 URL 并发送请求。 - 解析响应:从返回的 HTML 中提取新的 URL 和参数,加入到待爬取队列中。
- 集成漏洞扫描逻辑:在每个请求中,可以插入 payload(如 SQL 注入、XSS 的 payload)来测试漏洞。
- 手动构造 URL:如果你知道伪静态的 URL 规则(如
- 优点:完全可控,可以针对特定网站进行优化。
- 缺点:开发成本高,需要具备编程能力。
- 原理:使用 Python 的
扫描伪静态网站的特殊技巧和注意事项
-
识别伪静态规则(可选但推荐)
- 检查
.htaccess文件:如果服务器是 Apache,尝试直接访问http://example.com/.htaccess(有时需要配置才能访问),这个文件包含了 URL 重写的规则,能让你了解 URL 是如何被转换的,有助于构造更精确的扫描字典。 - 检查 Nginx 配置:如果你有服务器权限,可以查看
nginx.conf或vhost目录下的配置文件,找到rewrite规则,对于外部扫描者,这通常不可行,但可以通过分析 404 错误来推断规则。
- 检查
-
关注路径中的参数
- 很多伪静态 URL 的参数是嵌入在路径中的,
/user/123/profile,123就是用户 ID。 - 在 Burp/ZAP 中处理:在扫描器中,你可以将这些路径部分标记为可变参数(如
user/*/profile),然后对 这个位置进行数字爆破、字符串爆破等模糊测试。 - 在自定义脚本中处理:使用正则表达式提取这些参数,然后替换成你的 payload。
- 很多伪静态 URL 的参数是嵌入在路径中的,
-
处理会话和登录状态
- 伪静态网站的功能通常需要登录后才能访问,扫描器必须先登录并保持会话,才能扫描到需要认证的页面。
- Burp/ZAP 的做法:手动登录一次,然后将包含登录 Cookie 的请求发送给扫描器,或者在扫描器配置中设置认证脚本。
-
留意 404 错误页面
- 一个配置良好的伪静态网站,当访问一个不存在的伪静态 URL 时,应该返回一个标准的 404 错误页面。
- 为什么重要:如果扫描器发送了一个错误的 URL(如
/user/abc,而abc不是数字),服务器可能返回一个 200 OK 页面,内容是“用户不存在”的提示,扫描器可能会错误地认为这是一个有效的页面,从而影响扫描效率和准确性。 - 如何处理:在配置扫描器时,可以设置一个“有效响应”和“无效响应”的判断规则,如果响应状态码是 200,但页面内容包含“Error 404”或“Not Found”,则将其视为无效响应。
-
不要忽略 JavaScript
- 很多伪静态页面的导航和内容加载是由 JavaScript 实现的(前端路由)。
- 工具选择:确保你的扫描工具(如 ZAP 的 AJAX Spider)能够执行 JavaScript,否则它会漏掉大量由 JS 动态生成的页面和 API 请求。
实战步骤总结(以 Burp Suite 为例)
- 配置代理:启动 Burp Suite,设置监听端口(如 8080),然后在浏览器中配置代理为
0.0.1:8080。 - 爬取目标:在浏览器中打开目标伪静态网站,像正常用户一样点击所有链接、按钮,进行翻页、搜索、登录等操作,确保覆盖所有主要功能,这一步是让 Burp Suite “认识”网站的关键。
- 分析请求:切换到 Burp Suite 的 "HTTP history" 选项卡,你会看到所有被记录的请求,检查 URL,你会发现它们都是伪静态的格式(如
/product/shoes/99.html)。 - 选择扫描范围:在 "Target" -> "Scope" 中,将目标网站的域名添加进去,确保只扫描你授权的网站。
- 启动扫描:在 "HTTP history" 中,选中你想要扫描的请求(可以是一个代表某个功能模块的请求),右键点击,选择 "Scan..."。
- 监控和等待:扫描开始后,可以在 "Scanner" 选项卡中查看扫描进度和已发现的漏洞。
- 分析报告:扫描完成后,查看 "Issues" 选项卡,分析发现的每一个漏洞,并手动验证其真实性。
扫描伪静态网站的核心在于让扫描工具“看到”并“理解”网站的所有 URL 和参数,现代的专业工具(如 Burp Suite 和 OWASP ZAP)已经为此做了大量优化,通过手动引导爬取,它们能很好地处理伪静态问题,关键在于操作者要熟悉工具的使用,并关注路径参数、会话管理和 JavaScript 渲染等细节。
