渗透测试报告 —— ShopLite 小型在线商城

August 28, 2026 · View on GitHub

项目内容
测试目标192.168.107.3(ShopLite 小型在线商城)
Target IDca21f209
授权范围以 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.1CWE利用前置条件证据
F-001JWT alg=none 签名校验绕过 → 全站管理员提权严重9.8CWE-347 / CWE-287无(仅需网络可达)阶段 04/05 evidence
F-002/api/products 参数 SQL 注入(PostgreSQL)8.1CWE-89无(公开接口)阶段 04/05 evidence
F-003头像上传任意文件 + 同源存储型 XSS 载体中-高6.1CWE-434 / CWE-79任一登录账户阶段 04/05 evidence
F-004用户枚举 + 弱口令 alice/alice123,无速率限制5.3CWE-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:80ShopLite 商城 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.mdtarget/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=none token 走通完整 admin 接管链(读取全部 admin 数据 + PATCH 自建账户提权并回验闭环)。
    • F2:布尔/时间盲注复验,sqlmap 双类型确认,克制提取非敏感元数据(DB 版本/库/用户/表结构/字段名)。
    • F3:上传 xss_proof.html 并回读确认 text/html 可执行脚本。
    • F4:alice/alice123 登录确认,核查访问面(仅自身数据)。
  • 交付物: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.19.8,向量 AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H
CWECWE-347(签名算法未正确校验)/ CWE-287(认证绕过)
发现/利用阶段漏洞分析(PTES 04)→ 利用验证(PTES 05)

CVSS 向量分解

分量评估说明
攻击向量 AVN 网络通过 HTTP /api 远程可达
利用复杂度 ACL 低无需任何绕过,直接伪造令牌
所需权限 PRN 无开放注册即得有效令牌(可选),甚至无需有效令牌
用户交互 UIN 无无需受害者交互
影响范围 SU 不变漏洞仅影响应用自身
机密/完整/可用H/H/H全量数据可读、可篡改,平台可被完全接管

描述

服务端 JWT 校验未设置算法(alg)白名单:它会对 HS256 令牌严格执行签名校验(篡改 payload、保留原签名的 HS256 令牌会返回 401),但接受 alg=none(空签名),且信任令牌内 role 声明而非从数据库判定角色。攻击者只需将令牌 header 改为 {"alg":"none","typ":"JWT"}、payload 置为 role:admin、sub:1、签名留空,即可伪造出被服务端接受的管理员令牌,全程无需任何密钥

复现步骤

  1. 注册/登录取得一个 Bearer token(或直接观察任意合法 token 的解码结构)。
  2. 构造新 JWT:header={"alg":"none","typ":"JWT"},payload={"sub":1,"role":"admin","iat":...,"exp":...},签名留空。
  3. 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.txtalg_none_me.txtalg_none_patch_self.txtpost_patch_login.txt
  • 05-exploitation/delegations/D-006/evidence/f1_me.txtf1_admin_data.txtf1_admin_leaks.jsonf1_patch.txtf1_after_login.txtf1_chain.txt

影响

  • 无需密钥即获全站管理员读写能力,可读取全部用户 PII、订单(含收货地址)、商品与评论数据。
  • 可篡改任意用户角色(批量制造 admin / 降权现有管理员)、篡改用户资料、商品价格/库存等。
  • 纯逻辑型持久化:无需在服务器落下任何文件,攻击者可随时再次伪造 admin 身份,直至修复。

修复建议

  1. 【P0·24h】在 JWT 验证处强制算法白名单,仅允许 HS256(或 RS256),显式拒绝 alg=none / none / None 及任何可变算法参数(使用主流 JWT 库的 algorithms 白名单参数)。
  2. 【P0·24h】立即轮换 JWT 签名密钥,作废可能已泄露的既有令牌。
  3. 【P0·24h】角色改由服务端数据库判定,每个请求从 DB 读取用户角色,不信任令牌内 role 声明。
  4. 【P1·1 周】升级 JWT 库至无已知 CVE 的稳定版并做版本审计。
  5. 【P1·1 周】引入统一 RBAC 中间件层做权限判定,而非在各路由独立校验。
  6. 【P2·1 月】对全部 admin 操作记录审计日志(操作者/时间/IP/变更内容);在 CI 中加入 JWT 安全检测门禁。

4.2 F-002【高】/api/products 参数 SQL 注入(PostgreSQL)

属性
严重度高(High)
CVSS 3.18.1,向量 AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:L
CWECWE-89(SQL 注入)
发现/利用阶段漏洞分析(PTES 04)→ 利用验证(PTES 05)

CVSS 向量分解

分量评估说明
攻击向量 AVN 网络公开接口远程可达
利用复杂度 ACL 低直接注入
所需权限 PRN 无/api/products 匿名可访问
用户交互 UIN 无无需交互
影响范围 SU 不变影响应用/数据库
机密性 C / 完整性 IH / H可读取与改写数据
可用性 AL 低借时间盲注可拖慢查询,无直接 DoS

描述

GET /api/products?q=(及 category=)参数经 Prisma $queryRawUnsafe 直接拼入 SQL 的 ILIKE '%q%' ORDER BY id ASC 子句,导致 SQL 注入。注入点为 PostgreSQL 关系型库,兼具布尔盲注与时间盲注,可逐字节有序提取数据库全部业务数据。已确认可通过盲注读取:DB 版本、库名、用户名、表结构、字段名。

复现步骤

  1. 布尔盲注:q=none' OR 1=1-- - → 返回 18 条;q=none' OR 1=2-- - → 返回 0 条(baseline zzz 为 0 条)。
  2. 时间盲注:q=x' OR (SELECT CASE WHEN pg_sleep(3) IS NULL THEN 1 ELSE 1 END)=1-- - → 约 3.09s(baseline 0.05s)。
  3. sqlmap 自动确认 boolean-based + time-based,DBMS=PostgreSQL。
  4. 克制元数据提取: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.logp5_sqli_time.log
  • 05-exploitation/delegations/D-006/evidence/f2_meta.txtf2_tables.txtf2_columns.txtf2_timeconfirm.txtf2_sqlmap_meta.logf2_sqlmap_tables.log

影响

  • 攻击者可读取数据库全部业务数据,User.password 口令哈希字段(本次未导出哈希值)。
  • 若配合离线破解/进一步提取,可扩大为口令泄露与横向入侵。机密性与完整性风险均高。

修复建议

  1. 【P0·24h】将 $queryRawUnsafe 全部替换为参数化查询(Prisma 参数化 API),杜绝把用户输入拼入 SQL 字符串。
  2. 【P0·24h】在 nginx/WAF 层临时增加注入特征拦截规则(如 UNION、OR 1=1、pg_sleep 等)。
  3. 【P1·1 周】全库审计所有 $queryRawUnsafe / $executeRawUnsafe 调用并替换;数据库连接按最小权限原则授权(读写分离)。
  4. 【P1·1 周】对用户输入进行必要的白名单/转义(不能替代参数化)。

4.3 F-003【中-高】头像上传任意文件 → 同源存储型 XSS 载体

属性
严重度中-高(Medium-High)
CVSS 3.16.1,向量 AV:N/AC:L/PR:L/UI:R/S:C/C:H/I:L/A:N
CWECWE-434(不受限制的文件上传)/ CWE-79(存储型 XSS)
发现/利用阶段漏洞分析(PTES 04)→ 利用验证(PTES 05)

CVSS 向量分解

分量评估说明
攻击向量 AVN 网络远程上传/访问
利用复杂度 ACL 低直接上传即可
所需权限 PRL 低需任一登录账户
用户交互 UIR 需交互需诱导受害者访问恶意文件 URL
影响范围 SC 已改变可借助 xss 影响会话/权限
机密性 CH可窃取令牌
完整性 IL页面内容篡改

描述

POST /api/upload/avatar(字段 avatar)无扩展名/内容类型白名单:.png/.html/.svg/.php 及无扩展名文件均可上传,返回 /uploads/avatars/<时间戳>-<原名>;存储文件按原名+原 MIME 回读,.html 以 text/html 输出、正文 <script> 原样保留,且响应无 CSP 头。上传的 HTML 成为同源存储型 XSS 载体。路径穿越文件名已被规范化(斜杠剥离)未实现目录穿越;本次未落地 webshell、未执行命令(符合 RoE)。

复现步骤

  1. 登录自建账户上传 xss_proof.html(含 alert 与 DOM 写入脚本):curl -X POST ... -F 'avatar=@xss_proof.html;type=text/html' → 200,返回 url=/uploads/avatars/-xss_proof.html。
  2. 回读该 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.log
  • 05-exploitation/delegations/D-006/evidence/f3_upload.jsonf3_fetch_headers.txtf3_fetch_body.txtwork/xss_proof.html

影响

  • 上传的恶意 HTML 持久存在,可诱导管理员或其他用户访问,进而窃取会话令牌(localStorage 中的 Bearer token)实现账户/权限接管,或伪造登录页面钓鱼;与 F-001 叠加可放大至全站管理员接管。

修复建议

  1. 【P0·24h】清理已上传的恶意文件(运维手动删除 /uploads/avatars/ 下非预期扩展名文件)。
  2. 【P1·1 周】加强扩展名白名单(仅允许 .jpg/.jpeg/.png/.gif/.webp)并校验 Content-Type/MIME。
  3. 【P1·1 周】上传目录禁止脚本执行;返回文件强制 Content-Disposition: attachment。
  4. 【P1·1 周】保存文件时用随机 UUID 重命名,不保留用户原始文件名。
  5. 【P2·1 月】全局增加 CSP 头限制脚本执行来源。

4.4 F-004【中】用户枚举 + 弱口令 alice/alice123,无速率限制

属性
严重度中(Medium)
CVSS 3.15.3,向量 AV:N/AC:L/PR:N/UI:N/S:U/C:L/I:N/A:N(弱口令账户接管维度另计,综合评估)
CWECWE-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,无其他用户单页接口 → 未发现横向越权读他人数据

复现步骤

  1. 枚举:POST /api/auth/register {"username":"alice",...} → 返回「用户名已被注册」。
  2. 弱口令:POST /api/auth/login {"username":"alice","password":"alice123"} → 200,返回 token + user{id:3}。
  3. 爆破可行性:连续错误登录无锁定/限流。

证据路径

  • 04-vulnerability-analysis/delegations/D-005/evidence/p8_enum.logp8_weakpass.logwork/weakpass.pywork/ratelimit.py
  • 05-exploitation/delegations/D-006/evidence/f4_login.txtf4_me.txtf4_orders.txtf4_notes.txtf4_admin_denied.txt

影响

  • 单个账户(alice)接管风险;结合用户枚举与无速率限制,可对已知用户(alice/bob/carol 等)做低成本的在线爆破,可能扩大到更多账户接管。

修复建议

  1. 【P1·1 周】login/register 采用统一且时序一致的反馈,避免区分用户是否存在。
  2. 【P1·1 周】登录加 IP 级速率限制(如 5 次/分钟)与账户锁定策略(连续失败临时锁定)。
  3. 【P1·1 周】强制密码复杂度;通知 alice 等弱口令用户立即改密。
  4. 【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 加注入特征规则
清理上传的恶意 HTMLF-003运维手动删除 /uploads/avatars/ 下非预期扩展名文件

P1 —— 1 周内

修复项关联发现具体修复方法
上传扩展名/Content-Type 白名单F-003仅允许图片扩展名并校验 MIME
上传目录禁止脚本执行 + 随机重命名F-003nginx 禁脚本执行、UUID 命名
登录速率限制 + 账户锁定 + 强制密码复杂度 + 用户枚举防护F-004IP 限流、失败锁定、统一反馈时序、强制改密
JWT 库升级 + RBAC 中间件F-001升级无 CVE 版本;统一权限校验层
最小权限数据库账号F-002DB 用户按表最小权限、读写分离

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 启用 MFAF-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/-xss_proof.html)服务端无 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/avatarF-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-001JWT alg=none → 全站 admin 提权严重已确认、已闭环验证
F-002/api/products SQL 注入已确认
F-003任意文件上传 + stored XSS中-高已确认
F-004用户枚举 + 弱口令 + 无速率限制已确认

9.5 交付物路径

阶段交付物
情报收集stages/02-intelligence-gathering/delegations/D-001stages/02-intelligence-gathering/delegations/D-002
威胁建模stages/03-threat-modeling/delegations/D-003
漏洞分析stages/04-vulnerability-analysis/delegations/D-004stages/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 · 输出语言 中文