php代码审计学习笔记-xhcms
字数 1732 2025-08-10 12:18:01

PHP代码审计学习笔记 - xhcms漏洞分析

环境搭建

  1. 使用小皮面板或phpstudy搭建环境
  2. PHPStorm配置Xdebug,设置为127.0.0.1
  3. 访问127.0.0.1会自动跳转到127.0.0.1/install
  4. 手动创建xhcms数据库(可使用Navicat)

漏洞审计流程

1. XSS漏洞审计

审计方法:

  • 使用Seay工具搜索echo语句
  • 优先查找非后台目录(非/admin)的echo点

审计实例:

  1. 定位到$nav变量,全局追踪其来源
  2. 发现$nav来自$resul,而$resulmysql_query的结果
  3. 查询语句是写死的,因此该点无漏洞
  4. 检查另一个echo点,受$pages$info影响
    • $info同样受$resul影响,无漏洞
    • $pages来自$_GET['page'],经过addslashes()处理

漏洞验证:

  • addslashes()无法有效拦截XSS payload
  • 构造payload:http://127.0.0.1/index.php?r=contact&page=1aaa<script>alert(1)<script>
  • 注意:alert("")中的引号会被转义

2. 文件包含漏洞审计

审计方法:

  • 搜索危险函数:includeinclude_oncerequirerequire_once

审计发现:

  • 存在自动添加.php后缀的限制
  • files目录下发现test.php文件

漏洞利用尝试:

  1. 直接访问:127.0.0.1/?r=test
  2. test.php改为test.txt
  3. 尝试路径遍历:http://127.0.0.1/?r=../test.txt(失败,因自动添加.php)
  4. 截断绕过:
    • Windows:截断字符>256
    • Linux:截断字符>4096
    • Payload:http://127.0.0.1/xhcms/?r=test.txt.(需PHP版本<5.3.29)

环境要求:

  • 需使用PHP 5.2版本(可使用phpstudy搭建)

代码架构分析

入口文件index.php分析:

<?php
// 单一入口模式
error_reporting(0); // 关闭错误显示
$file=addslashes($_GET['r']); // 接收文件名
$action=$file==''?'index':$file; // 判断为空或者等于index
include('files/'.$action.'.php'); // 载入相应文件
?>
  1. error_reporting(0):关闭所有错误报告
  2. $file=addslashes($_GET['r']):获取URL参数并转义
  3. 三元运算符:$action=$file==''?'index':$file
  4. include('files/'.$action.'.php'):动态包含文件(自动添加.php后缀)

漏洞复现步骤

XSS漏洞复现

  1. 访问:http://127.0.0.1/index.php?r=contact
  2. 检查页面参数:http://127.0.0.1/index.php?r=contact&page=1
  3. 测试参数:http://127.0.0.1/index.php?r=contact&page=1aaa
  4. 构造XSS payload:http://127.0.0.1/index.php?r=contact&page=1aaa<script>alert(1)<script>

文件包含漏洞复现

  1. 准备测试文件test.txt放在网站根目录的上两级目录
  2. 构造payload:http://127.0.0.1/xhcms/?r=test.txt.
  3. 注意PHP版本必须<5.3.29

关键知识点总结

  1. XSS审计要点

    • 追踪用户输入到输出的完整路径
    • 注意addslashes()对XSS的有限防护
    • 优先审计非后台功能点
  2. 文件包含审计要点

    • 注意自动添加后缀的限制
    • 截断技术是常见绕过方法
    • 不同系统/版本的截断长度要求不同
  3. MVC架构审计

    • 不能直接通过文件路径访问
    • 必须遵循框架的路由规则
    • 理解单一入口模式的工作原理
  4. 环境要求

    • 某些漏洞利用对PHP版本有特定要求
    • 需准备多版本PHP环境进行测试

后记

本次审计虽然相对简单,但涵盖了XSS和文件包含两种常见漏洞类型,并涉及了MVC架构的审计方法。通过实际动手操作可以加深对漏洞原理和审计技巧的理解。

PHP代码审计学习笔记 - xhcms漏洞分析 环境搭建 使用小皮面板或phpstudy搭建环境 PHPStorm配置Xdebug,设置为127.0.0.1 访问127.0.0.1会自动跳转到127.0.0.1/install 手动创建xhcms数据库(可使用Navicat) 漏洞审计流程 1. XSS漏洞审计 审计方法: 使用Seay工具搜索 echo 语句 优先查找非后台目录(非/admin)的echo点 审计实例: 定位到 $nav 变量,全局追踪其来源 发现 $nav 来自 $resul ,而 $resul 是 mysql_query 的结果 查询语句是写死的,因此该点无漏洞 检查另一个echo点,受 $pages 和 $info 影响 $info 同样受 $resul 影响,无漏洞 $pages 来自 $_GET['page'] ,经过 addslashes() 处理 漏洞验证: addslashes() 无法有效拦截XSS payload 构造payload: http://127.0.0.1/index.php?r=contact&page=1aaa<script>alert(1)<script> 注意: alert("") 中的引号会被转义 2. 文件包含漏洞审计 审计方法: 搜索危险函数: include 、 include_once 、 require 、 require_once 审计发现: 存在自动添加 .php 后缀的限制 在 files 目录下发现 test.php 文件 漏洞利用尝试: 直接访问: 127.0.0.1/?r=test 将 test.php 改为 test.txt 尝试路径遍历: http://127.0.0.1/?r=../test.txt (失败,因自动添加.php) 截断绕过: Windows:截断字符>256 Linux:截断字符>4096 Payload: http://127.0.0.1/xhcms/?r=test.txt. (需PHP版本 <5.3.29) 环境要求: 需使用PHP 5.2版本(可使用phpstudy搭建) 代码架构分析 入口文件index.php分析: error_reporting(0) :关闭所有错误报告 $file=addslashes($_GET['r']) :获取URL参数并转义 三元运算符: $action=$file==''?'index':$file include('files/'.$action.'.php') :动态包含文件(自动添加.php后缀) 漏洞复现步骤 XSS漏洞复现 访问: http://127.0.0.1/index.php?r=contact 检查页面参数: http://127.0.0.1/index.php?r=contact&page=1 测试参数: http://127.0.0.1/index.php?r=contact&page=1aaa 构造XSS payload: http://127.0.0.1/index.php?r=contact&page=1aaa<script>alert(1)<script> 文件包含漏洞复现 准备测试文件 test.txt 放在网站根目录的上两级目录 构造payload: http://127.0.0.1/xhcms/?r=test.txt. 注意PHP版本必须 <5.3.29 关键知识点总结 XSS审计要点 : 追踪用户输入到输出的完整路径 注意 addslashes() 对XSS的有限防护 优先审计非后台功能点 文件包含审计要点 : 注意自动添加后缀的限制 截断技术是常见绕过方法 不同系统/版本的截断长度要求不同 MVC架构审计 : 不能直接通过文件路径访问 必须遵循框架的路由规则 理解单一入口模式的工作原理 环境要求 : 某些漏洞利用对PHP版本有特定要求 需准备多版本PHP环境进行测试 后记 本次审计虽然相对简单,但涵盖了XSS和文件包含两种常见漏洞类型,并涉及了MVC架构的审计方法。通过实际动手操作可以加深对漏洞原理和审计技巧的理解。