java dwr 漏洞_实战渗透-基于DWR框架下的漏洞探测
前言
未经授权,禁止转载!
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框架下的漏洞探测相关推荐
- 第14篇:Struts2框架下Log4j2漏洞检测方法分析与总结
Part1 前言 Log4j2漏洞出现有大半年的时间了,这个核弹级别的漏洞危害很大,但是这个漏洞检测起来却很麻烦,因为黑盒测试无法预判网站哪个应用功能在后台调用了log4j2记录日志功能.目前通用 ...
- STM32F103C8T6基于Arduino框架下利用定时器跑RBG灯闪烁
STM32F103C8T6基于Arduino框架下利用定时器跑RGB灯闪烁
- ESP32C3基于Arduino框架下的 ESP32 RainMaker开发示例教程
ESP32C3基于Arduino框架下的 ESP32 RainMaker开发示例教程 ESP RainMaker ESP RainMaker 是乐鑫推出的一个端到端平台.基于该平台,用户无需管理基础设 ...
- STM32G070RBT6基于Arduino框架下点灯程序
STM32G070RBT6基于Arduino框架下点灯程序 ✨说明:Arduino STM32系列开发环境搭建不在本示例范围内. 相关篇<[硬件开源电路]STM32G070RBT6开发板> ...
- 基于vue框架下使用Element-UI获取文件MD5值并上传
基于vue框架下使用Element-UI获取文件MD5值并上传 使用插件: spark-md5 .vue页面 <el-uploadclass="avatar-uploader idca ...
- STM32G070RBT6基于Arduino框架下eeprom使用示例
STM32G070RBT6基于Arduino框架下eeprom使用示例
- STM32G070RBT6基于Arduino框架下串口数据接收使用示例
STM32G070RBT6基于Arduino框架下串口数据接收使用示例 相关篇<STM32G070RBT6基于Arduino串口的使用>
- 基于Lua框架下的合宙ESP32C3+1.5‘’Eink墨水屏天气时钟+OLED开源项目分享
基于Lua框架下的合宙ESP32C3+1.5''Eink墨水屏天气时钟+OLED项目分享
- 基于Lua框架下Air103使用U8g2库驱动I2C OLED图像显示
基于Lua框架下Air103使用U8g2库驱动I2C OLED屏幕图像演示
最新文章
- termux python 打开摄像头_【图片】将termux打造成合格的python环境(假装是教程贴)_termux吧_百度贴吧...
- 文巾解题 6. Z 字形变换
- python在web可以开发吗_Python Web开发
- 两台老机器,AMD K6-2和Intel C366
- 分享40佳非常有创意的社交网络图标集
- 10个实战及面试常用Linux Shell脚本编写
- 存储过程 触发器 约束
- 网络打印机 RPC服务器不可用
- SAP License:整理的SAP参数文件
- HTML5开发 Web SQL Database 本地数据库
- [渝粤教育] 广东-国家-开放大学 21秋期末考试土力学与地基基础10445k1
- 工作中的注意事项、细节
- 【Scratch画图100例】图40-scratch实心五角星 少儿编程 scratch编程画图案例教程 考级比赛画图集训案例
- 墨者Apache Struts2远程代码执行漏洞(S2-009)复现题解
- 计算机图形学流体仿真mac网格,用于图形学的流体仿真20教程.docx
- 爱加密:终止手游之殇,全面解决手游安全问题
- 全栈开发和web开发_成为全栈开发人员
- 2019年第四季度书单
- RTCP关键协议翻译
- 分支定界算法理解(摘抄)