基于codeql的litemall漏洞挖掘
字数 1524 2025-09-01 11:26:02

基于CodeQL的Litemall漏洞挖掘教学文档

1. 项目介绍

目标项目: litemall
项目地址: https://github.com/linlinjava/litemall
项目特点:

  • 19.8k star的开源小商场系统
  • 技术栈:
    • 后端: Spring Boot
    • 前端:
      • 管理员端: Vue
      • 用户端: 微信小程序 + Vue移动端

2. CodeQL基础准备

2.1 建立CodeQL数据库

codeql database create litemall-db --language=java --command="mvn clean install" --source-root=/path/to/litemall

2.2 使用CodeQL自带模板扫描

codeql database analyze litemall-db codeql/java/ql/src/codeql-suites/java-security-and-quality.qls --format=csv --output=results.csv

3. 漏洞挖掘实战

3.1 硬编码JWT Secret漏洞

漏洞位置: JWT密钥硬编码
CWE分类: CWE-798 (硬编码凭证)
风险等级: 高危

代码分析:

SECRET = "X-Litemall-Token"

问题描述:

  • JWT密钥直接硬编码在源代码中
  • 未通过配置文件注入
  • 未在初始化时进行随机生成

修复建议:

  1. 将密钥移至配置文件中
  2. 使用环境变量注入
  3. 或使用密钥管理系统

3.2 任意文件删除漏洞

漏洞位置: 文件删除功能未做过滤
风险等级: 高危

调用链分析:

  1. AdminStorageController.java 暴露路由
  2. 调用 StorageService.java 的服务方法
  3. 最终执行文件删除操作

关键代码:

// 删除方法无过滤
public void delete(String keyName) {
    storage.delete(keyName);
}

// 控制器暴露接口
@PostMapping("/delete")
public Object delete(@RequestBody String body) {
    // 直接传递文件名,无过滤
}

利用方式:
构造恶意请求,通过文件名参数删除系统任意文件

修复建议:

  1. 对文件名进行严格校验
  2. 限制可删除的文件路径范围
  3. 添加权限验证

3.3 文件上传漏洞

漏洞位置: WxStorageController.javaAdminStorageController.java
风险等级: 高危

代码分析:

// 文件上传端点
@PostMapping("/upload")
public Object upload(@RequestParam("file") MultipartFile file) {
    String url = storageService.store(file.getInputStream(), file.getSize(), file.getContentType(), file.getOriginalFilename());
    return ResponseUtil.ok(url);
}

// 存储服务方法
public String store(InputStream inputStream, long contentLength, String contentType, String fileName) {
    // 无文件扩展名校验
}

漏洞利用:

  • 可上传任意文件类型(如HTML、PDF)
  • 可能导致存储型XSS或服务端漏洞

修复建议:

  1. 严格校验文件扩展名和MIME类型
  2. 使用白名单机制限制可上传文件类型
  3. 对上传文件重命名
  4. 设置文件内容扫描

3.4 SQL注入漏洞

漏洞位置: OrderMapper.xmlLitemallOrderService.java
CVE编号: CVE-2024-24323
风险等级: 严重

代码分析:

<!-- OrderMapper.xml -->
<select id="getOrderIds" resultType="java.lang.Integer">
    SELECT id FROM litemall_order
    WHERE user_id = #{userId}
    <if test="query != null and query != ''">
        AND order_sn LIKE CONCAT('%', #{query}, '%')
        OR user_id LIKE CONCAT('%', #{query}, '%')
    </if>
</select>

问题点:

  1. 使用字符串拼接而非参数化查询
  2. 查询条件直接拼接SQL语句

调用链:

  1. AdminOrderController.java 接收用户输入
  2. 调用 AdminOrderService.java 的服务方法
  3. 最终执行拼接的SQL查询

修复建议:

  1. 使用MyBatis的参数化查询(#{}替代${})
  2. 对用户输入进行严格过滤
  3. 使用ORM框架的安全查询方法

4. CodeQL自定义规则开发

4.1 文件上传漏洞检测规则

import java

from MethodAccess ma, Method m, Parameter p
where 
  m.getName() = "store" and
  m.getDeclaringType().getName() = "StorageService" and
  ma.getMethod() = m and
  p.getCallable() = ma.getEnclosingCallable() and
  p.getType().getName() = "String" and
  p.getName() = "fileName"
select ma, "Potential file upload vulnerability without proper file extension validation"

4.2 SQL注入检测规则

import java
import semmle.code.java.frameworks.MyBatis

from MyBatisMapperMethod mapperMethod, Expr arg
where
  mapperMethod.usesStringConcatenation() and
  arg = mapperMethod.getConcatenatedArgument() and
  not arg.isConstant()
select mapperMethod, "Potential SQL injection in MyBatis mapper due to string concatenation"

5. 漏洞挖掘方法论

  1. 优先扫描已知漏洞模式:

    • 硬编码凭证
    • 文件操作未过滤
    • SQL注入
    • 文件上传漏洞
  2. 关注关键组件:

    • 认证授权相关代码
    • 文件操作服务
    • 数据库访问层
    • 用户输入处理点
  3. 调用链分析:

    • 从Controller入口开始
    • 跟踪Service层处理
    • 最终到达底层操作
  4. 自定义规则开发:

    • 针对项目特有架构
    • 补充标准规则集的不足
    • 聚焦业务逻辑漏洞

6. 经验总结

  1. 竞争问题:

    • 发现漏洞后应及时提交
    • 热门项目漏洞容易被抢先报告
  2. 重复漏洞:

    • 扫描前检查已知漏洞列表
    • 避免重复劳动
  3. 审计效率:

    • 大型Java项目适合使用CodeQL
    • 人工审计与工具扫描结合
  4. 报告撰写:

    • 清晰描述漏洞位置
    • 提供完整调用链
    • 包含验证POC
    • 给出修复建议

7. 参考资料

  1. CodeQL官方文档
  2. OWASP Top 10漏洞类型
  3. CWE漏洞分类
  4. MyBatis安全编程指南
  5. Spring Boot安全最佳实践
基于CodeQL的Litemall漏洞挖掘教学文档 1. 项目介绍 目标项目 : litemall 项目地址 : https://github.com/linlinjava/litemall 项目特点 : 19.8k star的开源小商场系统 技术栈: 后端: Spring Boot 前端: 管理员端: Vue 用户端: 微信小程序 + Vue移动端 2. CodeQL基础准备 2.1 建立CodeQL数据库 2.2 使用CodeQL自带模板扫描 3. 漏洞挖掘实战 3.1 硬编码JWT Secret漏洞 漏洞位置 : JWT密钥硬编码 CWE分类 : CWE-798 (硬编码凭证) 风险等级 : 高危 代码分析 : 问题描述 : JWT密钥直接硬编码在源代码中 未通过配置文件注入 未在初始化时进行随机生成 修复建议 : 将密钥移至配置文件中 使用环境变量注入 或使用密钥管理系统 3.2 任意文件删除漏洞 漏洞位置 : 文件删除功能未做过滤 风险等级 : 高危 调用链分析 : AdminStorageController.java 暴露路由 调用 StorageService.java 的服务方法 最终执行文件删除操作 关键代码 : 利用方式 : 构造恶意请求,通过文件名参数删除系统任意文件 修复建议 : 对文件名进行严格校验 限制可删除的文件路径范围 添加权限验证 3.3 文件上传漏洞 漏洞位置 : WxStorageController.java 和 AdminStorageController.java 风险等级 : 高危 代码分析 : 漏洞利用 : 可上传任意文件类型(如HTML、PDF) 可能导致存储型XSS或服务端漏洞 修复建议 : 严格校验文件扩展名和MIME类型 使用白名单机制限制可上传文件类型 对上传文件重命名 设置文件内容扫描 3.4 SQL注入漏洞 漏洞位置 : OrderMapper.xml 和 LitemallOrderService.java CVE编号 : CVE-2024-24323 风险等级 : 严重 代码分析 : 问题点 : 使用字符串拼接而非参数化查询 查询条件直接拼接SQL语句 调用链 : AdminOrderController.java 接收用户输入 调用 AdminOrderService.java 的服务方法 最终执行拼接的SQL查询 修复建议 : 使用MyBatis的参数化查询(#{}替代${}) 对用户输入进行严格过滤 使用ORM框架的安全查询方法 4. CodeQL自定义规则开发 4.1 文件上传漏洞检测规则 4.2 SQL注入检测规则 5. 漏洞挖掘方法论 优先扫描已知漏洞模式 : 硬编码凭证 文件操作未过滤 SQL注入 文件上传漏洞 关注关键组件 : 认证授权相关代码 文件操作服务 数据库访问层 用户输入处理点 调用链分析 : 从Controller入口开始 跟踪Service层处理 最终到达底层操作 自定义规则开发 : 针对项目特有架构 补充标准规则集的不足 聚焦业务逻辑漏洞 6. 经验总结 竞争问题 : 发现漏洞后应及时提交 热门项目漏洞容易被抢先报告 重复漏洞 : 扫描前检查已知漏洞列表 避免重复劳动 审计效率 : 大型Java项目适合使用CodeQL 人工审计与工具扫描结合 报告撰写 : 清晰描述漏洞位置 提供完整调用链 包含验证POC 给出修复建议 7. 参考资料 CodeQL官方文档 OWASP Top 10漏洞类型 CWE漏洞分类 MyBatis安全编程指南 Spring Boot安全最佳实践