PHP代码审计之旅
字数 1463 2025-08-19 12:40:57

PHP代码审计入门教程:BlueCMS 1.6审计实战

前言

代码审计是Web安全领域的重要技能,本教程将通过BlueCMS 1.6的审计过程,详细介绍PHP代码审计的基本方法和流程。教程将涵盖白盒测试、黑盒测试和灰盒测试的概念,以及实际的漏洞挖掘和分析技术。

测试类型基础

白盒测试

  • 已知产品的内部工作过程
  • 测试证明每种内部操作是否符合设计规格要求
  • 检查所有内部成分是否经过验证

黑盒测试

  • 已知产品的功能设计规格
  • 测试证明每个实现了的功能是否符合要求

灰盒测试

  • 白盒和黑盒测试的混合
  • 既会做黑盒测试又会做白盒测试

白盒测试流程:BlueCMS 1.6审计

0x00: 了解目录结构

├── admin     后台管理目录
├── install   网站的安装目录
├── api       接口文件目录
├── data     系统处理数据相关目录
├── include  用来包含的全局文件
└── template  模板

审计技巧:

  1. 函数集文件:通常命名中包含functions或common等关键字
  2. 配置文件:通常命名中包含config关键字

0x01: 从首页获取信息

从index.php入手,了解程序架构、运行流程和包含的文件:

  1. 引入common.inc.php和user.php
  2. common.inc.php中addslashes()函数对全局数组(POST, GET, COOKIES, REQUEST)进行转义处理
  3. 包含防护功能如ban IP

0x02: 挖掘漏洞

跟踪输入变量

SQL注入漏洞发现:

  1. ad_js.php中:
$ad_id = !empty($_GET['ad_id']) ? trim($_GET['ad_id']) : '';
$ad = $db->getone("SELECT * FROM ".table('ad')." WHERE ad_id =".$ad_id);
  • 参数可控且无引号包裹
  • 存在SQL注入漏洞

利用工具辅助审计

使用Seay源代码审计系统等工具辅助发现潜在漏洞。

危险函数列表

漏洞类型 相关危险函数
命令执行 system, shell_exec, passthru, popen, proc_open
文件包含 require, include, require_once, include_once
变量覆盖 parse_str, mb_parse_str
代码执行 eval, assert, preg_replace
文件操作 file_get_contents, file_put_contents, move_uploaded_file, unlink, delete

文件删除漏洞发现:

if(!empty($_POST['lit_pic']) && file_exists(BLUE_ROOT.$_POST['lit_pic']))
{
    @unlink(BLUE_ROOT.$_POST['lit_pic']);
}
  • lit_pic参数可控
  • 可导致任意文件删除

0x03: 漏洞分析

SQL注入漏洞利用

ad_js.php中的UNION查询注入:

  1. 漏洞代码:
$ad = $db->getone("SELECT * FROM ".table('ad')." WHERE ad_id =".$ad_id);
echo "<!--\r\ndocument.write(\"".$ad_content."\");\r\n-->\r\n";
  1. 利用步骤:
  • 使用order by确定列数
  • 构造UNION查询获取数据
  • 通过回显位(如第7列)获取信息

任意文件删除漏洞

user.php中的漏洞:

  1. 漏洞代码:
if(!empty($_POST['lit_pic']) && file_exists(BLUE_ROOT.$_POST['lit_pic']))
{
    @unlink(BLUE_ROOT.$_POST['lit_pic']);
}
  1. 利用方法:
  • 构造POST请求包含lit_pic参数
  • 参数值为要删除的文件路径(相对路径)

反射型XSS漏洞

guest_book.php中的漏洞:

  1. 漏洞代码:
$page_id = $_POST['page_id'];
showmsg($page_id);
  1. 利用方法:
"><script>alert(/xss/)</script>
  • 需要闭合前面的input标签

总结

  1. 代码审计的基本流程:

    • 了解目录结构
    • 从入口文件(index.php)开始分析
    • 跟踪用户输入
    • 查找危险函数调用
  2. 关键点:

    • 关注用户可控的输入点
    • 注意参数是否被正确过滤
    • 结合手工审计和工具辅助
    • 注意工具可能遗漏的漏洞(如反射型XSS)
  3. BlueCMS 1.6中发现的主要漏洞:

    • SQL注入(ad_js.php)
    • 任意文件删除(user.php)
    • 反射型XSS(guest_book.php)

通过本教程,您应该已经掌握了基本的PHP代码审计方法和流程。实际审计中,需要结合具体代码和环境进行灵活分析。

PHP代码审计入门教程:BlueCMS 1.6审计实战 前言 代码审计是Web安全领域的重要技能,本教程将通过BlueCMS 1.6的审计过程,详细介绍PHP代码审计的基本方法和流程。教程将涵盖白盒测试、黑盒测试和灰盒测试的概念,以及实际的漏洞挖掘和分析技术。 测试类型基础 白盒测试 已知产品的内部工作过程 测试证明每种内部操作是否符合设计规格要求 检查所有内部成分是否经过验证 黑盒测试 已知产品的功能设计规格 测试证明每个实现了的功能是否符合要求 灰盒测试 白盒和黑盒测试的混合 既会做黑盒测试又会做白盒测试 白盒测试流程:BlueCMS 1.6审计 0x00: 了解目录结构 审计技巧: 函数集文件:通常命名中包含functions或common等关键字 配置文件:通常命名中包含config关键字 0x01: 从首页获取信息 从index.php入手,了解程序架构、运行流程和包含的文件: 引入common.inc.php和user.php common.inc.php中addslashes()函数对全局数组(POST, GET, COOKIES, REQUEST)进行转义处理 包含防护功能如ban IP 0x02: 挖掘漏洞 跟踪输入变量 SQL注入漏洞发现: ad_ js.php中: 参数可控且无引号包裹 存在SQL注入漏洞 利用工具辅助审计 使用Seay源代码审计系统等工具辅助发现潜在漏洞。 危险函数列表 | 漏洞类型 | 相关危险函数 | |---------|------------| | 命令执行 | system, shell_ exec, passthru, popen, proc_ open | | 文件包含 | require, include, require_ once, include_ once | | 变量覆盖 | parse_ str, mb_ parse_ str | | 代码执行 | eval, assert, preg_ replace | | 文件操作 | file_ get_ contents, file_ put_ contents, move_ uploaded_ file, unlink, delete | 文件删除漏洞发现: lit_ pic参数可控 可导致任意文件删除 0x03: 漏洞分析 SQL注入漏洞利用 ad_ js.php中的UNION查询注入: 漏洞代码: 利用步骤: 使用order by确定列数 构造UNION查询获取数据 通过回显位(如第7列)获取信息 任意文件删除漏洞 user.php中的漏洞: 漏洞代码: 利用方法: 构造POST请求包含lit_ pic参数 参数值为要删除的文件路径(相对路径) 反射型XSS漏洞 guest_ book.php中的漏洞: 漏洞代码: 利用方法: 需要闭合前面的input标签 总结 代码审计的基本流程: 了解目录结构 从入口文件(index.php)开始分析 跟踪用户输入 查找危险函数调用 关键点: 关注用户可控的输入点 注意参数是否被正确过滤 结合手工审计和工具辅助 注意工具可能遗漏的漏洞(如反射型XSS) BlueCMS 1.6中发现的主要漏洞: SQL注入(ad_ js.php) 任意文件删除(user.php) 反射型XSS(guest_ book.php) 通过本教程,您应该已经掌握了基本的PHP代码审计方法和流程。实际审计中,需要结合具体代码和环境进行灵活分析。