某地区行业OA系统审计
字数 1592
更新时间 2026-01-31 12:06:48
JSF框架应用安全审计教学文档
1. 项目架构分析
1.1 路由机制
- 核心技术:JSF (JavaServer Faces)框架
- 路由处理:通过FacesServlet处理
.jsf文件的请求 - 渲染机制:将
.jsf请求映射到对应的.jsp或.xhtml文件 - 示例:请求
/admin/info.jsf实际渲染/admin/info.jsp - 业务调用:使用JSF表达式语言,如
<h:commandButton调用对应类和方法
1.2 代码结构分析
- Controller基类:继承
ExtAbstractManagedBean的类作为Controller - 数据访问层:
- MyBatis框架
- JAF框架自带的数据库查询接口
2. 鉴权机制分析
2.1 SessionFilter鉴权
文件位置:SessionFilter.java
// 关键代码逻辑:
// 1. 从session获取LoginInfo.ROOT凭据
// 2. 如果URL包含"login.jsf"则放行
// 3. 使用getRequestURI()获取路径,存在绕过风险
安全漏洞:
- 绕过方法:构造特殊路径,如
/admin/info.jsf;login.jsf - 根本原因:路径检查不严格,未进行路径规范化
2.2 UrlFCFilter鉴权
文件位置:UrlFCFilter.java
// 关键代码逻辑:
// 1. 使用getServletPath()获取规范化路径
// 2. 通过inURLFCS()方法进行白名单校验
// 3. 路由规则从XML配置文件加载
配置文件:WEB-INF/classes/config/sysauth_newoa.xml
- 使用dom4j解析XML配置
- 提取url和functioncode映射关系
- 存储到静态Map中
3. SQL注入漏洞
3.1 漏洞位置
文件:PubilcFuncions.java → insertformitem方法
3.2 漏洞分析
// 漏洞代码流程:
// 1. 161-169行:根据fwlx值构造SQL语句
// 2. 直接拼接sbname和sbvalue参数
// 3. 参数来源:Mtypetem中的键值对,完全用户可控
3.3 调用链分析
入口点:TranformdomoaServlet.java → dopost方法
// 参数传递流程:
// 1. procesdata方法调用sepformitem方法
// 2. siname和sivalue从fileitem.getFieldName()获取
// 3. 用户表单数据直接拼接到SQL语句
3.4 POC构造
POST /target_endpoint.jsf
Content-Type: multipart/form-data
参数包含恶意SQL语句
4. 任意文件读取漏洞
4.1 第一处漏洞
文件:AbstractFileDownloadServlet → doget方法
漏洞代码:
// 55行:this.getFile()获取文件
// 从request参数获取url,直接new File
// 93行:RandomAccessFile读取文件内容并输出
利用条件:继承类LogFileDownloadServlet重写getFile方法
// 添加了HTTP协议检查,但else分支仍存在风险
POC示例:
/download.jsf?url=../../WEB-INF/web.xml
4.2 第二处漏洞
文件:CreatefwfromjoaServlet → doPost方法
漏洞代码:
// 接收dir参数,直接new FileInputStream
// 读取文件内容写入响应
POC示例:
/create.jsf?dir=/etc/passwd
5. 任意文件上传漏洞
5.1 第一处漏洞
文件:TransferDataServlet.java → transferData方法
漏洞分析:
// 102行:upload.parseRequest解析上传
// 文件后缀从原始文件名通过.分割获取
// 218行:file.getFieldName() + suffix构造保存文件名
安全风险:
- 后缀完全可控
- 使用原始文件名,存在目录穿越
- 无文件类型校验
POC构造:上传恶意文件,文件名包含路径穿越字符
5.2 第二处漏洞
文件:AttachFileBean.java → getUploadFiles方法
漏洞分析:
// 542行:解析上传表单
// 649行:从attach.getSfilename()获取原始文件名
// 663行:使用原始后缀保存文件
5.3 第三处漏洞
文件:PubilcFuncions.java → sepgwfile方法
漏洞分析:
// 76行:new File(原始文件名)
// 86行:拼接获取的后缀生成新文件
// 89行:直接写入上传文件数据
调用链:TranformdomoaServlet → procesdata → dopost
6. 任意文件删除漏洞
6.1 漏洞位置
文件:AbstractFileDownloadServlet.java → doGet方法
漏洞分析:
// 文件读取后调用doFollowupProcess方法
// LogFileDownloadServlet重写该方法实现文件删除
POC构造:结合文件读取漏洞,触发后续删除操作
7. 安全加固建议
7.1 输入验证
- 对所有用户输入进行严格校验
- 使用白名单机制验证文件路径和类型
- 实施参数化查询防止SQL注入
7.2 文件操作安全
- 限制文件操作目录
- 校验文件后缀和内容类型
- 避免使用用户提供的文件名直接操作
7.3 权限控制
- 实现严格的路径规范化
- 加强会话管理和权限验证
- 避免鉴权逻辑绕过
7.4 代码安全
- 避免直接拼接SQL语句
- 使用安全的文件操作方式
- 实施安全的文件上传机制
本教学文档详细分析了JSF框架应用中的各类安全漏洞,涵盖了漏洞原理、利用方法和防护措施,为安全审计人员提供完整的技术参考。