从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 bysort排序参数直接拼接
三、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注入审计要点
- 字符串拼接查询:查找
+操作符拼接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注入修复
参数化查询
// 使用预编译语句
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应用安全漏洞:
- 配置文件分析:理解web.xml和pom.xml的安全意义
- SQL注入漏洞:LIKE查询和ORDER BY排序中的注入风险
- XSS漏洞:过滤不完整导致的存储型XSS
审计建议:
- 采用参数化查询杜绝SQL注入
- 实施全面的输入验证和输出编码
- 使用专业的安全测试工具进行验证
- 建立代码审计的标准化流程
通过系统性的代码审计和安全开发实践,可有效提升Web应用的安全性。