php代码审计学习笔记-xhcms
字数 1732 2025-08-10 12:18:01
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分析:
<?php
// 单一入口模式
error_reporting(0); // 关闭错误显示
$file=addslashes($_GET['r']); // 接收文件名
$action=$file==''?'index':$file; // 判断为空或者等于index
include('files/'.$action.'.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架构的审计方法。通过实际动手操作可以加深对漏洞原理和审计技巧的理解。