代码审计思路讨论
字数 1969 2025-08-18 11:39:11
代码审计实战教学:从入门到精通
前言
本教学文档基于BlueCMS v1.6sp1的代码审计实践,详细讲解SQL注入、XSS、CSRF和文件包含漏洞的审计方法。使用工具包括seay源代码审计系统和Notepad++。
一、代码审计基础思路
1.1 常用审计方法
- 敏感关键字回溯:通过搜索敏感函数/关键字追踪参数流向
- 可控变量查询:识别用户可控的输入点
- 敏感功能点定位:重点关注登录、支付、文件上传等关键功能
- 通读全文:全面了解系统架构和核心文件
1.2 核心关注点
- 输入点:用户登录、搜索、留言板、URL参数等
- 数据流:参数从输入到输出的完整路径
- 输出点:print、echo、var_dump等输出函数
- 关键文件:
common.fun.php- 公共函数mysql.class.php- 数据库操作类user.fun.php- 用户相关函数common.inc.php- 公共包含文件
二、SQL注入漏洞审计
2.1 SQL注入常见位置
- 登录页面
- 订单处理系统
- HTTP头字段(X-Forwarded-For、Client-IP)
- 购物车交互(易产生二次注入)
2.2 BlueCMS SQL注入实例分析
漏洞位置:user.php中的登录功能(act=do_login)
审计步骤:
-
定位输入点:登录表单提交到
user.php- 参数:
user_name,pwd,safecode,useful_time,from,act
- 参数:
-
追踪SQL执行流程:
getone()函数(位于mysql.class.php)- 调用
query()执行SQL - 使用
mysql_fetch_array获取结果
- 调用
login()函数(位于user.fun.php)- 使用
getone()验证用户
- 使用
-
发现过滤机制:
deep_addslashes()函数(位于common.inc.php)对输入进行转义- 使用
%df可绕过转义(宽字节注入)
-
构造Payload:
abc123%df') or 1=1 # -
验证漏洞:
- 使用SQLMap成功验证注入点
关键代码片段:
// user.php
if($act == 'do_login') {
// ...省略验证逻辑...
$user_info = login($user_name, md5($pwd));
}
// mysql.class.php
function getone($sql, $type=MYSQL_ASSOC) {
$query = $this->query($sql);
$row = mysql_fetch_array($query, $type);
return $row;
}
// common.inc.php
function deep_addslashes($str) {
return addslashes($str);
}
三、XSS漏洞审计
3.1 XSS漏洞类型与位置
-
存储型XSS:
- 文章发表
- 评论回复
- 用户资料设置
-
反射型XSS:
- 搜索功能
- URL参数
-
DOM型XSS:
- 前端JavaScript处理用户输入
3.2 BlueCMS存储型XSS实例
漏洞位置:用户注册功能(邮箱字段)
审计步骤:
- 定位数据存储点:搜索
INSERT INTO语句 - 识别可控参数:邮箱字段无前端格式验证
- 检查过滤机制:未使用
htmlspecialchars过滤 - 构造Payload:
<script>alert('XSS')</script> - 绕过前端验证:直接修改POST请求
关键代码片段:
// user.php
if($act == 'do_reg') {
// ...省略其他验证...
$sql = "INSERT INTO ".table('user')." (...) VALUES (...)";
$db->query($sql);
}
四、CSRF漏洞审计
4.1 CSRF防护机制
-
Token验证:
- 服务端生成唯一Token
- 每次请求验证Token有效性
-
Referer检查:
- 验证请求来源域名
4.2 CSRF审计方法
-
黑盒测试:
- 删除Referer头测试请求是否通过
- 检查是否存在Token参数
-
白盒审计:
- 搜索
token相关代码 - 检查关键操作是否有防护
- 搜索
典型Token生成代码:
// 生成Token
function generateToken() {
return md5(time().rand(1,1000));
}
// 验证Token
function checkToken($token) {
return $_SESSION['token'] === $token;
}
五、文件操作漏洞审计
5.1 文件包含漏洞
常见函数:
includeinclude_oncerequirerequire_once
审计要点:
- 查找包含函数
- 检查包含路径是否可控
- 验证过滤和截断可能性
5.2 BlueCMS文件包含实例
漏洞位置:支付功能(pay参数)
利用方法:
- 构造包含路径:
include 'include/payment/'.$_POST['pay']."/index.php"; - 使用点号截断:
- Windows: 256个点
- Linux: 2038个点
Payload:
pay=../../../shell.txt...............................................................................................................................................................................................................................................
六、总结与防御建议
6.1 漏洞防御措施
-
SQL注入:
- 使用预处理语句(PDO/mysqli)
- 严格类型转换
- 避免直接拼接SQL
-
XSS:
- 输出时使用
htmlspecialchars - 设置Content Security Policy(CSP)
- 输入内容白名单过滤
- 输出时使用
-
CSRF:
- 关键操作使用Token验证
- 检查Referer头
-
文件包含:
- 固定包含文件白名单
- 禁用危险函数(
allow_url_include=Off)
6.2 审计工具推荐
-
静态分析工具:
- Seay源代码审计系统
- RIPS
- Fortify
-
动态测试工具:
- Burp Suite
- OWASP ZAP
- SQLMap
-
代码编辑器:
- Notepad++
- Sublime Text
- VS Code
通过本教学的系统学习,您将掌握基础的代码审计思路和方法,能够独立发现常见Web漏洞。实际审计中需结合多种方法,持续积累经验。