实战渗透-基于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中的DWRSESSIONID
  • c0-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 漏洞利用步骤

  1. 通过Burp Suite拦截正常上传请求
  2. 分析请求结构,确定scriptName和methodName
  3. 构造恶意上传请求,上传Webshell

5. 黑盒测试方法

5.1 信息收集

  1. 检查HTML/JSP源代码中是否包含DWR相关引用
  2. 尝试访问默认DEBUG页面:
    /dwr/index.html
    
  3. 手动收集接口信息,查找路径为:
    /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. 防御建议

  1. 禁用DWR DEBUG页面:

    <init-param>
        <param-name>debug</param-name>
        <param-value>false</param-value>
    </init-param>
    
  2. 严格限制DWR暴露的类和方法

  3. 对文件上传功能实施严格校验:

    • 文件类型白名单
    • 文件名随机化
    • 限制上传目录
  4. 对所有输入参数进行严格过滤

  5. 定期更新DWR框架到最新版本

7. 总结

DWR框架由于其设计特性,容易存在文件上传、SQL注入等安全风险。渗透测试时应重点关注:

  • DWR DEBUG页面的信息泄露
  • 文件上传接口的安全性
  • 所有暴露方法的输入验证情况
  • 接口的认证授权机制

通过系统化的测试方法,可以有效发现和利用DWR框架中的安全漏洞。

基于DWR框架的漏洞探测与利用实战指南 1. DWR框架简介 DWR (Direct Web Remoting) 是一个用于改善Web页面与Java类交互的AJAX框架,允许JavaScript直接调用Java方法。由于其设计特性,DWR框架可能存在多种安全风险。 2. DWR框架常见漏洞 2.1 文件上传漏洞 漏洞代码示例 : 漏洞分析 : 未对文件类型进行校验 直接使用用户提供的文件名 未限制上传路径 2.2 信息泄露漏洞 DWR框架默认提供DEBUG页面,路径通常为: 该页面会显示所有可用的DWR接口和方法,类似于.NET平台的ASMX接口文件。 3. DWR请求结构分析 DWR框架的AJAX请求具有特殊格式: 关键参数说明 : scriptSessionId : 通常对应Cookie中的DWRSESSIONID c0-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类 : web.xml配置 : dwr.xml配置 : 4.2 漏洞利用步骤 通过Burp Suite拦截正常上传请求 分析请求结构,确定scriptName和methodName 构造恶意上传请求,上传Webshell 5. 黑盒测试方法 5.1 信息收集 检查HTML/JSP源代码中是否包含DWR相关引用 尝试访问默认DEBUG页面: 手动收集接口信息,查找路径为: 5.2 SQL注入测试 测试请求格式 : 错误判断 : 单引号导致错误 双引号返回正常 使用SQLMap : 6. 防御建议 禁用DWR DEBUG页面: 严格限制DWR暴露的类和方法 对文件上传功能实施严格校验: 文件类型白名单 文件名随机化 限制上传目录 对所有输入参数进行严格过滤 定期更新DWR框架到最新版本 7. 总结 DWR框架由于其设计特性,容易存在文件上传、SQL注入等安全风险。渗透测试时应重点关注: DWR DEBUG页面的信息泄露 文件上传接口的安全性 所有暴露方法的输入验证情况 接口的认证授权机制 通过系统化的测试方法,可以有效发现和利用DWR框架中的安全漏洞。