记一次Java Servlet实战审计
字数 1583 2025-08-06 08:35:19

Java Servlet 安全审计实战指南

0x00 背景与前期信息收集

在进行Java Web应用安全审计时,通常会遇到以下场景:

  1. 目标识别:发现JSP站点,通过弱密码进入后台但功能有限
  2. 审计思路
    • 通过漏洞攻陷后台
    • 获取源码进行白盒审计

信息收集方法

  1. 目录扫描

    • 工具选择:dirbuster、dirsearch等
    • 字典推荐:directory-list-2.3-medium.txt
    • 扫描特定后缀:如.jsp
  2. 网盘泄露

    • 使用网盘搜索引擎查找厂商安装包
    • 注意:PE文件可能存在风险,需谨慎处理
  3. 代码仓库泄露

    • Github/Gitlab搜索关键词
    • 通常无果但值得尝试
  4. FOFA搜索

    • 使用favicon.ico或title精准搜索同类站点
    • 工具推荐:WebAliveScan(多线程扫描)
  5. 大规模字典扫描

    • 使用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注入挖掘

  1. 发现注入点特征

    • 无任何过滤的参数拼接
    • 表名/字段名动态拼接
  2. 注入利用技巧

    • 使用SecLists的raft-large-words.txt进行FUZZ
    • 优先选择不破坏数据的注入点
  3. 数据库信息获取

    • 通过SQLMAP识别DBA权限
    • 通过大小写判断操作系统(Windows/Linux)
  4. 写WebShell技巧

    • Windows环境路径猜测困难
    • 可通过报错泄露路径信息
    • 使用UNC地址进行带外注入(备选方案)

路径泄露利用

  1. 利用Tomcat报错

    • 未屏蔽的报错可能泄露源码和路径
    • 示例路径:d:\exam\bak\
  2. SQLMAP利用

    • --os-shell参数获取系统shell
    • 上传任意文件实现getshell

前台漏洞挖掘

  1. 搜索未包含check.jsp的代码

    • 查找绕过权限检查的功能点
    • 发现前台SQL注入等漏洞
  2. 路径猜测

    • OEM产品通常路径固定
    • 结合报错信息确认web路径

0x03 审计总结

  1. 审计流程

    • 信息收集 → 源码获取 → 静态分析 → 漏洞验证
  2. 关键点

    • 关注web.xml和注解定义的路由
    • 追踪jsp:useBean的class定义
    • 检查所有request.getParameter的使用点
  3. 工具链

    • 扫描工具:dirsearch、WebAliveScan
    • 审计工具:IDEA
    • 漏洞利用:SQLMAP
  4. 防御建议

    • 使用PreparedStatement防止SQL注入
    • 配置Tomcat不显示错误信息
    • 对上传文件进行严格限制
    • 重要功能添加权限检查

附录:参考资源

  1. WebAliveScan: https://github.com/broken5/WebAliveScan
  2. SecLists字典集
  3. dirsearch工具
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条) 示例命令: 0x01 Servlet基础知识 标准目录结构 路由定义方式 1. Servlet注解方式(3.0+) 2. web.xml配置方式(3.0之前) 关键元素: <servlet-class> : 对应类的全限定名 <url-pattern> : 访问路由 JSP重要标签 jsp:useBean标签 属性说明: id : 变量名(习惯与class最后一级相同) scope : 作用范围(page/request/session/application) 注意:频繁变动的bean不应设为application/session class : Java类路径(WEB-INF/classes为起点,点分隔) 审计技巧:通过IDEA可方便查看.class文件定义 HTTP参数获取 特点: request.getParameter 兼容GET/POST参数(类似PHP的$_ REQUEST) 中文参数需要转码处理 文件包含 特点: 类似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工具