[20][03][79] Server-Side Request Forgery
文章目录
- 1. 问题描述
- 2. 问题场景
- 2.1 函数详解
- 2.1.1 URL
- 2.1.2 URLConnection
- 2.1.3 HttpURLConnection
- 2.2 可能存在漏洞的点
- 2.2.1 HttpURLConnection
- 2.2.2 URLConnection
- 2.2.2.1 使用 file 协议
- 2.2.2.2 使用 netdoc 协议
- 2.2.2.3 使用 jar 协议
- 2.2.2.4 jar+http
- 2.2.3 ImageIO
- 2.2.4 HttpClients
- 2.2.5 OkHttpClient
1. 问题描述
SSRF(Server-Side Request Forgery): 服务端请求伪造, 是一个利用服务端探测内网服务资源的漏洞,用一个最简单的例子来理解这个漏洞:比如一个添加图文的功能,填入标题内容和封面图然后提交在网站前台显示,对于这个功能的图片它除了可以让你上传以外,还支持填入远程图片地址,如果你填入了远程的图片地址,则该网站会加载远程图过来进行显示,而如果程序写法不严谨或者过滤不严格,则加载图片地址的这个功能可能就可以包含进行一些恶意的脚本文件,或者你输入内网的 ip 或者一些系统的文件都会被解析执行
而一般我们是无法请求到系统上的文件的,内网的 ip 我们也是无法访问的,有了 SSRF 后,我们提交的加载连接是有服务器进行加载解析,实际上相当于我们以存在 SSRF 这个服务器为跳板进行的一些加载操作,我们在附一张图加深理解
我们知道了 SSRF 的原理后,自然就能想到其危害点有哪些
- 加载外部的恶意木马文件执行
- 加载内部的敏感文件程序自身的敏感文件
- 来访问内网进行内网端口的扫描、获取内网设备信息、枚举内网服务等
2. 问题场景
SSRF一般在一些请求url资源的时候会遇到,如?url=https://ip:prot/xxx.jpg请求别的站点的静态资源之类的
在 java中(高版本jdk)仅支持如下协议
- file
- ftp
- mailto
- http
- https
- jar
- netdoc
2.1 函数详解
2.1.1 URL
// 构造方法, 生成一个 URL 对象
new URL(String url)// 返回一个 URLConnection 实例, 表示与 URL 引用的远程对象的 URL
// 每次当调用此 URL 的协议处理程序的 URLStreamHandler.openConnection(URL) 方法时, 都会创建一个新的 URLConnection 实例
public URLConnection openConnection() throws IOException
应该注意的是,URLConnection 实例不会在创建时建立实际的网络连接, 这只会在调用 URLConnection.connect() 时发生
2.1.2 URLConnection
// 构造与指定 URL 的 URL 连接
protected URLConnection(URL url)
2.1.3 HttpURLConnection
与URLConnection的区别
- URLConnection 支持HTTP/邮件/文件传输协议
- HttpURLConnection 只支持 HTTP 协议, 通过 http 协议去做一些探测内网ip存活/端口探测/打redis(有回显)
2.2 可能存在漏洞的点
- HttpURLConnection.getInputStream
- URLConnection.getInputStream
- Request.Get.execute
- Request.Post.execute
- URL.openStream
- ImageIO.read
- OkHttpClient.newCall.execute
- HttpClients.execute
2.2.1 HttpURLConnection
这个类只能用http协议
@GetMapping("httpUrlConnection")
public ResponseVO httpUrlConnection(@RequestParam("url") String url) {try {// 创建一个连接URLConnection urlConnection = new URL(url).openConnection();// 强转为 HttpURLConnectionHttpURLConnection httpURLConnection = (HttpURLConnection) urlConnection;// 获取url中的资源BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(httpURLConnection.getInputStream(), StandardCharsets.UTF_8));StringBuilder stringBuilder = new StringBuilder();String data;while ((data = bufferedReader.readLine()) != null) {stringBuilder.append(data);}return ResponseVO.success(stringBuilder.toString());} catch (IOException e) {log.error(ERROR_MSG, url, e);return ResponseVO.fail(ResponseCodeEnum.FAIL, ERROR_RESPONSE_MSG);}
}
请求地址
GET hhtp://127.0.0.1:8080/ssrf/httpUrlConnection?url=http://ssrf.xxxx.ceye.io
2.2.2 URLConnection
@GetMapping("urlConnection")
public ResponseVO urlConnection(@RequestParam("url") String url, HttpServletResponse response) {URLConnection urlConnection = null;try {urlConnection = new URL(url).openConnection();} catch (IOException e) {log.error(ERROR_MSG, url, e);return ResponseVO.fail(ResponseCodeEnum.FAIL, ERROR_RESPONSE_MSG);}try (BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(urlConnection.getInputStream(), StandardCharsets.UTF_8))) {StringBuilder stringBuilder = new StringBuilder();String data;while ((data = bufferedReader.readLine()) != null) {stringBuilder.append(data);}return ResponseVO.success(stringBuilder.toString());} catch (IOException e) {log.error(ERROR_MSG, url, e);return ResponseVO.fail(ResponseCodeEnum.FAIL, ERROR_RESPONSE_MSG);}
}
2.2.2.1 使用 file 协议
GET http://127.0.0.1:8080/ssrf/urlConnection?url=file:///D:\code\idea_workspace\toalibaba\security-study\fortify\src\main\resources\mapper\UserMapper.xml
2.2.2.2 使用 netdoc 协议
GET http://127.0.0.1:8080/ssrf/urlConnection?url=netdoc:///D:\code\idea_workspace\toalibaba\security-study\fortify\src\main\resources\mapper\UserMapper.xml
2.2.2.3 使用 jar 协议
jar 协议语法,jar:{url}!/{entry},url是文件的路径,entry是想要解压出来的文件
当然这里url不仅仅是http协议,也可以是file协议或者netdoc
jar协议处理文件过程
- 下载 jar/zip 文件到临时文件中
- 提取出我们指定的文件
- 删除临时文件
2.2.2.4 jar+http
http://127.0.0.1:8080/ssrf/urlConnection?url=jar:http://127.0.0.1:4444/sql.txt.zip!/sql.txt
2.2.3 ImageIO
2.2.4 HttpClients
2.2.5 OkHttpClient
[20][03][79] Server-Side Request Forgery相关推荐
- SSRF (Server Side Request Forgery;服务端请求伪造)
1. URL 的结构 URL 的结构如下: URI = scheme:[//authority]path[?query][#fragment] 其中 authority 组件又分为 3 部分: [us ...
- SSRF测试(Server Side Request Forgery)(owasp)
原文 概述 web应用经常与内部或外部资源进行交互.虽然你可能期望只有预期的资源才能处理你发送的数据,然而处理不当的数据可能产生注入攻击.其中一种注入攻击是ssrf.一个成功的ssrf攻击能够授予攻击 ...
- 渗透测试-SSRF服务端请求伪造(Server-Side Request Forgery)
SSRF服务端请求伪造 漏洞原理 本次靶场的设计拓扑图 x.x.x.x:8080 - 判断 SSRF 是否存在 172.72.23.21 - SSRF 获取本地信息 172.72.23.1/24 - ...
- Asp.net MVC 3 防止 Cross-Site Request Forgery (CSRF)原理及扩展 安全 注入
原理:http://blog.csdn.net/cpytiger/article/details/8781457 原文地址:http://www.cnblogs.com/wintersun/archi ...
- CSRF(Cross-site request forgery)跨站请求伪造
为什么80%的码农都做不了架构师?>>> CSRF 背景与介绍 CSRF(Cross Site Request Forgery, 跨站域请求伪造)是一种网络的攻击方式,它在 2 ...
- 网络安全知识之Cross-Site Request Forgery (CSRF) 简介
1 CSRF简介 CSRF(Cross Site Request Forgery, 跨站域请求伪造)是一种网络的攻击方式,该攻击可以在受害者毫不知情的情况下以受害者名义伪造请求发送给受攻击站点,从而在 ...
- 循序渐进丨在openEuler 20.03操作系统上安装部署MogDB 2.1.1数据库
关于MogDB MogDB是云和恩墨基于openGauss开源数据库的内核进行研发,推出的一款安稳易用的企业级关系型数据库,具备金融级高可用和全密态计算的极致安全.面向多核处理器的极致性能.AI自诊断 ...
- DVWA 之 Cross Site Request Forgery (CSRF)
汇总链接: https://baynk.blog.csdn.net/article/details/100006641 ---------------------------------------- ...
- 鲲鹏服务器拦截系统调用,鲲鹏服务器unicfg工具适配OpenEuler 20.03问题
问题描述: OEM伙伴装备产测平台,使用OpenEuler 20.03的操作系统,使用读写BIOS参数的unicfg工具,无法执行,将其中的vars目录改成efivars目录后可以执行,但写入后没有生 ...
最新文章
- 机器学习2021 | 机器学习算法如何商业落地?
- oracle-单行函数
- 网贷,高利贷,套路贷为什么必须铲除?
- java8根据某个id删选_Java 8可选
- 《转》Java字符串驻留池
- PHP输出一段励志的话,一段励志的好句子,经典透彻!
- Linux开机自动启动软件/可执行程序方法
- azure db 设置时区_关于Azure Cosmos DB(以前称为DocumentDB)的8件事
- windows服务器上安装的有mysql环境怎么创建数据库_Windows环境MySQL数据库安装方法...
- [SCOI2016]萌萌哒
- 收到客户反馈的BUG,主管应该怎么办
- android 圆形相机预览拍照_Android Camera2 Api 实现预览和拍照
- Rhino.Inside.Revit教程
- 计算机管理如何格式化u盘,技术编辑器会教您如何格式化U盘
- java:换行符“\n”
- java文件gzip解压_如何在Java中解压缩GZip文件?
- 【图像融合】基于matlab小波变换灰色图像融合(含相关性、信噪比)【含Matlab源码 1841期】
- 移动产品设计书籍推荐
- govendor使用
- Confluence 文档协作平台安装部署笔记