代码审计思路讨论
字数 1969 2025-08-18 11:39:11

代码审计实战教学:从入门到精通

前言

本教学文档基于BlueCMS v1.6sp1的代码审计实践,详细讲解SQL注入、XSS、CSRF和文件包含漏洞的审计方法。使用工具包括seay源代码审计系统和Notepad++。

一、代码审计基础思路

1.1 常用审计方法

  1. 敏感关键字回溯:通过搜索敏感函数/关键字追踪参数流向
  2. 可控变量查询:识别用户可控的输入点
  3. 敏感功能点定位:重点关注登录、支付、文件上传等关键功能
  4. 通读全文:全面了解系统架构和核心文件

1.2 核心关注点

  • 输入点:用户登录、搜索、留言板、URL参数等
  • 数据流:参数从输入到输出的完整路径
  • 输出点:print、echo、var_dump等输出函数
  • 关键文件
    • common.fun.php - 公共函数
    • mysql.class.php - 数据库操作类
    • user.fun.php - 用户相关函数
    • common.inc.php - 公共包含文件

二、SQL注入漏洞审计

2.1 SQL注入常见位置

  1. 登录页面
  2. 订单处理系统
  3. HTTP头字段(X-Forwarded-For、Client-IP)
  4. 购物车交互(易产生二次注入)

2.2 BlueCMS SQL注入实例分析

漏洞位置user.php中的登录功能(act=do_login)

审计步骤

  1. 定位输入点:登录表单提交到user.php

    • 参数:user_name, pwd, safecode, useful_time, from, act
  2. 追踪SQL执行流程

    • getone()函数(位于mysql.class.php
      • 调用query()执行SQL
      • 使用mysql_fetch_array获取结果
    • login()函数(位于user.fun.php
      • 使用getone()验证用户
  3. 发现过滤机制

    • deep_addslashes()函数(位于common.inc.php)对输入进行转义
    • 使用%df可绕过转义(宽字节注入)
  4. 构造Payload

    abc123%df') or 1=1 #
    
  5. 验证漏洞

    • 使用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漏洞类型与位置

  1. 存储型XSS

    • 文章发表
    • 评论回复
    • 用户资料设置
  2. 反射型XSS

    • 搜索功能
    • URL参数
  3. DOM型XSS

    • 前端JavaScript处理用户输入

3.2 BlueCMS存储型XSS实例

漏洞位置:用户注册功能(邮箱字段)

审计步骤

  1. 定位数据存储点:搜索INSERT INTO语句
  2. 识别可控参数:邮箱字段无前端格式验证
  3. 检查过滤机制:未使用htmlspecialchars过滤
  4. 构造Payload
    <script>alert('XSS')</script>
    
  5. 绕过前端验证:直接修改POST请求

关键代码片段

// user.php
if($act == 'do_reg') {
    // ...省略其他验证...
    $sql = "INSERT INTO ".table('user')." (...) VALUES (...)";
    $db->query($sql);
}

四、CSRF漏洞审计

4.1 CSRF防护机制

  1. Token验证

    • 服务端生成唯一Token
    • 每次请求验证Token有效性
  2. Referer检查

    • 验证请求来源域名

4.2 CSRF审计方法

  1. 黑盒测试

    • 删除Referer头测试请求是否通过
    • 检查是否存在Token参数
  2. 白盒审计

    • 搜索token相关代码
    • 检查关键操作是否有防护

典型Token生成代码

// 生成Token
function generateToken() {
    return md5(time().rand(1,1000));
}

// 验证Token
function checkToken($token) {
    return $_SESSION['token'] === $token;
}

五、文件操作漏洞审计

5.1 文件包含漏洞

常见函数

  • include
  • include_once
  • require
  • require_once

审计要点

  1. 查找包含函数
  2. 检查包含路径是否可控
  3. 验证过滤和截断可能性

5.2 BlueCMS文件包含实例

漏洞位置:支付功能(pay参数)

利用方法

  1. 构造包含路径:
    include 'include/payment/'.$_POST['pay']."/index.php";
    
  2. 使用点号截断:
    • Windows: 256个点
    • Linux: 2038个点

Payload

pay=../../../shell.txt...............................................................................................................................................................................................................................................

六、总结与防御建议

6.1 漏洞防御措施

  1. SQL注入

    • 使用预处理语句(PDO/mysqli)
    • 严格类型转换
    • 避免直接拼接SQL
  2. XSS

    • 输出时使用htmlspecialchars
    • 设置Content Security Policy(CSP)
    • 输入内容白名单过滤
  3. CSRF

    • 关键操作使用Token验证
    • 检查Referer头
  4. 文件包含

    • 固定包含文件白名单
    • 禁用危险函数(allow_url_include=Off)

6.2 审计工具推荐

  1. 静态分析工具

    • Seay源代码审计系统
    • RIPS
    • Fortify
  2. 动态测试工具

    • Burp Suite
    • OWASP ZAP
    • SQLMap
  3. 代码编辑器

    • Notepad++
    • Sublime Text
    • VS Code

通过本教学的系统学习,您将掌握基础的代码审计思路和方法,能够独立发现常见Web漏洞。实际审计中需结合多种方法,持续积累经验。

代码审计实战教学:从入门到精通 前言 本教学文档基于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 : 验证漏洞 : 使用SQLMap成功验证注入点 关键代码片段 : 三、XSS漏洞审计 3.1 XSS漏洞类型与位置 存储型XSS : 文章发表 评论回复 用户资料设置 反射型XSS : 搜索功能 URL参数 DOM型XSS : 前端JavaScript处理用户输入 3.2 BlueCMS存储型XSS实例 漏洞位置 :用户注册功能(邮箱字段) 审计步骤 : 定位数据存储点 :搜索 INSERT INTO 语句 识别可控参数 :邮箱字段无前端格式验证 检查过滤机制 :未使用 htmlspecialchars 过滤 构造Payload : 绕过前端验证 :直接修改POST请求 关键代码片段 : 四、CSRF漏洞审计 4.1 CSRF防护机制 Token验证 : 服务端生成唯一Token 每次请求验证Token有效性 Referer检查 : 验证请求来源域名 4.2 CSRF审计方法 黑盒测试 : 删除Referer头测试请求是否通过 检查是否存在Token参数 白盒审计 : 搜索 token 相关代码 检查关键操作是否有防护 典型Token生成代码 : 五、文件操作漏洞审计 5.1 文件包含漏洞 常见函数 : include include_once require require_once 审计要点 : 查找包含函数 检查包含路径是否可控 验证过滤和截断可能性 5.2 BlueCMS文件包含实例 漏洞位置 :支付功能( pay 参数) 利用方法 : 构造包含路径: 使用点号截断: Windows: 256个点 Linux: 2038个点 Payload : 六、总结与防御建议 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漏洞。实际审计中需结合多种方法,持续积累经验。