实战渗透-基于DWR框架下的漏洞探测
字数 1076 2025-08-20 18:18:40
基于DWR框架的漏洞探测与利用实战指南
1. DWR框架简介
DWR (Direct Web Remoting) 是一个用于改善Web页面与Java类交互的AJAX框架,允许JavaScript直接调用Java方法。由于其设计特性,DWR框架可能存在多种安全风险。
2. DWR框架常见漏洞
2.1 文件上传漏洞
漏洞代码示例:
public String upload(InputStream is, String fileName) {
String fileUploadPath = getFileUploadPath();
String file = String.valueOf(fileUploadPath) + "/" + IDCreator.getRandom() + "/" + fileName;
String fileExtName = FilenameUtils.getExtension(fileName);
File f = new File(file);
Properties pro = new Properties();
try {
long size = is.available();
FileUtils.copyInputStreamToFile(is, f);
pro.put("extName", fileExtName);
pro.put("originName", fileName);
pro.put("url", file);
pro.put("size", Long.valueOf(size));
} catch (IOException e) {
e.printStackTrace();
log.error("+ e);
return WebTools.getCallBackJSON(0, ");
}
return WebTools.getCallBackJSON(1, JSON.toJSONString(pro));
}
漏洞分析:
- 未对文件类型进行校验
- 直接使用用户提供的文件名
- 未限制上传路径
2.2 信息泄露漏洞
DWR框架默认提供DEBUG页面,路径通常为:
http://target/dwr/index.html
该页面会显示所有可用的DWR接口和方法,类似于.NET平台的ASMX接口文件。
3. DWR请求结构分析
DWR框架的AJAX请求具有特殊格式:
POST /dwr/call/plaincall/ExtAjax.upload.dwr HTTP/1.1
Host: target
Content-Type: text/plain
callCount=1
page=/somepage.jsp
httpSessionId=
scriptSessionId=${DWRSESSIONID}
c0-scriptName=ExtAjax
c0-methodName=upload
c0-id=0
c0-param0=string:test
batchId=0
关键参数说明:
scriptSessionId: 通常对应Cookie中的DWRSESSIONIDc0-scriptName: 对应dwr.xml中的javascript属性c0-methodName: 类中的方法名c0-param0: 第一个参数,依次类推(c0-param1, c0-param2等)
4. 文件上传漏洞利用
4.1 环境搭建
所需JAR包:
- commons-logging-1.1.1.jar
- dwr.jar
- commons-fileupload-1.3.1.jar
- commons-io-2.4.jar
示例Upload类:
package com.ajax;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import javax.servlet.http.HttpServletRequest;
import org.apache.commons.io.FileUtils;
import org.apache.commons.io.FilenameUtils;
import org.directwebremoting.WebContext;
import org.directwebremoting.WebContextFactory;
public class Upload {
public String upload(InputStream is, String fileName) throws IOException{
WebContext wc = WebContextFactory.get();
HttpServletRequest req = wc.getHttpServletRequest();
String realpath = req.getSession().getServletContext().getRealPath("upload");
String fn = FilenameUtils.getName(fileName);
String filepath = realpath + "/" + fn;
FileUtils.copyInputStreamToFile(is, new File(filepath));
return filepath;
}
}
web.xml配置:
<servlet>
<servlet-name>dwr-invoker</servlet-name>
<servlet-class>org.directwebremoting.servlet.DwrServlet</servlet-class>
<init-param>
<param-name>debug</param-name>
<param-value>true</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>dwr-invoker</servlet-name>
<url-pattern>/dwr/*</url-pattern>
</servlet-mapping>
dwr.xml配置:
<dwr>
<allow>
<create creator="new" javascript="Upload">
<param name="class" value="com.ajax.Upload" />
</create>
</allow>
</dwr>
4.2 漏洞利用步骤
- 通过Burp Suite拦截正常上传请求
- 分析请求结构,确定scriptName和methodName
- 构造恶意上传请求,上传Webshell
5. 黑盒测试方法
5.1 信息收集
- 检查HTML/JSP源代码中是否包含DWR相关引用
- 尝试访问默认DEBUG页面:
/dwr/index.html - 手动收集接口信息,查找路径为:
/dwr/interface/*.js
5.2 SQL注入测试
测试请求格式:
POST /dwr/call/plaincall/{{scriptName}}.{{methodName}}.dwr HTTP/1.1
Host: target
Content-Type: text/plain
callCount=1
page=/somepage.jsp
httpSessionId=
scriptSessionId=${DWRSESSIONID}
c0-scriptName={{scriptName}}
c0-methodName={{methodName}}
c0-id=0
c0-param0=string:test'
batchId=0
错误判断:
- 单引号导致错误
- 双引号返回正常
使用SQLMap:
sqlmap -u "http://target/dwr/call/plaincall/ExtAjax.method.dwr" --data="callCount=1&page=/&httpSessionId=&scriptSessionId=...&c0-scriptName=ExtAjax&c0-methodName=method&c0-id=0&c0-param0=string:1&batchId=0" --level=3
6. 防御建议
-
禁用DWR DEBUG页面:
<init-param> <param-name>debug</param-name> <param-value>false</param-value> </init-param> -
严格限制DWR暴露的类和方法
-
对文件上传功能实施严格校验:
- 文件类型白名单
- 文件名随机化
- 限制上传目录
-
对所有输入参数进行严格过滤
-
定期更新DWR框架到最新版本
7. 总结
DWR框架由于其设计特性,容易存在文件上传、SQL注入等安全风险。渗透测试时应重点关注:
- DWR DEBUG页面的信息泄露
- 文件上传接口的安全性
- 所有暴露方法的输入验证情况
- 接口的认证授权机制
通过系统化的测试方法,可以有效发现和利用DWR框架中的安全漏洞。