从JFinal4.5 CMS 接触JAVA代码审计
字数 1920 2025-10-01 14:05:44

JFinal4.5 CMS Java代码审计教学文档

一、web.xml与pom.xml文件分析

1.1 web.xml 文件的作用

基本配置功能

  • 定义应用名称和上下文路径:通过<display-name>标签定义Web应用在服务器管理界面显示的名称
  • 设置欢迎页面:使用<welcome-file-list>标签指定用户访问根目录时的默认页面
    <welcome-file-list>
        <welcome-file>login.jsp</welcome-file>
    </welcome-file-list>
    

Servlet配置

  • Servlet定义和映射:配置Servlet名称、实现类和URL映射模式
    <servlet>
        <servlet-name>MyServlet</servlet-name>
        <servlet-class>com.example.MyServletClass</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>MyServlet</servlet-name>
        <url-pattern>/myServletPath</url-pattern>
    </servlet-mapping>
    

过滤器配置

  • 过滤器定义:配置请求预处理和后处理逻辑
    <filter>
        <filter-name>EncodingFilter</filter-name>
        <filter-class>com.example.EncodingFilterClass</filter-class>
        <init-param>
            <param-name>encoding</param-name>
            <param-value>UTF-8</param-value>
        </init-param>
    </filter>
    <filter-mapping>
        <filter-name>EncodingFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
    

JFinal特定配置

  • JFinal过滤器配置:所有请求都经过JFinal过滤器处理
    <filter>
        <filter-name>jfinal</filter-name>
        <filter-class>com.jfinal.core.JFinalFilter</filter-class>
        <init-param>
            <param-name>configClass</param-name>
            <param-value>com.jflyfox.component.config.BaseConfig</param-value>
        </init-param>
    </filter>
    <filter-mapping>
        <filter-name>jfinal</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
    

错误页面配置

  • 自定义错误处理:配置404和500错误页面
    <error-page>
        <error-code>404</error-code>
        <location>/pages/error/404.html</location>
    </error-page>
    <error-page>
        <error-code>500</error-code>
        <location>/pages/error/500.html</location>
    </error-page>
    

1.2 pom.xml文件的作用

依赖管理

  • 声明外部库依赖:通过<dependency>元素管理项目依赖
    <dependency>
        <groupId>log4j</groupId>
        <artifactId>log4j</artifactId>
        <version>1.2.16</version>
    </dependency>
    

关键元素说明

  • groupId:标识库所属的组织或项目(如log4j)
  • artifactId:指定具体的库名称(如log4j)
  • version:明确需要的库版本号(如1.2.16)

二、SQL注入漏洞审计

2.1 LIKE注入漏洞

漏洞位置

  • 文件路径src/main/java/com/jflyfox/modules/admin/friendlylink/FriendlylinkController.java
  • 关键方法whereLike()方法

漏洞代码分析

// 不安全代码示例
whereLike("name", value); // 直接拼接用户输入到SQL语句

// 实际执行的SQL语句
String sql = "SELECT * FROM friendlylink WHERE name LIKE '%" + value + "%'";
System.out.println("执行的SQL: " + sql); // 用于调试输出

漏洞原理

  • 使用%符号进行LIKE查询时直接拼接用户输入
  • 未对用户输入进行适当的过滤和参数化处理
  • 攻击者可构造特殊输入实现SQL注入

验证方法

  • 使用sqlmap工具检测name参数:
    sqlmap -u "http://target.com/page?name=test" --dbs
    

2.2 ORDER BY注入

漏洞特征

  • ORDER BY子句直接使用用户提供的排序参数
  • 缺乏严格的输入验证和参数化处理

审计关键字

  • order by
  • sort
  • 排序参数直接拼接

三、XSS漏洞审计

3.1 存储型XSS漏洞

漏洞位置

  • 文件路径CommentController.java
  • 关键方法saveComment()方法

漏洞代码分析

// 内容处理逻辑
JFlyFoxUtils.delScriptTag(content); // 尝试过滤script和style标签

// delScriptTag方法实现
public static String delScriptTag(String html) {
    // 使用正则表达式删除<script>和<style>标签
    String regexScript = "<script[^>]*?>[\\s\\S]*?<\\/script>";
    String regexStyle = "<style[^>]*?>[\\s\\S]*?<\\/style>";
    html = html.replaceAll(regexScript, "");
    html = html.replaceAll(regexStyle, "");
    return html;
}

漏洞原理

  • 过滤逻辑不完整,仅删除<script><style>标签
  • 未处理其他XSS向量(如on事件、javascript:伪协议等)
  • 前端实体编码可被绕过

绕过方法

  • 直接修改接口请求,使用其他XSS载荷
  • 使用未过滤的HTML标签和属性
  • 利用编码绕过技术

攻击验证

  • 构造恶意评论内容:
    
    
  • 通过直接修改接口请求绕过前端过滤

四、代码审计方法论

4.1 关键审计点

SQL注入审计要点

  1. 字符串拼接查询:查找+操作符拼接SQL语句
  2. LIKE查询:检查%符号的使用方式
  3. ORDER BY动态排序:验证排序参数的处理
  4. 直接执行SQL:审查execute()query()等方法

XSS审计要点

  1. 用户输入输出:跟踪用户输入的数据流
  2. 过滤函数审查:检查过滤逻辑的完整性
  3. 编码处理:验证输出编码的实施情况
  4. 上下文分析:区分HTML、属性、JavaScript等不同上下文

4.2 工具辅助审计

静态分析工具

  • IDEA搜索功能:使用关键字搜索(Dao、SQL、whereLike等)
  • FindBugs/SpotBugs:检测潜在的安全漏洞
  • SonarQube:代码质量和安全检查

动态测试工具

  • sqlmap:SQL注入自动化检测
  • Burp Suite:XSS和Web漏洞测试
  • 自定义测试脚本:针对特定逻辑的测试

五、修复建议

5.1 SQL注入修复

参数化查询

// 使用预编译语句
String sql = "SELECT * FROM friendlylink WHERE name LIKE ?";
PreparedStatement pstmt = connection.prepareStatement(sql);
pstmt.setString(1, "%" + value + "%");

输入验证

  • 对用户输入进行白名单验证
  • 限制输入长度和字符类型
  • 对特殊字符进行转义处理

5.2 XSS修复

全面过滤方案

// 使用成熟的HTML过滤库
import org.owasp.encoder.Encode;

String safeHtml = Encode.forHtml(content);

输出编码

  • 根据输出上下文使用适当的编码
  • HTML实体编码:Encode.forHtml()
  • JavaScript编码:Encode.forJavaScript()
  • URL编码:Encode.forUri()

内容安全策略(CSP)

  • 实施严格的CSP策略
  • 限制脚本执行来源
  • 减少XSS攻击的影响范围

六、总结

本审计案例展示了典型的Java Web应用安全漏洞:

  1. 配置文件分析:理解web.xml和pom.xml的安全意义
  2. SQL注入漏洞:LIKE查询和ORDER BY排序中的注入风险
  3. XSS漏洞:过滤不完整导致的存储型XSS

审计建议:

  • 采用参数化查询杜绝SQL注入
  • 实施全面的输入验证和输出编码
  • 使用专业的安全测试工具进行验证
  • 建立代码审计的标准化流程

通过系统性的代码审计和安全开发实践,可有效提升Web应用的安全性。

JFinal4.5 CMS Java代码审计教学文档 一、web.xml与pom.xml文件分析 1.1 web.xml 文件的作用 基本配置功能 定义应用名称和上下文路径 :通过 <display-name> 标签定义Web应用在服务器管理界面显示的名称 设置欢迎页面 :使用 <welcome-file-list> 标签指定用户访问根目录时的默认页面 Servlet配置 Servlet定义和映射 :配置Servlet名称、实现类和URL映射模式 过滤器配置 过滤器定义 :配置请求预处理和后处理逻辑 JFinal特定配置 JFinal过滤器配置 :所有请求都经过JFinal过滤器处理 错误页面配置 自定义错误处理 :配置404和500错误页面 1.2 pom.xml文件的作用 依赖管理 声明外部库依赖 :通过 <dependency> 元素管理项目依赖 关键元素说明 groupId :标识库所属的组织或项目(如log4j) artifactId :指定具体的库名称(如log4j) version :明确需要的库版本号(如1.2.16) 二、SQL注入漏洞审计 2.1 LIKE注入漏洞 漏洞位置 文件路径 : src/main/java/com/jflyfox/modules/admin/friendlylink/FriendlylinkController.java 关键方法 : whereLike() 方法 漏洞代码分析 漏洞原理 使用 % 符号进行LIKE查询时直接拼接用户输入 未对用户输入进行适当的过滤和参数化处理 攻击者可构造特殊输入实现SQL注入 验证方法 使用sqlmap工具检测name参数: 2.2 ORDER BY注入 漏洞特征 ORDER BY子句直接使用用户提供的排序参数 缺乏严格的输入验证和参数化处理 审计关键字 order by sort 排序参数直接拼接 三、XSS漏洞审计 3.1 存储型XSS漏洞 漏洞位置 文件路径 : CommentController.java 关键方法 : saveComment() 方法 漏洞代码分析 漏洞原理 过滤逻辑不完整,仅删除 <script> 和 <style> 标签 未处理其他XSS向量(如on事件、javascript:伪协议等) 前端实体编码可被绕过 绕过方法 直接修改接口请求,使用其他XSS载荷 使用未过滤的HTML标签和属性 利用编码绕过技术 攻击验证 构造恶意评论内容: 通过直接修改接口请求绕过前端过滤 四、代码审计方法论 4.1 关键审计点 SQL注入审计要点 字符串拼接查询 :查找 + 操作符拼接SQL语句 LIKE查询 :检查 % 符号的使用方式 ORDER BY动态排序 :验证排序参数的处理 直接执行SQL :审查 execute() 、 query() 等方法 XSS审计要点 用户输入输出 :跟踪用户输入的数据流 过滤函数审查 :检查过滤逻辑的完整性 编码处理 :验证输出编码的实施情况 上下文分析 :区分HTML、属性、JavaScript等不同上下文 4.2 工具辅助审计 静态分析工具 IDEA搜索功能 :使用关键字搜索(Dao、SQL、whereLike等) FindBugs/SpotBugs :检测潜在的安全漏洞 SonarQube :代码质量和安全检查 动态测试工具 sqlmap :SQL注入自动化检测 Burp Suite :XSS和Web漏洞测试 自定义测试脚本 :针对特定逻辑的测试 五、修复建议 5.1 SQL注入修复 参数化查询 输入验证 对用户输入进行白名单验证 限制输入长度和字符类型 对特殊字符进行转义处理 5.2 XSS修复 全面过滤方案 输出编码 根据输出上下文使用适当的编码 HTML实体编码: Encode.forHtml() JavaScript编码: Encode.forJavaScript() URL编码: Encode.forUri() 内容安全策略(CSP) 实施严格的CSP策略 限制脚本执行来源 减少XSS攻击的影响范围 六、总结 本审计案例展示了典型的Java Web应用安全漏洞: 配置文件分析 :理解web.xml和pom.xml的安全意义 SQL注入漏洞 :LIKE查询和ORDER BY排序中的注入风险 XSS漏洞 :过滤不完整导致的存储型XSS 审计建议: 采用参数化查询杜绝SQL注入 实施全面的输入验证和输出编码 使用专业的安全测试工具进行验证 建立代码审计的标准化流程 通过系统性的代码审计和安全开发实践,可有效提升Web应用的安全性。