漏洞的发现不仅是安全研究的前提,更是攻防对抗中的关键一环。本文将系统介绍常见的漏洞发现方法,包括源代码审计、模糊测试、功能探索、补丁差异分析、协议实现问题分析等,并配合典型漏洞案例进行说明。
一、源代码审计(Code Auditing)
源代码审计是发现逻辑性漏洞的核心手段,尤其适用于开源项目。研究人员通过阅读程序源码,分析输入处理逻辑、权限校验、函数调用路径等,从中找出潜在的安全缺陷。
典型流程
- 获取源代码(GitHub、官方下载包)
- 查找用户输入点(如
$_GET
、$_POST
、request
) - 追踪输入如何流向危险函数(如
eval()
、exec()
、数据库操作) - 判断是否有过滤或校验
- 手工构造利用路径
示例:CVE-2018-7600(Drupalgeddon2)
Drupal 表单 API 在处理 AJAX 请求时未对结构化参数如 #post_render
进行足够验证,攻击者可将任意 PHP 函数注入,最终实现远程命令执行(RCE)。
POST /user/register?element_parents=account/mail/%23value&ajax_form=1&_wrapper_format=drupal_ajax
Content-Type: application/x-www-form-urlencoded
form_id=user_register_form&_drupal_ajax=1&mail[#post_render][]=exec&mail[#markup]=id&mail[#type]=markup
二、模糊测试(Fuzzing)
模糊测试是一种自动化漏洞发现技术,通过向程序输入大量变异或非法数据,观察其行为是否异常,如崩溃、内存泄漏、信息泄露等。
常见工具
- AFL(American Fuzzy Lop)
- LibFuzzer
- Honggfuzz
- Peach Fuzzer
- Boofuzz(用于协议模糊)
适用场景
- C/C++ 编写的二进制程序
- 网络协议处理逻辑
- 输入解析组件,如图像/PDF/音视频解析器
实例:PDF 阅读器漏洞
通过 Fuzzing 工具向 PDF 阅读器输入变异过的文件,发现软件在解析时出现崩溃,从而定位到内存访问越界或未初始化指针等问题,进一步分析可构造出可控的漏洞利用。
三、黑盒测试与功能探索
不依赖源代码,仅通过 Web 界面或 API 接口交互观察异常行为,是 Web 漏洞发现中最常见的方式之一。
常见技巧
- 请求方法变换(如 PUT/DELETE/HEAD)
- 参数注入测试(尝试构造数组、特殊函数名)
- 文件上传绕过测试(改后缀、双扩展、Content-Type 伪造)
- 错误信息收集(500 报错、路径泄露)
- 权限绕过测试(登录态篡改、IDOR)
示例:CVE-2017-12615(Tomcat PUT 文件上传)
Tomcat 某版本在 Windows 下默认允许 PUT 方法上传文件,如果上传 .jsp
文件,将直接可被当作脚本执行。
curl -X PUT "http://target:8080/shell.jsp" --data-binary @shell.jsp
四、补丁差异分析(Patch Diffing)
补丁发布后,研究人员可对比补丁前后的代码变化,定位修复的核心逻辑,从而理解漏洞本质,有时还能找到变种绕过。
工具推荐
- BinDiff(针对二进制补丁)
- Git diff / Meld(针对源码补丁)
实例:CVE-2017-5638 与 S2-045
S2-045 是 Struts2 中的 OGNL 表达式注入漏洞。安全研究员对比 CVE-2017-5638 的补丁发现 OGNL 表达式过滤点存在逻辑缺陷,构造新的 payload 实现绕过,变种漏洞由此出现。
五、协议实现漏洞分析
一些服务在实现复杂协议(如 HTTP/2、AJP、FTP)时存在不符合标准或未考虑边界条件的处理,可能导致文件包含、信息泄露、甚至 RCE。
实例:CVE-2020-1938(Ghostcat)
Ghostcat 是 Tomcat AJP 协议中的一个严重漏洞。攻击者可通过连接 8009 端口构造请求,伪造服务器对某路径进行内部包含,从而读取任意文件或包含 WebShell。
ajp-request --host target --port 8009 --path /WEB-INF/web.xml
六、赏金平台 & 社区报告
许多厂商通过 Bug Bounty 计划鼓励安全研究员提交漏洞,知名平台包括:
- HackerOne
- Bugcrowd
- 腾讯/阿里/百度 SRC
- Google/Apple/Microsoft 官方赏金计划
这些平台在鼓励发现漏洞的同时,也帮助厂商及时修复。
七、总结
漏洞的发现融合了代码审计能力、系统理解能力、工具使用能力与探索精神。无论是静态分析还是动态测试,都要围绕“用户输入如何影响程序执行”这个核心展开。研究者既要理解开发逻辑,又要从攻击者的角度寻找系统可能忽视的边界情况。