基于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密钥直接硬编码在源代码中
- 未通过配置文件注入
- 未在初始化时进行随机生成
修复建议:
- 将密钥移至配置文件中
- 使用环境变量注入
- 或使用密钥管理系统
3.2 任意文件删除漏洞
漏洞位置: 文件删除功能未做过滤
风险等级: 高危
调用链分析:
AdminStorageController.java暴露路由- 调用
StorageService.java的服务方法 - 最终执行文件删除操作
关键代码:
// 删除方法无过滤
public void delete(String keyName) {
storage.delete(keyName);
}
// 控制器暴露接口
@PostMapping("/delete")
public Object delete(@RequestBody String body) {
// 直接传递文件名,无过滤
}
利用方式:
构造恶意请求,通过文件名参数删除系统任意文件
修复建议:
- 对文件名进行严格校验
- 限制可删除的文件路径范围
- 添加权限验证
3.3 文件上传漏洞
漏洞位置: WxStorageController.java 和 AdminStorageController.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或服务端漏洞
修复建议:
- 严格校验文件扩展名和MIME类型
- 使用白名单机制限制可上传文件类型
- 对上传文件重命名
- 设置文件内容扫描
3.4 SQL注入漏洞
漏洞位置: OrderMapper.xml 和 LitemallOrderService.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>
问题点:
- 使用字符串拼接而非参数化查询
- 查询条件直接拼接SQL语句
调用链:
AdminOrderController.java接收用户输入- 调用
AdminOrderService.java的服务方法 - 最终执行拼接的SQL查询
修复建议:
- 使用MyBatis的参数化查询(#{}替代${})
- 对用户输入进行严格过滤
- 使用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. 漏洞挖掘方法论
-
优先扫描已知漏洞模式:
- 硬编码凭证
- 文件操作未过滤
- SQL注入
- 文件上传漏洞
-
关注关键组件:
- 认证授权相关代码
- 文件操作服务
- 数据库访问层
- 用户输入处理点
-
调用链分析:
- 从Controller入口开始
- 跟踪Service层处理
- 最终到达底层操作
-
自定义规则开发:
- 针对项目特有架构
- 补充标准规则集的不足
- 聚焦业务逻辑漏洞
6. 经验总结
-
竞争问题:
- 发现漏洞后应及时提交
- 热门项目漏洞容易被抢先报告
-
重复漏洞:
- 扫描前检查已知漏洞列表
- 避免重复劳动
-
审计效率:
- 大型Java项目适合使用CodeQL
- 人工审计与工具扫描结合
-
报告撰写:
- 清晰描述漏洞位置
- 提供完整调用链
- 包含验证POC
- 给出修复建议
7. 参考资料
- CodeQL官方文档
- OWASP Top 10漏洞类型
- CWE漏洞分类
- MyBatis安全编程指南
- Spring Boot安全最佳实践