某地区行业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 → procesdatadopost

6. 任意文件删除漏洞

6.1 漏洞位置

文件:AbstractFileDownloadServlet.java → doGet方法

漏洞分析

// 文件读取后调用doFollowupProcess方法
// LogFileDownloadServlet重写该方法实现文件删除

POC构造:结合文件读取漏洞,触发后续删除操作

7. 安全加固建议

7.1 输入验证

  • 对所有用户输入进行严格校验
  • 使用白名单机制验证文件路径和类型
  • 实施参数化查询防止SQL注入

7.2 文件操作安全

  • 限制文件操作目录
  • 校验文件后缀和内容类型
  • 避免使用用户提供的文件名直接操作

7.3 权限控制

  • 实现严格的路径规范化
  • 加强会话管理和权限验证
  • 避免鉴权逻辑绕过

7.4 代码安全

  • 避免直接拼接SQL语句
  • 使用安全的文件操作方式
  • 实施安全的文件上传机制

本教学文档详细分析了JSF框架应用中的各类安全漏洞,涵盖了漏洞原理、利用方法和防护措施,为安全审计人员提供完整的技术参考。

 全屏