Java安全:基础漏洞审计实战
字数 2816 2025-08-22 12:23:00
Java安全:基础漏洞审计实战教学文档
1. 项目结构分析
1.1 关键目录与文件
- pom.xml:Maven项目配置文件,包含组件版本信息
- src/main/resources/conf/:主配置目录(可能不存在)
*.properties:组件配置信息(MyBatis, Shiro, Log4j, Spring Boot等)application.properties:Spring Boot主配置文件(数据库配置、启动路径、端口信息、日志配置)
- src/main/resources/templates:模板文件目录
- src/main/resources/mappers:MyBatis的XML文件,定义SQL语句
- src/main/java/包名/
controller:处理HTTP请求services:功能逻辑代码实现model:定义处理数据类型common:公共资源formValid/:表单验证相关Interceptor/:请求拦截器
- src/main/webapp/WEB-INF/:Web配置
web.xml:Web应用主配置文件(定义Servlet、过滤器、监听器)
2. SQL注入漏洞审计
2.1 JDBC注入
危险代码特征:
- 字符串拼接:
+号拼接 StringBuilder.append()String.concat()- 搜索关键词:
append(,concat(
2.2 MyBatis注入
安全与不安全写法:
- 安全写法:使用
#{}(预编译参数) - 不安全写法:使用
${}(直接拼接) - 搜索关键词:
${
易产生注入的特殊场景:
- 模糊查询
LIKE语句 ORDER BY排序IN子句HAVING子句
SQLMap特殊参数:
sqlmap --level 5 --risk 3
报错注入Payload示例:
1 and (SELECT updatexml(1, concat(0x7e,(SELECT database()),0x7e),1))
1 and updatexml(1, concat(0x7e,(database()),0x7e),1)
?orderColumn=1 AND EXTRACTVALUE(1040, CONCAT(0x5c, 0x7178766b71,(SELECT (ELT(1040=1040,1))),0x717a767871))
2.3 案例研究
案例1:jfinal_cms-4.5.0
- 发现点:
pom.xml显示未使用数据库框架,采用MySQL - 搜索
append(发现多处SQL注入 - 注入点:
/admin/concat/路由对应的list方法 - 前台查询功能存在注入
案例2:oa_system (MyBatis)
- 发现点:
pom.xml中的MyBatis框架 - 不安全写法:
${baseKey}和${pinyin} - 触发路由:
/informListPaging(参数basekey)/outaddresspaging(参数alph)
案例3:RuoYi-v4.6.0 (MyBatis)
- 发现点:
pom.xml中的MyBatis依赖 - 不安全写法:
${ancestors} - 功能点:部门编辑
- 触发路由:
/system/dept/edit(参数ancestors)
3. 文件类漏洞审计
3.1 关键搜索点
文件操作相关代码:
new FileInputStream(
new FileOutputStream(
new File(
FileUtils.
IOUtils.
文件上传相关代码:
MultipartFile
file.getOriginalFilename(
file.transferTo(
文件下载相关代码:
response.setContentType("application/octet-stream")
getFile
download
目录操作相关代码:
.mkdirs(
.createNewFile(
优先搜索:new FileInputStream(
3.2 案例研究
案例1:Inxedu - 文件上传
- 上传JSPX绕过检测
- 路由地址:
POST /inxedu_war/image/gok4?fileType=jspx,jpg,gif,png,jpeg¶m=temp
案例2:Tmall - 配合过滤器绕过
- 绕过验证:URL包含
/admin/login即通过,配合../绕过 - 后台存在未过滤的文件上传功能
案例3:Ruoyi - 文件下载
- 搜索点:
FileInputStream( - 触发路由:
/common/download/resource?resource=/profile/../RuoYi-v4.5.0/ruoyi-admin/src/main/resources/application.yml - 绕过要求:必须包含
profile再../绕过
案例4:Oasys - 文件读取
- 搜索点:
new FileInputStream( - 路径穿越限制:检测到2个
../../会报错,但一个../可执行 - 绕过技巧:嵌套
../实现路径穿越?path=/image/../image/../image/../image/../image/../image/../image/../image/../image/flag.txt
4. 未授权访问漏洞审计
4.1 鉴权方法
- Interceptor拦截器:
src/main/java/包名/interceptor - Filter过滤器:
src/main/java/包名/filter - Shiro框架:
src/main/resource/**
4.2 Shiro相关漏洞
Shiro版本自身漏洞绕过
-
CVE-2020-1957:
- 客户端请求URL:
/xxx/..;/admin/ - Shiro校验URL为
/xxxx/..,校验通过 - SpringBoot最终请求
/admin/
- 客户端请求URL:
-
CVE-2020-11989:
- 客户端请求URL:
/;/test/admin/page - Shiro校验URL为
/,校验通过 - SpringBoot最终请求
/admin/page
- 客户端请求URL:
-
CVE-2020-13933:
- 客户端请求URL:
/admin/;page - Shiro校验URL为
/admin/,校验通过 - SpringBoot最终请求
/admin/;page
- 客户端请求URL:
Shiro配置不当
示例配置:
tumo.shiro.anon_url=/comment/**
可能导致:DELETE /comment/1任意文件删除
JWT默认密钥
常见默认密钥:
SecretKey012345678901234567890123456789012345678901234567890123456789
4.3 绕过手法
-
分号
;处理:- Tomcat会自动去除
;后面的字符 - 示例:
/;a.png/admin == /admin /admin/;.png == /admin /admin/;.js == /admin /admin/;.css == /admin
- Tomcat会自动去除
-
斜杠
/处理:- Tomcat会自动处理多余的
/ - 示例:
/////admin == /admin
- Tomcat会自动处理多余的
-
路径穿越
../:- 当
../被禁用时,可使用/..;abc/实现跨目录
- 当
-
白名单绕过:
- 如果白名单匹配
png/css/js结尾的文件放行:/admin/;.png == /admin /admin/;.js == /admin /a.js/../account/getAccount
- 如果白名单匹配
4.4 案例研究
案例1:NewbeeMall
- 使用Interceptor拦截器进行身份认证
- 绕过方法:
/admin/;.js
案例2:华夏ERP
- 使用过滤器进行鉴权
- 绕过条件:URL包含
login.html或register.html即通过
案例3:Tumo
- Shiro配置不当:
tumo.shiro.anon_url=/login,/logout,/register,/,/about,/p/**,/links,/comment/**,/link/list,/article/list,/css/**,/js/**,/img/** - 可访问
/comment及后面任意路径,如/comment/1,可能导致DELETE方法删除
5. SSTI模板注入
利用条件:
- 可控变量(传参、SQL注入结果等)
功能点:
- 模板管理
PoC参考:
- https://github.com/vladko312/SSTImap
6. JavaEE审计CheckList
参考资源:
- https://mp.weixin.qq.com/s/Y90mGgCqzjj0T1NX9E5wDw
- https://mp.weixin.qq.com/s/COXCjMItvrcOCNcqEfbmDg