代码审计入门(PHP / Java 常见漏洞点)

白盒代码审计入门:危险函数清单、数据流追踪思路、PHP/Java 常见漏洞点、静态扫描工具与人工审计方法。

写在前面:合法学习边界

代码审计只用于授权项目与自己的代码。审计他人代码需获得授权。

一、原理:什么是代码审计

代码审计(白盒测试)是从源码直接找漏洞,而不是像黑盒那样靠请求探测。

1
2
黑盒:输入 → 输出,靠猜
白盒:直接看源码,知道“输入去哪了”

审计的核心是数据流追踪:输入从哪里来,经过什么处理,最后进到哪个危险函数。

二、影响与价值

1
2
3
能发现漏扫/黑盒测不到的漏洞
能理解漏洞成因,写报告更专业
对 0day、逻辑漏洞尤其有效

三、危险函数清单(第一步先找它)

PHP

1
2
3
4
5
6
eval()        // 代码执行
system()/exec()/shell_exec()  // 命令执行
include/require(用户可控)     // 文件包含
mysql_query(拼接)            // SQL 注入
file_put_contents             // 写文件
unserialize()                 // 反序列化

Java

1
2
3
4
5
Runtime.getRuntime().exec()   // 命令执行
PreparedStatement 未使用  拼接 // SQL 注入
ObjectInputStream.readObject() // 反序列化
FileInputStream用户可控路径 // 任意文件读取
HttpURLConnectionURL 可控  // SSRF

四、审计操作步骤

1
2
3
4
5
6
第 1 步:定位危险函数(全局搜索关键词)—— 结果:候选列表
第 2 步:确认每个候选的“输入来源”(GET/POST/Cookie/上传)
第 3 步:追踪数据流:输入 → 过滤?→ 拼接进危险函数
第 4 步:看是否有过滤(白名单/转义/参数化),能绕过即漏洞
第 5 步:构造 PoC 验证(授权环境)
第 6 步:记录 位置+成因+影响+修复

五、常见审计点

1
2
3
4
5
6
7
SQL:搜索 拼接查询,看是否用预处理
命令:搜索 exec/system,看参数是否可控
文件:搜索 include/file_put_contents,看路径
上传:看扩展名/内容校验是否可绕过
反序列化:看是否对不可信数据反序列化
SSRF:看 URL 参数是否限制协议/内网
越权:看对象访问是否校验归属

六、工具辅助

1
2
静态扫描:Semgrep、RIPS、Fortify、SonarQube、phpstan
正则全局搜危险函数:grep -rn "eval(\|system(\|exec("
1
2
grep -rnE 'eval\(|system\(|shell_exec\(|exec\(' src/
grep -rnE 'Runtime.getRuntime|readObject|prepareStatement' src/
1
工具能筛候选,但**逻辑漏洞与绕过仍需人工**

七、防御与修复

1
2
3
4
5
输入校验 + 参数化查询
禁用危险函数(PHP disable_functions)
文件操作白名单、路径规范化
反序列化白名单
最小权限运行

八、小结

代码审计 = “危险函数 → 输入来源 → 数据流 → 绕过”。先用工具筛候选,再人工追数据流。它和黑盒是互补的:黑盒负责广撒网,白盒负责挖到底。会代码审计,是渗透从“会用工具”到“懂漏洞”的分水岭。