前言

未经授权,禁止转载!

0x01

前段时间,在对某站群系统进行代码审计时,发现某处DWR-AJAX接口存在文件上传漏洞

代码层: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));

}

可以清楚的看到这里是一处文件上传漏洞,在进行存储的过程中,未进行任何文件类型效验操作。

由于是dwr框架,可以通过dwr.xml 查看映射关系

注:

在没有源码的情况下,可以通过访问dwr框架的接口页面

默认路径:http://localhost/dwr/index.html

有点类似于.NET平台下的ASMX接口文件,且里面提供了测试方法。

0x02

DWR框架所创建的ajax请求与常见的POST请求有所不同

DWR框架请求格式:

page 为来访页面

scriptSessionId 一般为自动生成或对应Cookie中的DWRSESSIONID

c0-scriptName 调用脚本名 对应 dwr.xml 中的 javascript

如: scriptName = javascript = ExtAjax

其中param为调用自定义的类methodName 为类中的方法名

c0-param0为参数,如方法接收3个参数,那么就是0到2

如:c0-param0 ,c0-param1,c0-param2 按顺序传递

0x03

由于目标系统是文件上传,需要输入流InputStream,那么格式应该还会有所不同,所以这里我按照网上的相关方法,在本地搭建了一个环境

所需jar包: (要实现文件上传必须引入commons-fileupload包)commons-logging-1.1.1.jar

dwr.jar

commons-fileupload-1.3.1.jar

commons-io-2.4.jar

Upload.Javapackage 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{

//dwr通过WebContext取得HttpServletRequest

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));//将输入流直接copy成文件

return filepath;

}

}

在web.xml中配置dwr<?xml version="1.0" encoding="UTF-8"?>

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"

version="4.0">

dwr-invoker

org.directwebremoting.servlet.DwrServlet

debug

true

dwr-invoker

/dwr/*

在dwr.xml 配置映射关系 com.ajax.Upload 为功能处理类所在的位置

创建jsp页面

String path = request.getContextPath();

String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";

%>

dwr上传文件

function upload(){

var file = dwr.util.getValue("myfile");

Upload.upload(file,file.value,function(data){

alert(data);

});

}

这里需要注意:dwr/interface/Upload.js

是dwr.xml中的映射关系,只要配置了映射关系,就会自动生成。无需创建

如果启动过程中,Tomcat出现报错,请讲当前目录PUT到ROOT目录

0x04

成功访问:

这里使用写好的JSP文件尝试上传文件。

用Burp开启抓包功能。

看起来没什么区别,就是转成了multipart/form-data。

那么要对目标系统上进行上传,只需更改scriptName和methodName即可

成功Getshell

0x05 黑盒下的探测手段

在对某高校系统进行测试时,通过主页的HTMl源代码中发现了其系统使用DWR框架

尝试访问/dwr/index.html 获取接口目录

返回500,要么是dwr.xml配置错误,或者是做了防护手段,如果说配置错误的话,接口可能都用不了。这里还是选择了测一下。

由于/dwr/index.html无法访问,那么只能手动收集接口信息。

在各个HTML ,JSP页面上查找路径为/dwr/interface/*.js

的js文件。此文件只有配置dwr.xml的映射才会生成,所以一般要调用ajax接口,就必须引入此js文件。

如下:

前面为scriptName,后面为methodName。p0,p1,p2 代表需要3个参数

将其各个接口进行了整合。然后提取methodName。尝试进行SQL注入。

这里需要注意:

如果返回结果提示

java.lang.Throwable

造成这个错误的原因有很多:

1.参数类型不对 2. 缺少必要参数 3. 接口自身问题

个人建议使用string: 数字

如下:

这里我构造请求方法,对每个接口都进行测试。

请求地址为:http://localhost/dwr/call/plaincall/{{ scriptName }}.{{ methodName }}.dwr

正文:callCount=1

page={{ 任意JSP地址均可 }}

httpSessionId= {{ 可留空 }}

scriptSessionId={{Cookie中的 DWRSESSION}}

c0-scriptName={{ scriptName }}

c0-methodName={{ methodName }}

c0-id=0

c0-param0=string(类型): 值 {{ 参数 1}}

batchId=0

最终在某个接口下面发现SQL注入:

单数单引号(错误)

双数双引号(正常)

由于服务器没有WAF,尝试使用SQLMAP.

注意需要 --level 3 不然跑不出来的

java dwr 漏洞_实战渗透-基于DWR框架下的漏洞探测相关推荐

  1. 第14篇:Struts2框架下Log4j2漏洞检测方法分析与总结

     Part1 前言  Log4j2漏洞出现有大半年的时间了,这个核弹级别的漏洞危害很大,但是这个漏洞检测起来却很麻烦,因为黑盒测试无法预判网站哪个应用功能在后台调用了log4j2记录日志功能.目前通用 ...

  2. STM32F103C8T6基于Arduino框架下利用定时器跑RBG灯闪烁

    STM32F103C8T6基于Arduino框架下利用定时器跑RGB灯闪烁

  3. ESP32C3基于Arduino框架下的 ESP32 RainMaker开发示例教程

    ESP32C3基于Arduino框架下的 ESP32 RainMaker开发示例教程 ESP RainMaker ESP RainMaker 是乐鑫推出的一个端到端平台.基于该平台,用户无需管理基础设 ...

  4. STM32G070RBT6基于Arduino框架下点灯程序

    STM32G070RBT6基于Arduino框架下点灯程序 ✨说明:Arduino STM32系列开发环境搭建不在本示例范围内. 相关篇<[硬件开源电路]STM32G070RBT6开发板> ...

  5. 基于vue框架下使用Element-UI获取文件MD5值并上传

    基于vue框架下使用Element-UI获取文件MD5值并上传 使用插件: spark-md5 .vue页面 <el-uploadclass="avatar-uploader idca ...

  6. STM32G070RBT6基于Arduino框架下eeprom使用示例

    STM32G070RBT6基于Arduino框架下eeprom使用示例

  7. STM32G070RBT6基于Arduino框架下串口数据接收使用示例

    STM32G070RBT6基于Arduino框架下串口数据接收使用示例 相关篇<STM32G070RBT6基于Arduino串口的使用>

  8. 基于Lua框架下的合宙ESP32C3+1.5‘’Eink墨水屏天气时钟+OLED开源项目分享

    基于Lua框架下的合宙ESP32C3+1.5''Eink墨水屏天气时钟+OLED项目分享

  9. 基于Lua框架下Air103使用U8g2库驱动I2C OLED图像显示

    基于Lua框架下Air103使用U8g2库驱动I2C OLED屏幕图像演示

最新文章

  1. termux python 打开摄像头_【图片】将termux打造成合格的python环境(假装是教程贴)_termux吧_百度贴吧...
  2. 文巾解题 6. Z 字形变换
  3. python在web可以开发吗_Python Web开发
  4. 两台老机器,AMD K6-2和Intel C366
  5. 分享40佳非常有创意的社交网络图标集
  6. 10个实战及面试常用Linux Shell脚本编写
  7. 存储过程 触发器 约束
  8. 网络打印机 RPC服务器不可用
  9. SAP License:整理的SAP参数文件
  10. HTML5开发 Web SQL Database 本地数据库
  11. [渝粤教育] 广东-国家-开放大学 21秋期末考试土力学与地基基础10445k1
  12. 工作中的注意事项、细节
  13. 【Scratch画图100例】图40-scratch实心五角星 少儿编程 scratch编程画图案例教程 考级比赛画图集训案例
  14. 墨者Apache Struts2远程代码执行漏洞(S2-009)复现题解
  15. 计算机图形学流体仿真mac网格,用于图形学的流体仿真20教程.docx
  16. 爱加密:终止手游之殇,全面解决手游安全问题
  17. 全栈开发和web开发_成为全栈开发人员
  18. 2019年第四季度书单
  19. RTCP关键协议翻译
  20. 分支定界算法理解(摘抄)

热门文章

  1. 搜狐视频P2P技术揭秘 - 流程篇
  2. 神华集团陕西公司《从技术骨干到优秀管理者转变》培训圆满结束!
  3. 任务11:“数码管”的静态显示和动态显示
  4. LCD1602原理与Proteus仿真
  5. 大数据定律与中心极限定理_为什么中心极限定理对数据科学家很重要?
  6. 自动驾驶入门小记(第一篇)
  7. 关于Algol语言简单介绍
  8. 计算机是我们的抽象方式的自动,米罗超现实抽象画的计算机自动生成
  9. Python之mock service
  10. 《代码敲不队》第二次作业:团队项目选题报告