记一次Java Servlet实战审计
字数 1583 2025-08-06 08:35:19
Java Servlet 安全审计实战指南
0x00 背景与前期信息收集
在进行Java Web应用安全审计时,通常会遇到以下场景:
- 目标识别:发现JSP站点,通过弱密码进入后台但功能有限
- 审计思路:
- 通过漏洞攻陷后台
- 获取源码进行白盒审计
信息收集方法
-
目录扫描
- 工具选择:dirbuster、dirsearch等
- 字典推荐:directory-list-2.3-medium.txt
- 扫描特定后缀:如.jsp
-
网盘泄露
- 使用网盘搜索引擎查找厂商安装包
- 注意:PE文件可能存在风险,需谨慎处理
-
代码仓库泄露
- Github/Gitlab搜索关键词
- 通常无果但值得尝试
-
FOFA搜索
- 使用favicon.ico或title精准搜索同类站点
- 工具推荐:WebAliveScan(多线程扫描)
-
大规模字典扫描
- 使用dirsearch自带字典(约17,000条)
- 示例命令:
python3 dirsearch3.py -e "jsp" -l ip_port.txt -t 50 --plain-text-report=ip_port_DirScan.txt -q
0x01 Servlet基础知识
标准目录结构
exampleApp
├── images
└── WEB-INF
├── classes # 包含所有Servlet类和其他类文件【重要】
├── lib # 项目依赖包(.jar文件)存储位置
└── web.xml # Servlet配置文件【重要】
路由定义方式
1. Servlet注解方式(3.0+)
@WebServlet("/Hello")
public class HelloServlet extends HttpServlet {
// 处理GET请求
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html;charset=UTF-8");
// 实现代码
}
// 处理POST请求
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html;charset=UTF-8");
// 实现代码
}
}
2. web.xml配置方式(3.0之前)
<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd">
<web-app>
<servlet>
<servlet-name>HelloServlet</servlet-name>
<servlet-class>com.example.HelloServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>HelloServlet</servlet-name>
<url-pattern>/Hello</url-pattern>
</servlet-mapping>
</web-app>
关键元素:
<servlet-class>: 对应类的全限定名<url-pattern>: 访问路由
JSP重要标签
jsp:useBean标签
<jsp:useBean id="HttpSession" scope="session" class="example.HttpSession" />
属性说明:
id: 变量名(习惯与class最后一级相同)scope: 作用范围(page/request/session/application)- 注意:频繁变动的bean不应设为application/session
class: Java类路径(WEB-INF/classes为起点,点分隔)
审计技巧:通过IDEA可方便查看.class文件定义
HTTP参数获取
<%
String id = request.getParameter("id");
// 处理中文参数
String name = new String(request.getParameter("name").getBytes("ISO-8859-1"), "UTF-8");
%>
特点:
request.getParameter兼容GET/POST参数(类似PHP的$_REQUEST)- 中文参数需要转码处理
文件包含
<%@ include file="check.jsp" %>
特点:
- 类似PHP的文件包含
- 常用于权限检查(如后台功能检查)
0x02 漏洞挖掘实战
SQL注入挖掘
-
发现注入点特征:
- 无任何过滤的参数拼接
- 表名/字段名动态拼接
-
注入利用技巧:
- 使用SecLists的raft-large-words.txt进行FUZZ
- 优先选择不破坏数据的注入点
-
数据库信息获取:
- 通过SQLMAP识别DBA权限
- 通过大小写判断操作系统(Windows/Linux)
-
写WebShell技巧:
- Windows环境路径猜测困难
- 可通过报错泄露路径信息
- 使用UNC地址进行带外注入(备选方案)
路径泄露利用
-
利用Tomcat报错:
- 未屏蔽的报错可能泄露源码和路径
- 示例路径:
d:\exam\bak\
-
SQLMAP利用:
--os-shell参数获取系统shell- 上传任意文件实现getshell
前台漏洞挖掘
-
搜索未包含check.jsp的代码:
- 查找绕过权限检查的功能点
- 发现前台SQL注入等漏洞
-
路径猜测:
- OEM产品通常路径固定
- 结合报错信息确认web路径
0x03 审计总结
-
审计流程:
- 信息收集 → 源码获取 → 静态分析 → 漏洞验证
-
关键点:
- 关注web.xml和注解定义的路由
- 追踪jsp:useBean的class定义
- 检查所有request.getParameter的使用点
-
工具链:
- 扫描工具:dirsearch、WebAliveScan
- 审计工具:IDEA
- 漏洞利用:SQLMAP
-
防御建议:
- 使用PreparedStatement防止SQL注入
- 配置Tomcat不显示错误信息
- 对上传文件进行严格限制
- 重要功能添加权限检查
附录:参考资源
- WebAliveScan: https://github.com/broken5/WebAliveScan
- SecLists字典集
- dirsearch工具