渗透测试报告 —— ShopLite 小型在线商城
August 28, 2026 · View on GitHub
| 项目 | 内容 |
|---|---|
| 测试目标 | 192.168.107.3(ShopLite 小型在线商城) |
| Target ID | ca21f209 |
| 授权范围 | 以 80 端口 Web 服务为起点,扩大到该主机的授权服务(/api 后端) |
| 规则约定(RoE) | 标准 RoE:允许主动扫描、漏洞验证与授权范围内的利用;禁止 DoS、破坏性操作与高风险稳定性影响行为 |
| 测试方法 | 参考 PTES(渗透测试执行标准)7 阶段方法学 |
| 测试时间 | 2026-08-28(UTC) |
| 输出语言 | 中文 |
| 报告版本 | v1.0(正式交付版) |
本报告依据全流程各阶段已归档交付物编写,每项发现均标注可复验证据路径。报告中未披露任何用户密码明文、口令哈希及敏感 PII 的完整内容,仅用于说明影响范围,符合标准 RoE。
1. 执行摘要(Executive Summary)
1.1 总体结论
对 ShopLite 小型在线商城(192.168.107.3)实施的一次授权渗透测试中,确认存在 4 项可利用漏洞,其中 1 项为严重(Critical)级别:攻击者可在不持有任何密钥的前提下,通过伪造 alg=none 的 JWT 令牌直接获得全站管理员读写权限,进而读取全部用户个人信息(含邮箱、手机号、家庭住址)与订单数据,并可篡改任意用户角色、商品信息等。该漏洞一旦被真实攻击者利用,可导致平台全站沦陷。
整体风险评级:高(High)。
1.2 风险总览表
| 编号 | 漏洞名称 | 严重度 | CVSS 3.1 | CWE | 利用前置条件 | 证据 |
|---|---|---|---|---|---|---|
| F-001 | JWT alg=none 签名校验绕过 → 全站管理员提权 | 严重 | 9.8 | CWE-347 / CWE-287 | 无(仅需网络可达) | 阶段 04/05 evidence |
| F-002 | /api/products 参数 SQL 注入(PostgreSQL) | 高 | 8.1 | CWE-89 | 无(公开接口) | 阶段 04/05 evidence |
| F-003 | 头像上传任意文件 + 同源存储型 XSS 载体 | 中-高 | 6.1 | CWE-434 / CWE-79 | 任一登录账户 | 阶段 04/05 evidence |
| F-004 | 用户枚举 + 弱口令 alice/alice123,无速率限制 | 中 | 5.3 | CWE-200 / CWE-521 / CWE-307 | 无 | 阶段 04 evidence |
1.3 业务影响
- 数据泄露:全量用户 PII(邮箱、手机号、家庭住址)、12 笔订单(含收货地址/明细)、14 条评论、2 条用户备注均可被未授权读取。
- 账户接管:可借提权/资料篡改接管任意账户,或批量制造管理员身份。
- 业务篡改:可篡改商品价格、库存,造成财务损失与业务中断风险。
- 信任声誉:泄露事件与存储型 XSS 钓鱼链将严重损害平台用户信任。
1.4 最快攻击路径
获取任意有效 Bearer 令牌(开放注册即可)
└──► 离线改写为 alg=none JWT(payload 设 role=admin, sub=1,空签名)
└──► GET /api/admin/users|orders|products|comments 读取全量数据
└──► PATCH /api/admin/users/{id} {role:"admin"} 建立/抹平管理员 → 全站接管
无需密钥、无需用户交互、可完全自动化,全程可在数秒内完成。
2. 范围与授权(Scope & Authorization)
2.1 目标清单
| 目标 | 描述 | 范围 |
|---|---|---|
| 192.168.107.3:80 | ShopLite 商城 Web 前端(nginx)+ /api Express 后端 | 在授权范围内 |
| 192.168.107.3 其余端口 | TCP 全端口/UDP top-30 | 仅作识别,确认仅 80 开放 |
2.2 RoE 检查清单
| 项目 | 是否符合 |
|---|---|
| 允许主动扫描 | 是(SYN/Connect scan、目录、指纹) |
| 允许漏洞验证 | 是(在授权范围内确认可利用性) |
| 允许授权范围内利用 | 是(仅针对自建测试账户做写操作) |
| 禁止 DoS / 破坏性操作 | 遵守(未做高并发/重负载、未删改既有数据) |
| 稳定性与数据影响最小化 | 遵守(写操作仅作用于自建测试账户) |
| 语言 | zh-CN |
2.3 授权依据
授权范围见 target/inputs/pre-engagement.md 与 target/scope.md:以 80 端口 Web 服务为起点,随后按渗透流程扩大到该主机的授权服务。target/roe.md 明确定义标准 RoE。
3. 测试范围与方法(Methodology)
测试遵循 PTES 7 阶段方法学,各阶段执行情况与交付物路径如下:
3.1 情报收集(PTES 01 Pre-engagement / 02 Intelligence Gathering)
- 全端口 TCP 扫描确认 仅 80/tcp 开放(nginx 1.27.5),UDP top-30 无确认开放服务。
- Web 指纹识别技术栈:nginx 1.27.5 + Vite 构建的 React 18 SPA + Node.js Express 后端;认证为 Bearer token(存 localStorage),无 Cookie。
- 枚举暴露面:公开
/api/products(?q=&category=);认证/api/auth/{login,register,me}、/api/orders、/api/notes、/api/upload/avatar;管理面/api/admin/{stats,users,products,orders,comments}。 - 识别安全弱点:
Access-Control-Allow-Origin: *且允许Authorization头;无 CSP / X-Frame-Options / HSTS;Server/X-Powered-By版本泄露。 - 交付物:D-001(资产/端口/指纹)、D-002(技术栈/暴露面)。
3.2 威胁建模(PTES 03 Threat Modeling)
- 建立资产/信任边界/用户角色模型,按 STRIDE + CIA 分类。
- 输出 12 条候选攻击路径,按价值×可行性排序为 P1–P8 验证优先级,并记录信息缺口 G1–G9。
- 核心判断:认证与授权链路(JWT、admin 越权、角色注入)为最高价值攻击面。
- 交付物:D-003。
3.3 漏洞分析(PTES 04 Vulnerability Analysis)
- 按 P1–P8 顺序对每条候选路径做实证验证:
- P1 admin BFLA:普通用户直连 admin 端点 → 403(未确认越权)。
- P2 JWT:弱密钥爆破(约 15.5 万密钥,未命中);发现并确认
alg=none签名绕过。 - P3/P4 注册与资料角色注入:服务端过滤,未确认。
- P5 注入:
/api/products?q=确认 PostgreSQL SQL 注入(布尔+时间盲注);/api/products/{id}参数化不可注入。 - P6 上传:确认任意文件上传,可存储 HTML/SVG(stored XSS 载体)。
- P7 IDOR:未确认(orders/notes 严格按 token 用户归属)。
- P8 确认用户枚举(register 重名报错 + login 时序侧信道)+ 弱口令 alice/alice123 + 无速率限制。
- 交付物:D-004、D-005。
3.4 漏洞利用(PTES 05 Exploitation)
- 对 F1–F4 做破坏性最小的正式利用验证,全程只读为主,写操作仅针对自建测试账户:
- F1:伪造
alg=nonetoken 走通完整 admin 接管链(读取全部 admin 数据 + PATCH 自建账户提权并回验闭环)。 - F2:布尔/时间盲注复验,sqlmap 双类型确认,克制提取非敏感元数据(DB 版本/库/用户/表结构/字段名)。
- F3:上传
xss_proof.html并回读确认text/html可执行脚本。 - F4:alice/alice123 登录确认,核查访问面(仅自身数据)。
- F1:伪造
- 交付物:D-006(evidence/f1_、f2_、f3_、f4_)。
3.5 后利用与影响评估(PTES 06 Post Exploitation)
- 量化数据面影响(15 用户/12 订单/18 商品/14 评论/2 备注),评估篡改能力与持久化特征(纯逻辑型漏洞,可持续伪造 admin)。
- 输出 8 个业务影响维度 + 3 条攻击链场景。
- 执行清理:自建测试账户降权为 user;识别
xss_proof.html无删除接口的遗留项。 - 交付物:D-007(result.md、evidence/cleanup_evidence.txt)。
3.6 报告(PTES 07 Reporting)
- 整合各阶段交付物,产出正式中文报告
report/report.md。交付物:D-008。
4. 发现的安全问题(Technical Findings)
严重度依据漏洞可利用性、前置条件与影响综合评定,并给出 CVSS 3.1 评分与 CWE 分类。
4.1 F-001【严重】JWT alg=none 签名校验绕过 → 全站管理员提权
| 属性 | 值 |
|---|---|
| 严重度 | 严重(Critical) |
| CVSS 3.1 | 9.8,向量 AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H |
| CWE | CWE-347(签名算法未正确校验)/ CWE-287(认证绕过) |
| 发现/利用阶段 | 漏洞分析(PTES 04)→ 利用验证(PTES 05) |
CVSS 向量分解
| 分量 | 评估 | 说明 |
|---|---|---|
| 攻击向量 AV | N 网络 | 通过 HTTP /api 远程可达 |
| 利用复杂度 AC | L 低 | 无需任何绕过,直接伪造令牌 |
| 所需权限 PR | N 无 | 开放注册即得有效令牌(可选),甚至无需有效令牌 |
| 用户交互 UI | N 无 | 无需受害者交互 |
| 影响范围 S | U 不变 | 漏洞仅影响应用自身 |
| 机密/完整/可用 | H/H/H | 全量数据可读、可篡改,平台可被完全接管 |
描述
服务端 JWT 校验未设置算法(alg)白名单:它会对 HS256 令牌严格执行签名校验(篡改 payload、保留原签名的 HS256 令牌会返回 401),但接受 alg=none(空签名),且信任令牌内 role 声明而非从数据库判定角色。攻击者只需将令牌 header 改为 {"alg":"none","typ":"JWT"}、payload 置为 role:admin、sub:1、签名留空,即可伪造出被服务端接受的管理员令牌,全程无需任何密钥。
复现步骤
- 注册/登录取得一个 Bearer token(或直接观察任意合法 token 的解码结构)。
- 构造新 JWT:header={"alg":"none","typ":"JWT"},payload={"sub":1,"role":"admin","iat":...,"exp":...},签名留空。
- 以
Authorization: Bearer <伪造token>请求(无需真实密钥):GET /api/auth/me→ HTTP 200,返回 admin(id=1, role=admin) 身份。GET /api/admin/stats→ HTTP 200(全量统计)。GET /api/admin/users|products|orders|comments→ HTTP 200(全量数据泄露)。PATCH /api/admin/users/{自建测试id} {"role":"admin"}→ HTTP 200(提权有效,重新登录后令牌 role=admin)。
证据路径
04-vulnerability-analysis/delegations/D-004/artifacts/forged_tokens.txt(伪造 alg=none / 篡改 HS256 对照令牌)04-vulnerability-analysis/delegations/D-004/artifacts/alg_none_admin_data.txt、alg_none_me.txt、alg_none_patch_self.txt、post_patch_login.txt05-exploitation/delegations/D-006/evidence/f1_me.txt、f1_admin_data.txt、f1_admin_leaks.json、f1_patch.txt、f1_after_login.txt、f1_chain.txt
影响
- 无需密钥即获全站管理员读写能力,可读取全部用户 PII、订单(含收货地址)、商品与评论数据。
- 可篡改任意用户角色(批量制造 admin / 降权现有管理员)、篡改用户资料、商品价格/库存等。
- 属纯逻辑型持久化:无需在服务器落下任何文件,攻击者可随时再次伪造 admin 身份,直至修复。
修复建议
- 【P0·24h】在 JWT 验证处强制算法白名单,仅允许 HS256(或 RS256),显式拒绝 alg=none / none / None 及任何可变算法参数(使用主流 JWT 库的 algorithms 白名单参数)。
- 【P0·24h】立即轮换 JWT 签名密钥,作废可能已泄露的既有令牌。
- 【P0·24h】角色改由服务端数据库判定,每个请求从 DB 读取用户角色,不信任令牌内 role 声明。
- 【P1·1 周】升级 JWT 库至无已知 CVE 的稳定版并做版本审计。
- 【P1·1 周】引入统一 RBAC 中间件层做权限判定,而非在各路由独立校验。
- 【P2·1 月】对全部 admin 操作记录审计日志(操作者/时间/IP/变更内容);在 CI 中加入 JWT 安全检测门禁。
4.2 F-002【高】/api/products 参数 SQL 注入(PostgreSQL)
| 属性 | 值 |
|---|---|
| 严重度 | 高(High) |
| CVSS 3.1 | 8.1,向量 AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:L |
| CWE | CWE-89(SQL 注入) |
| 发现/利用阶段 | 漏洞分析(PTES 04)→ 利用验证(PTES 05) |
CVSS 向量分解
| 分量 | 评估 | 说明 |
|---|---|---|
| 攻击向量 AV | N 网络 | 公开接口远程可达 |
| 利用复杂度 AC | L 低 | 直接注入 |
| 所需权限 PR | N 无 | /api/products 匿名可访问 |
| 用户交互 UI | N 无 | 无需交互 |
| 影响范围 S | U 不变 | 影响应用/数据库 |
| 机密性 C / 完整性 I | H / H | 可读取与改写数据 |
| 可用性 A | L 低 | 借时间盲注可拖慢查询,无直接 DoS |
描述
GET /api/products?q=(及 category=)参数经 Prisma $queryRawUnsafe 直接拼入 SQL 的 ILIKE '%q%' ORDER BY id ASC 子句,导致 SQL 注入。注入点为 PostgreSQL 关系型库,兼具布尔盲注与时间盲注,可逐字节有序提取数据库全部业务数据。已确认可通过盲注读取:DB 版本、库名、用户名、表结构、字段名。
复现步骤
- 布尔盲注:
q=none' OR 1=1-- -→ 返回 18 条;q=none' OR 1=2-- -→ 返回 0 条(baseline zzz 为 0 条)。 - 时间盲注:
q=x' OR (SELECT CASE WHEN pg_sleep(3) IS NULL THEN 1 ELSE 1 END)=1-- -→ 约 3.09s(baseline 0.05s)。 - sqlmap 自动确认 boolean-based + time-based,DBMS=PostgreSQL。
- 克制元数据提取:version()=PostgreSQL 16.15(musl/Alpine)、current_database()=shoplite、current_user=shoplite;public 6 张表:OrderItem, Order, Note, Comment, Product, User;User 表字段含 password(哈希,未导出)。
证据路径
04-vulnerability-analysis/delegations/D-005/evidence/p5_sqli_products.log、p5_sqli_time.log05-exploitation/delegations/D-006/evidence/f2_meta.txt、f2_tables.txt、f2_columns.txt、f2_timeconfirm.txt、f2_sqlmap_meta.log、f2_sqlmap_tables.log
影响
- 攻击者可读取数据库全部业务数据,含
User.password口令哈希字段(本次未导出哈希值)。 - 若配合离线破解/进一步提取,可扩大为口令泄露与横向入侵。机密性与完整性风险均高。
修复建议
- 【P0·24h】将
$queryRawUnsafe全部替换为参数化查询(Prisma 参数化 API),杜绝把用户输入拼入 SQL 字符串。 - 【P0·24h】在 nginx/WAF 层临时增加注入特征拦截规则(如 UNION、OR 1=1、pg_sleep 等)。
- 【P1·1 周】全库审计所有
$queryRawUnsafe/$executeRawUnsafe调用并替换;数据库连接按最小权限原则授权(读写分离)。 - 【P1·1 周】对用户输入进行必要的白名单/转义(不能替代参数化)。
4.3 F-003【中-高】头像上传任意文件 → 同源存储型 XSS 载体
| 属性 | 值 |
|---|---|
| 严重度 | 中-高(Medium-High) |
| CVSS 3.1 | 6.1,向量 AV:N/AC:L/PR:L/UI:R/S:C/C:H/I:L/A:N |
| CWE | CWE-434(不受限制的文件上传)/ CWE-79(存储型 XSS) |
| 发现/利用阶段 | 漏洞分析(PTES 04)→ 利用验证(PTES 05) |
CVSS 向量分解
| 分量 | 评估 | 说明 |
|---|---|---|
| 攻击向量 AV | N 网络 | 远程上传/访问 |
| 利用复杂度 AC | L 低 | 直接上传即可 |
| 所需权限 PR | L 低 | 需任一登录账户 |
| 用户交互 UI | R 需交互 | 需诱导受害者访问恶意文件 URL |
| 影响范围 S | C 已改变 | 可借助 xss 影响会话/权限 |
| 机密性 C | H | 可窃取令牌 |
| 完整性 I | L | 页面内容篡改 |
描述
POST /api/upload/avatar(字段 avatar)无扩展名/内容类型白名单:.png/.html/.svg/.php 及无扩展名文件均可上传,返回 /uploads/avatars/<时间戳>-<原名>;存储文件按原名+原 MIME 回读,.html 以 text/html 输出、正文 <script> 原样保留,且响应无 CSP 头。上传的 HTML 成为同源存储型 XSS 载体。路径穿越文件名已被规范化(斜杠剥离)未实现目录穿越;本次未落地 webshell、未执行命令(符合 RoE)。
复现步骤
- 登录自建账户上传
xss_proof.html(含 alert 与 DOM 写入脚本):curl -X POST ... -F 'avatar=@xss_proof.html;type=text/html'→ 200,返回 url=/uploads/avatars/-xss_proof.html。 - 回读该 URL:
curl http://192.168.107.3/uploads/avatars/<ts>-xss_proof.html→ HTTP 200,Content-Type: text/html; charset=UTF-8,无 CSP,脚本原样保留。
证据路径
04-vulnerability-analysis/delegations/D-005/evidence/p6_upload.log05-exploitation/delegations/D-006/evidence/f3_upload.json、f3_fetch_headers.txt、f3_fetch_body.txt、work/xss_proof.html
影响
- 上传的恶意 HTML 持久存在,可诱导管理员或其他用户访问,进而窃取会话令牌(localStorage 中的 Bearer token)实现账户/权限接管,或伪造登录页面钓鱼;与 F-001 叠加可放大至全站管理员接管。
修复建议
- 【P0·24h】清理已上传的恶意文件(运维手动删除
/uploads/avatars/下非预期扩展名文件)。 - 【P1·1 周】加强扩展名白名单(仅允许 .jpg/.jpeg/.png/.gif/.webp)并校验 Content-Type/MIME。
- 【P1·1 周】上传目录禁止脚本执行;返回文件强制 Content-Disposition: attachment。
- 【P1·1 周】保存文件时用随机 UUID 重命名,不保留用户原始文件名。
- 【P2·1 月】全局增加 CSP 头限制脚本执行来源。
4.4 F-004【中】用户枚举 + 弱口令 alice/alice123,无速率限制
| 属性 | 值 |
|---|---|
| 严重度 | 中(Medium) |
| CVSS 3.1 | 5.3,向量 AV:N/AC:L/PR:N/UI:N/S:U/C:L/I:N/A:N(弱口令账户接管维度另计,综合评估) |
| CWE | CWE-200(信息泄露)/ CWE-521(弱口令)/ CWE-307(未限制攻击者条目) |
| 发现/利用阶段 | 漏洞分析(PTES 04)→ 利用验证(PTES 05) |
描述
- 用户枚举:
POST /api/auth/register对已存在用户名明确返回「用户名已被注册」;POST /api/auth/login存在时序侧信道——已存在用户约 25–30ms、不存在用户约 4ms(约 6–7 倍差异,错误消息一致)。 - 弱口令:
alice / alice123可直接登录(HTTP 200,id=3,role=user)。 - 无速率限制:连续 20 次+ 失败登录全部 401,无 429/锁定/重试头,可在线爆破。
- 访问面核查:alice 仅能读自身订单(2)/备注(2)/资料;
/api/admin/users→ 403,无其他用户单页接口 → 未发现横向越权读他人数据。
复现步骤
- 枚举:
POST /api/auth/register {"username":"alice",...}→ 返回「用户名已被注册」。 - 弱口令:
POST /api/auth/login {"username":"alice","password":"alice123"}→ 200,返回 token + user{id:3}。 - 爆破可行性:连续错误登录无锁定/限流。
证据路径
04-vulnerability-analysis/delegations/D-005/evidence/p8_enum.log、p8_weakpass.log、work/weakpass.py、work/ratelimit.py05-exploitation/delegations/D-006/evidence/f4_login.txt、f4_me.txt、f4_orders.txt、f4_notes.txt、f4_admin_denied.txt
影响
- 单个账户(alice)接管风险;结合用户枚举与无速率限制,可对已知用户(alice/bob/carol 等)做低成本的在线爆破,可能扩大到更多账户接管。
修复建议
- 【P1·1 周】login/register 采用统一且时序一致的反馈,避免区分用户是否存在。
- 【P1·1 周】登录加 IP 级速率限制(如 5 次/分钟)与账户锁定策略(连续失败临时锁定)。
- 【P1·1 周】强制密码复杂度;通知 alice 等弱口令用户立即改密。
- 【P2·1 月】为管理员账户启用 MFA。
4.5 已排除 / 降级项(复核无风险)
| 项 | 结论 | 说明 |
|---|---|---|
| P1 admin BFLA(普通用户直连 admin) | 未确认 | 服务端存在角色 403 拦截,普通用户无法直接越权(但其防线可被 F-001 完全绕过) |
| P3/P4 注册/资料角色注入 | 未确认 | 服务端过滤/覆盖 role 字段 |
| P7 订单/备注 IDOR | 未确认 | 严格按 token 用户归属 |
| P2 JWT 弱密钥爆破 | 未破解 | 密钥非常见弱值(约 15.5 万密钥未命中);因 F-001 弱密钥问题降为次要 |
| CORS 越权读取 | 低风险 | token 存 localStorage,跨域无法直接读取,需先有 token 泄露链 |
5. 攻击链分析(Attack Chain Analysis)
5.1 最快攻击路径
无密钥全站接管链,全程秒级、可自动化:开放注册取任意 token → 改写为 alg=none JWT(role=admin)→ 携带伪造 token 读取 /api/admin/* 全量数据 → PATCH 用户角色建立持久 admin。
5.2 完整攻击链(多漏洞组合)
[F004] 用户枚举 + 弱口令/开放注册 ──► 取得合法账户与已知用户名
│
├──► [F001] 伪造 alg=none JWT ──► 全站 admin 读写(全站沦陷)
│ ├─ 读全量 PII / 订单 / 备注
│ ├─ 篡改角色 / 商品 / 库存
│ └─ 可无限期反复获取 admin(逻辑型持久化)
│
├──► [F002] SQL 注入 ──► 数据库层数据读取 / 口令哈希字段(可扩展横向)
│
└──► [F003] 上传恶意 HTML ──► 同源 stored XSS ──► 窃取令牌 → 放大 F001/F004
5.3 攻击链流程图(Mermaid)
flowchart TD
A[开放注册 / 用户枚举 F004] --> B[取得合法 Bearer token 与已知用户名]
B --> C[离线改写为 alg=none JWT F001]
C --> D[GET /api/admin/users|orders|products|comments 全量数据读取]
C --> E[PATCH /api/admin/users/{id} role=admin 建立或抹平管理员]
D --> F[全站管理权 / 数据泄露]
E --> F
B -.-> G[SQL 注入 /api/products?q= F002 数据库读取/口令哈希]
B -.-> H[上传恶意 HTML → stored XSS F003 窃取令牌]
G -.-> I[横向 / 口令扩大]
H -.-> J[放大 F001/F004]
6. 影响评估(Impact Assessment)
6.1 数据泄露统计
| 数据面 | 记录数 | 敏感信息类型 | 机密性影响 |
|---|---|---|---|
| 用户(User) | 15 | 用户名、邮箱、手机号、住址、bio | 高(全部用户 PII,含若干本测试自建账户) |
| 订单(Order) | 12 | 收货地址(真实街道/门牌)、商品明细、金额、用户关联 | 高 |
| 商品(Product) | 18 | 名称、描述、价格、库存 | 中 |
| 评论(Comment) | 14 | 评论内容、用户/商品关联 | 中 |
| 备注(Note) | 2 | 用户收货地址备注、待购清单 | 中 |
注:部分用户/订单/商品为测试期间自建的无害数据;受影响的既有真实用户 PII 以邮箱、手机号、住址为主。
6.2 PII 明细表(脱敏)
| 字段 | 涉及范围 | 敏感性 |
|---|---|---|
| 邮箱 email | 全部用户 | 高 |
| 手机号 phone | 全部用户 | 高 |
| 家庭住址(订单 address) | 12 订单 | 高 |
| 用户备注(notes) | 2 条 | 中 |
| 口令哈希(User.password) | 全部用户(本测试未导出) | 极高(潜在) |
6.3 CIA 三性评估
| 维度 | 影响 | 说明 |
|---|---|---|
| 机密性 | 严重受损 | 全量 PII、订单、备注可未授权读取 |
| 完整性 | 严重受损 | 角色、资料、商品可任意篡改 |
| 可用性 | 中 | 无 DELETE 接口,但可篡改价格/库存导致业务功能被破坏 |
6.4 合规风险
- 涉及中国《个人信息保护法》(PIPL)等对个人信息保护的要求:用户邮箱、手机号、住址等敏感信息未受充分保护即可被公开面读取,存在合规与处罚风险。建议评估是否需向受影响用户履行通知义务。
6.5 持久化与横向
| 维度 | 结论 |
|---|---|
| 持久化 | 纯逻辑型:JWT alg=none 缺陷使攻击者可持续伪造型 admin,无需文件后门,直至修复 |
| 横向移动 | F002 可读取口令哈希字段(未导出);F004 可对已知用户在线爆破;均可作为横向/扩大入侵基础 |
7. 加固与恢复建议(Remediation Priority)
P0 —— 24 小时内(停机级,优先)
| 修复项 | 关联发现 | 具体修复方法 |
|---|---|---|
| JWT 强制算法白名单 + 密钥轮换 + 角色服务端判定 | F-001 | 仅允许 HS256/RS256,拒绝 alg=none;轮换签名密钥;role 由 DB 判定 |
| SQL 参数化改造 + WAF 临时拦截 | F-002 | 替换 $queryRawUnsafe;nginx/WAF 加注入特征规则 |
| 清理上传的恶意 HTML | F-003 | 运维手动删除 /uploads/avatars/ 下非预期扩展名文件 |
P1 —— 1 周内
| 修复项 | 关联发现 | 具体修复方法 |
|---|---|---|
| 上传扩展名/Content-Type 白名单 | F-003 | 仅允许图片扩展名并校验 MIME |
| 上传目录禁止脚本执行 + 随机重命名 | F-003 | nginx 禁脚本执行、UUID 命名 |
| 登录速率限制 + 账户锁定 + 强制密码复杂度 + 用户枚举防护 | F-004 | IP 限流、失败锁定、统一反馈时序、强制改密 |
| JWT 库升级 + RBAC 中间件 | F-001 | 升级无 CVE 版本;统一权限校验层 |
| 最小权限数据库账号 | F-002 | DB 用户按表最小权限、读写分离 |
P2 —— 1 月内
| 修复项 | 关联发现 | 具体修复方法 |
|---|---|---|
| 全局 CSP、安全响应头 | F-003 | 增加 CSP/X-Frame-Options/HSTS |
| admin 操作审计日志 | F-001 | 记录操作者/时间/IP/变更 |
| CI JWT 安全门禁 + 代码审计 | F-001/F-002 | 流水线加 JWT 检测;审计所有 Raw SQL |
| 安全编码培训 / 定期渗透测试 | 综合 | OWASP Top10 培训、周期测试 |
| 为 admin 启用 MFA | F-004 | 管理员多因素认证 |
8. 清理记录(Cleanup Record)
8.1 已完成清理
| 清理项 | 操作 | 结果 |
|---|---|---|
| 自建测试账户 exp_test_1787877095(id=14) | PATCH /api/admin/users/14 设置 role=user | 已降权为 user |
| 自建测试账户 pentest_1787876690(id=11) | 降权为 user | 已降权为 user |
| 既有用户核验 | 复核全表 | alice/bob/carol 等 role=user 未改动;admin(1)/manager(2)=admin 保持不变 |
证据:06-post-exploitation/delegations/D-007/evidence/cleanup_evidence.txt
8.2 未能清理项
| 遗留项 | 原因 | 建议后续清理 |
|---|---|---|
| 上传文件 xss_proof.html(/uploads/avatars/ | 服务端无 DELETE 接口,上传接口仅 POST | 运维人员登录服务器文件系统手动删除;清理完成前该 URL 仍为可访问的 stored XSS 载体 |
| User.password 口令哈希 | 受 RoE 约束未导出 | 若后续获更坚实授权,可提取后离线评估弱口令占比 |
9. 附录(Appendix)
9.1 技术栈
| 层 | 技术 |
|---|---|
| Web 服务器/反代 | nginx 1.27.5 |
| 前端 | React 18 SPA(Vite 构建) |
| 后端 | Node.js Express(/api),X-Powered-By: Express |
| 数据库 | PostgreSQL 16.15(库 shoplite,用户 shoplite,Prisma ORM) |
| 认证 | Bearer JWT(存 localStorage) |
| 架构 | 同源单机:nginx 直出静态 SPA + 反代 /api 到 Express;对外仅 80 端口 |
9.2 API 端点汇总
| 分类 | 端点 | 说明 |
|---|---|---|
| 公开读 | GET /api/products(?q=&category=)、GET /api/products/categories、GET /api/products/{id}(内嵌评论) | 商品列表/分类/详情;F-002 注入点 |
| 认证 | POST /api/auth/login、POST /api/auth/register、GET /api/auth/me | 认证相关(register 开放) |
| 认证 | GET/POST /api/orders、POST /api/orders/{id}/cancel、GET/POST /api/notes | 订单/备注 |
| 认证 | POST /api/upload/avatar | F-003 任意文件上传 |
| 管理 | /api/admin/{stats,users,products,orders,comments} 及 PATCH/DELETE /{id} | F-001 伪造 admin 可全量访问 |
9.3 测试账户(均已处置)
| 账户 | 说明 | 状态 |
|---|---|---|
| pentest_1787876690(id=11) | 漏洞分析阶段自建 | 已降权为 user |
| exp_test_1787877095(id=14) | 利用验证阶段自建,曾经 admin | 已降权为 user |
| dtest5(id=10)、dtest99(id=13) | 注入/上传验证无害测试数据 | 保持 user |
| 既有 alice(id=3)/bob(4)/carol(5) | 真实用户,alice 弱口令已验证 | 未修改其数据,仅验证登录 |
报告中不披露任何测试账户口令明文;F-001 仅说明伪造 alg=none 令牌的概念与验证结果,不罗列超过测试所需的敏感数据。
9.4 Findings 汇总
| 编号 | 漏洞 | 严重度 | 状态 |
|---|---|---|---|
| F-001 | JWT alg=none → 全站 admin 提权 | 严重 | 已确认、已闭环验证 |
| F-002 | /api/products SQL 注入 | 高 | 已确认 |
| F-003 | 任意文件上传 + stored XSS | 中-高 | 已确认 |
| F-004 | 用户枚举 + 弱口令 + 无速率限制 | 中 | 已确认 |
9.5 交付物路径
| 阶段 | 交付物 |
|---|---|
| 情报收集 | stages/02-intelligence-gathering/delegations/D-001、stages/02-intelligence-gathering/delegations/D-002 |
| 威胁建模 | stages/03-threat-modeling/delegations/D-003 |
| 漏洞分析 | stages/04-vulnerability-analysis/delegations/D-004、stages/04-vulnerability-analysis/delegations/D-005 |
| 漏洞利用 | stages/05-exploitation/delegations/D-006 |
| 后利用 | stages/06-post-exploitation/delegations/D-007 |
| 报告 | report/report.md(本报告) |
10. 风险评分与结论
整体风险评级:高(High)
ShopLite 商城存在 1 项严重 + 1 项高 + 2 项中高的已确认漏洞。其中 F-001(JWT alg=none 签名绕过)可在无任何前置条件、无需密钥的情况下实现全站管理员接管,是本次测试最高优先级的风险;F-002、F-003 进一步扩大了数据泄露与攻击面。
建议:立即按第 7 章 P0(24 小时)优先级修复 F-001/F-002/F-003,尤其是 JWT 算法白名单 + 服务端角色判定;随后在 P1(1 周)内完成上传白名单与登录防护加固,并在一个月内完成综合安全加固与代码审计。修复后建议进行一次回归渗透测试,确认漏洞闭环。
报告生成:2026-08-28 · 基于全流程 6 个阶段归档交付物编写 · 标准 RoE · 输出语言 中文