PHP代码审计-某CMS漏洞合集
字数 1491 2025-08-29 08:32:24

PHP代码审计教学:某CMS漏洞分析与利用

0x00 前言

本教学文档基于某CMS的代码审计实践,适合代码审计初学者学习。该CMS代码结构简单,漏洞成因经典,是学习PHP代码审计的优秀案例。

0x01 前台SQL注入漏洞分析

漏洞位置

/semcms/Templete/default/Include/index.php -> web_inc.php

漏洞成因

  1. 包含文件流程:

    • db_conn.php:建立数据库连接
    • contorl.php:对$_GET进行全局过滤危险SQL函数
  2. 关键漏洞代码:

$Language = test_input(verify_str($_POST["languageID"]));
// 直接拼接进SQL语句,无引号包裹
  1. 过滤绕过:
  • verify_str函数过滤了select等关键词
  • test_input函数中的stripslashes可去除反斜杠
  • 通过反斜杠转义绕过过滤:uni\on sel\ect

利用Payload

languageID=-1 uni\on sel\ect 1,concat(user_admin,0x2d,user_ps),3,4,5,6,7,8,9,10,11,12,13,14 from sc_user un\ion

回显位置

注入结果存储在$tag_indexmetatit变量中,最终通过echo输出到页面。

0x02 后台地址寻找尝试

后台地址生成

semcms/install/index.php中随机生成后台地址:

$ht_filename = substr(md5(time().rand(1000,9999)),8,6);

寻找失败原因

  1. 全局搜索$ht_filename变量无引用代码
  2. 尝试通过目录遍历漏洞寻找但未成功

0x03 GetShell思路分析

危险函数定位方法

  1. 文件包含函数:require, include, require_once, include_once
  2. 文件操作函数:file_get_contents, file_put_contents, copy, unlink
  3. 代码注入函数:eval, assert, preg_replace
  4. 命令执行函数:exec, system, shell_exec
  5. 变量覆盖函数:extract, parse_str

后台GetShell漏洞分析

漏洞位置

file_put_contents函数写入文件操作

关键代码

function Mbapp($mb,$lujin,$mblujin,$dirpaths,$htmlopen){
    $template="index.php,hta/".$ml."/.htaccess";
    $template_mb=explode(",",$template);
    for($i=0;$i<count($template_mb);$i++){
        $template_o = file_get_contents($mblujin.'Templete/'.$mb.'/Include/'.$template_mb[$i]);
        $templateUrl = $lujin.str_replace("hta/".$ml."/","",$template_mb[$i]);
        $output = str_replace('<{Template}>', $mb, $template_o);
        file_put_contents($templateUrl, $output);
    }
}

两种利用方式

  1. 修改index.php

    • 尝试写入PHP代码
    • verify_str过滤了单引号,利用失败
  2. 修改.htaccess

    • 可写入Apache配置
    • Payload: /semcms/N8D3ch_Admin/SEMCMS_Template.php?CF=template&mb=default/%0aSetHandler%20application/x-httpd-php%0a%23/../..
    • 效果:使上传文件被当作PHP解析
    • 限制:需Apache module模式且Linux环境

0x04 任意文件删除漏洞

漏洞位置

后台图片删除功能

漏洞成因

  1. 文件路径入库时仅经过test_input,未过滤..
  2. 删除时直接从数据库读取路径,无二次过滤
  3. 关键函数Delfile直接使用unlink删除文件

利用步骤

  1. 上传图片时设置路径为../rmme.txt
  2. 删除该图片时,实际删除网站根目录下的rmme.txt

0x05 总结

漏洞链

  1. 前台无限制SQL注入 → 获取管理员账号密码
  2. 后台地址随机生成 → 难以直接访问
  3. 后台文件操作漏洞 → 可能的GetShell途径
  4. 任意文件删除 → 破坏性操作

学习要点

  1. 输入过滤不严导致的SQL注入
  2. 反斜杠转义绕过过滤的技巧
  3. 文件操作函数的安全风险
  4. 二次漏洞的利用方式
  5. 代码审计中危险函数的定位方法

防御建议

  1. 所有用户输入必须严格过滤
  2. 数据库查询使用参数化查询
  3. 文件操作限制路径范围
  4. 敏感操作增加二次验证
  5. 避免直接拼接用户输入到SQL语句中
PHP代码审计教学:某CMS漏洞分析与利用 0x00 前言 本教学文档基于某CMS的代码审计实践,适合代码审计初学者学习。该CMS代码结构简单,漏洞成因经典,是学习PHP代码审计的优秀案例。 0x01 前台SQL注入漏洞分析 漏洞位置 /semcms/Templete/default/Include/index.php -> web_inc.php 漏洞成因 包含文件流程: db_conn.php :建立数据库连接 contorl.php :对 $_GET 进行全局过滤危险SQL函数 关键漏洞代码: 过滤绕过: verify_str 函数过滤了 select 等关键词 test_input 函数中的 stripslashes 可去除反斜杠 通过反斜杠转义绕过过滤: uni\on sel\ect 利用Payload 回显位置 注入结果存储在 $tag_indexmetatit 变量中,最终通过 echo 输出到页面。 0x02 后台地址寻找尝试 后台地址生成 semcms/install/index.php 中随机生成后台地址: 寻找失败原因 全局搜索 $ht_filename 变量无引用代码 尝试通过目录遍历漏洞寻找但未成功 0x03 GetShell思路分析 危险函数定位方法 文件包含函数: require , include , require_once , include_once 文件操作函数: file_get_contents , file_put_contents , copy , unlink 等 代码注入函数: eval , assert , preg_replace 命令执行函数: exec , system , shell_exec 等 变量覆盖函数: extract , parse_str 后台GetShell漏洞分析 漏洞位置 file_put_contents 函数写入文件操作 关键代码 两种利用方式 修改index.php : 尝试写入PHP代码 但 verify_str 过滤了单引号,利用失败 修改.htaccess : 可写入Apache配置 Payload: /semcms/N8D3ch_Admin/SEMCMS_Template.php?CF=template&mb=default/%0aSetHandler%20application/x-httpd-php%0a%23/../.. 效果:使上传文件被当作PHP解析 限制:需Apache module模式且Linux环境 0x04 任意文件删除漏洞 漏洞位置 后台图片删除功能 漏洞成因 文件路径入库时仅经过 test_input ,未过滤 .. 删除时直接从数据库读取路径,无二次过滤 关键函数 Delfile 直接使用 unlink 删除文件 利用步骤 上传图片时设置路径为 ../rmme.txt 删除该图片时,实际删除网站根目录下的 rmme.txt 0x05 总结 漏洞链 前台无限制SQL注入 → 获取管理员账号密码 后台地址随机生成 → 难以直接访问 后台文件操作漏洞 → 可能的GetShell途径 任意文件删除 → 破坏性操作 学习要点 输入过滤不严导致的SQL注入 反斜杠转义绕过过滤的技巧 文件操作函数的安全风险 二次漏洞的利用方式 代码审计中危险函数的定位方法 防御建议 所有用户输入必须严格过滤 数据库查询使用参数化查询 文件操作限制路径范围 敏感操作增加二次验证 避免直接拼接用户输入到SQL语句中