写在前面:合法学习边界
代码审计只用于授权项目与自己的代码。审计他人代码需获得授权。
一、原理:什么是代码审计
代码审计(白盒测试)是从源码直接找漏洞,而不是像黑盒那样靠请求探测。
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(用户可控路径) // 任意文件读取
HttpURLConnection(URL 可控) // 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)
文件操作白名单、路径规范化
反序列化白名单
最小权限运行
|
八、小结
代码审计 = “危险函数 → 输入来源 → 数据流 → 绕过”。先用工具筛候选,再人工追数据流。它和黑盒是互补的:黑盒负责广撒网,白盒负责挖到底。会代码审计,是渗透从“会用工具”到“懂漏洞”的分水岭。