教程
🛡️

网络安全

Web 安全、渗透测试、密码学与安全合规的系统化教程。

代码审计入门:先搞清楚我们在审什么、用什么审

代码审计是站在开发者肩上看代码里埋了哪些雷。这篇讲清白盒审计的定位、三种主流审计思路、PHP 与 Java 各自的运行与调试环境,以及 Seay、RIPS、CodeQL 等工具的取舍,帮你把"看源码找漏洞"这件看上去很玄的事拆成可上手的动作。

· 更新于 2026-07-19 阅读量 --

很多人一听”代码审计”就觉得高深:面对几万行源码,从哪下手?其实代码审计没有那么神秘,它本质上就是用”读代码”的方式,把黑盒渗透里看不见的逻辑漏洞、权限判断、硬编码密钥、危险函数调用一条条揪出来。这一篇先把审计的边界、思路和工具环境讲清楚,后面几章再分别深入 PHP 和 Java。

本文所有审计手法仅用于你对自有或已授权的代码做安全评估。审计他人未授权代码可能违反法律法规与软件许可协议。

代码审计到底审什么

代码审计属于白盒测试:你有源代码,可以逐行看逻辑。它和黑盒渗透(只看到输入输出)最大的区别是——你能看到”判断到底写在哪、谁来做”。

举个直观例子:一个接口是否允许某个用户删除别人的数据,黑盒测试只能不断试,而白盒审计直接翻到那段代码,发现if ($uid == $article['uid']) 用的是弱比较,或者干脆没判断归属——漏洞一目了然。所以代码审计特别擅长发现逻辑漏洞、越权、权限绕过、硬编码密钥这类黑盒很难碰的盲区。

但它也不是万能的。审计依赖源码质量和对业务的了解,遇到混淆、加壳、第三方闭源组件,白盒就力不从心了。成熟的安全工作,往往是黑盒先扫一遍面,白盒再深抠重点代码,两者互补。

三种主流审计思路

实际审计里,新手最容易陷入”从头读到尾”的误区,几万行读不完也记不住。老手常用三种思路,按场景切换:

1. 危险函数回溯法(最常用)。先列出语言里的危险函数(PHP 的 evalsysteminclude;Java 的 Runtime.execreadObject),全局搜索它们的调用点,再逆着参数来源往回追:这个参数用户能不能控制?中间有没有过滤?能控制又没过滤,基本就是漏洞。这是效率最高的打法,适合找注入、命令执行、文件包含这类”危险函数 + 可控参数”的漏洞。

2. 正向数据流追踪法。从用户的输入点(HTTP 参数、请求头、上传文件)出发,顺着代码往下看它流经了哪些函数、做了什么处理,最终落到哪里。适合审计业务逻辑、越权、支付金额篡改这类”输入到关键操作”的链路。

3. 通读全文法。把核心文件(路由、鉴权中间件、数据库操作封装)完整读一遍,建立全局认知。适合框架类目标,比如审计 ThinkPHP 或 Spring 时,先把框架的权限校验钩子摸透,再去看业务代码哪里绕过了钩子。

实战中通常是”危险函数回溯”打头阵快速捞洞,遇到框架再”通读”补全局视野。

PHP 审计环境怎么搭

PHP 项目审计,先把运行环境跑起来,能跑才能动态验证。推荐两种方式:

  • 集成环境:Windows 下用 phpStudyWAMP,一键起 Apache/Nginx + MySQL + PHP,改配置方便。
  • 容器:用 Docker 拉一个 php:7.4-apachemysql 的 compose,环境干净、可复现,也方便把漏洞版本固定下来对比。

动态调试是 PHP 审计的加分项。给 PHP 装上 Xdebug,在 IDE(VS Code、PHPStorm)里下断点,单步看变量怎么变,比纯静态猜要靠谱得多。静态阅读阶段,推荐配合 Seay 源代码审计系统(国产、对 PHP 危险函数敏感)或 RIPS(老牌 PHP 静态分析)做初步扫描,它们能帮你标出可疑的 evalinclude 调用点,你再人工确认。

Java 审计环境怎么搭

Java 项目通常是 Maven/Gradle 工程,审计环境以 IDEA(IntelliJ IDEA) 为核心。把源码导入 IDEA,它强大的全局搜索(Ctrl+Shift+F 搜字符串、Ctrl+N 搜类、Ctrl+B 跳定义)就是最好的审计利器。

运行验证方面,本地用内嵌的 Tomcat(Spring Boot 自带)或单独起一个 Tomcat 把 WAR 包部署上去,配合 IDEA 的断点调试,能清楚看到请求从 Controller 一路走到 ServiceDAO 的调用链。Java 的调用链长、接口多,没有调试器会非常痛苦。

进阶工具:CodeQL 与 Fortify

当项目很大、人工看不过来时,需要把”找漏洞”变成”写查询”:

  • CodeQL:把代码编译成数据库,用类似 SQL 的查询语言描述”危险模式”。比如”所有 Runtime.exec 的调用,其参数可追溯到 request.getParameter 且无过滤”。它适合批量、规则化地挖同类漏洞,是现在业界主流的语义化审计工具。
  • Fortify(商业化):开箱即用的商业静态分析,规则库全,适合企业合规扫描,但贵。
  • VCG、Semgrep:轻量级开源替代,Semgrep 用 YAML 写规则,上手快,适合团队自定义规则。

工具是放大镜,不是大脑。它们能标出可疑点,但”这到底是不是漏洞、危害多大、怎么修”,永远要靠你对代码和业务的判断。

源码从哪来

合法前提下,审计对象通常是:你自己写的代码、公司授权测试的项目、客户交付的开源/自研系统,以及明确授权的第三方组件源码。切记不要去下载他人未授权的商业源码做审计,那本身可能就踩了法律红线。拿到源码后,先确认版本、依赖、配置文件(数据库密码、密钥、调试开关往往藏在配置里),再开始审。

审计人员的职业素养与法律边界

代码审计是一项带着”破坏者视角”的工作,正因如此,它对从业者的职业操守要求极高。第一原则永远是授权:你审计的代码,必须是对方明确授权你审查的——自有项目、公司指派、客户签约、或开源项目。拿着别人的商业源码私下分析,既违背许可协议,也可能触碰法律红线,技术再溜也不能越过这条线。

第二是保密与负责任披露。审计中你一定会看到数据库密码、密钥、用户隐私数据,这些信息只该用于帮助系统变安全,绝不能外传、更不能利用。发现漏洞后,应通过正规渠道告知对方,给对方留出修复时间,而不是公开细节或拿去炫耀。负责任披露是安全社区的基本公约。

第三是就事论事,对事不对人。审计报告里写的是”这段代码存在越权风险”,而不是”某某写的代码很烂”。把焦点放在代码和修复上,协作才能顺畅。真正成熟的安全工程师,目标是让系统更安全,而不是证明自己比开发厉害。

最后,保持学习。语言在迭代、框架在更新、新的利用链层出不穷,今天管用的审计手法,明年可能就失效。把每次审计当成积累案例库的机会,见过越多真实代码,下次上手就越快。技术可以学,底线不能丢——把清醒和本事一起练好,才配得上”安全”二字。

这一篇你该记住的

  • 代码审计是白盒测试,擅长挖逻辑漏洞、越权、硬编码密钥这类黑盒盲区,但依赖源码和业务的了解。
  • 三种核心思路:危险函数回溯(最常用)、正向数据流追踪(审逻辑)、通读全文(审框架)。
  • PHP 审计用 phpStudy/Docker 起环境 + Xdebug 调试 + Seay/RIPS 初扫;Java 审计以 IDEA 为核心 + 断点调试。
  • 项目大了用 CodeQL / Semgrep / Fortify 把”找漏洞”变成”写规则”,但工具只标可疑点,判断靠人。
  • 只在自有或已授权的代码上做审计,源码到手先看版本、依赖和配置文件。

下一篇我们正式进入 PHP 战场,先把 PHP 里那些”一用就危险”的函数和常见漏洞模式摸清,这是 PHP 代码审计的基本功。