SSRF漏洞
SSRF参考视频 (源自哔哩哔哩): https://www.bilibili.com/video/BV1p4411X7UZ?p=60
参考文章 :
https://www.t00ls.net/articles-41070.html
https://www.freebuf.com/column/157466.html
https://www.sohu.com/a/241307328_653604
https://www.secshi.com/36469.html
https://blog.csdn.net/fageweiketang/article/details/88983921
http://www.mottoin.com/detail/170.html
https://www.freebuf.com/tag/ssrf%E6%BC%8F%E6%B4%9E
https://blog.csdn.net/qq_37133717/article/details/94647789
https://blog.csdn.net/weixin_34015566/article/details/88678240?utm_medium=distribute.pc_relevant_t0.none-task-blog-BlogCommendFromMachineLearnPai2-1.nonecase&depth_1-utm_source=distribute.pc_relevant_t0.none-task-blog-BlogCommendFromMachineLearnPai2-1.nonecase <衷心感谢!!!!!>
这些都是看完之后感觉很不错的文章,有时间的话,建议都点开读一读!!!
《《 推荐阅读 白帽大会上 猪猪侠 SSRF ppt 》》》
0X -1 SSRF漏洞解释
SSRF定义:是一种构造请求,由服务端发起的安全请求漏洞。
SSRF与CSRF的区别就是,一个是服务端向内网发起的请求,一个是客户端向服务端发起的请求。
什么是SSRF
SSRF(Server-Side Request Forgery:服务器端请求伪造) 是一种由攻击者构造形成由服务端发起请求的一个安全漏洞。一般情况下,SSRF攻击的目标是从外网无法访问的内部系统。SSRF 形成的原因大都是由于服务端提供了从其他服务器应用获取数据的功能且没有对目标地址做过滤与限制。比如从指定URL地址获取网页文本内容,加载指定地址的图片,下载等等。

正常情况下,客户端无法直接获取内网资源,只能通过先服务器请求,然后服务器再向内网资源发送请求,内网资源把数据传回给服务器,服务器在传回给客户端,(也就是说,服务器和内网之间是相互串通的,服务器可以访问任何内网的资源,但是客户端不可以直接向内网请求获取数据),在正常情况下,客户端对服务器的请求是有限制的,也就是说只能请求一部分内网的资源,但是如果服务器端存在SSRF 漏洞,客户端就可以随便向服务端发送请求,也就是说,客户端可以任意访问内网资源,造成内网资源泄露产生更大影响。
0X-2 SSRF漏洞代码分析
file_get_contents()
fsockopen()
curl_exec()
以上三个函数使用不当会造成SSRF漏洞
大部分 PHP 并不会开启 fopen 的 gopher wrapper file_get_contents 的 gopher 协议不能 URLencode file_get_contents 关于 Gopher 的 302 跳转有 bug,导致利用失败 curl/libcurl 7.43 上 gopher 协议存在 bug(%00 截断),经测试 7.49 可用 curl_exec() //默认不跟踪跳转, file_get_contents() // file_get_contents支持php://input协议
//存在SSRF漏洞代码 <?php function curl($curl){ $ch = curl_init(); //初始化代码 curl_setopt($ch,CURLOPT_URL,$url); curl_setopt($ch,CURLOPT_HEARER,0); //这里最后有个 0 这个0的目的是为了让返回的内容进行输出,如果是TURE则以字符串的形式进行输出 curl_exec($ch); //执行访问URL curl_close($ch); //关闭连接 } $url = $_GET['url']; //GET请求获取URL curl($url); ?>
PHP cURL 函数
cmd 命令 curl -V 可以查看curl的版本以及支持的协议
PHP支持的由Daniel Stenberg创建的libcurl库允许你与各种的服务器使用各种类型的协议进行连接和通讯。
libcurl目前支持http、https、ftp、gopher、telnet、dict、file和ldap协议。libcurl同时也支持HTTPS认证、HTTP POST、HTTP PUT、 FTP 上传(这个也能通过PHP的FTP扩展完成)、HTTP 基于表单的上传、代理、cookies和用户名+密码的认证。
PHP中使用cURL实现Get和Post请求的方法
这些函数在PHP 4.0.2中被引入。

看得出来哈,Curl函数确实很强大,如果安全意识不强未能过滤输入,确实影响很大!!!!!
这里也可以使用burpsuite对文件的路径(C:/windows/win.ini)进行猜解。

0x00 PHP伪协议
file:// — 访问本地文件系统 http:// — 访问 HTTP(s) 网址 ftp:// — 访问 FTP(s) URLs php:// — 访问各个输入/输出流(I/O streams) zlib:// — 压缩流 data:// — 数据(RFC 2397) glob:// — 查找匹配的文件路径模式 phar:// — PHP 归档 ssh2:// — Secure Shell 2 rar:// — RAR ogg:// — 音频流 expect:// — 处理交互式的流
当使用了Python 的urllib库,请求url为用户可控时,就可能存在ssrf漏洞,且可以通过漏洞python urllib http头注入实现对内网未授权仿问的redis 服务器getshell
Python 测试脚本代码:test.py
#!/usr/bin/env python3 import sys import urllib //urllib库在早期可用来写爬虫 import urllib.error import urllib.request url = sys.argv[1] try: info = urllib.request.urlopen(url).info() print(info) except urllib.error.URLError as e: print(e)
测试一下通过http头注入来向redis写入普通的文本:
./test.py http://127.0.0.1%0d%0aX-injected:%20header%0d%0ax-leftover:%20:12345/foo
显示:
GET /foo HTTP/1.1
Accept-Encoding: identity
User-Agent: Python-urllib/3.4
Host: 127.0.0.1
X-injected: header
x-leftover: :12345
Connection: close
0X-3 SSRF利用方式&&漏洞挖掘
SSRF可以做什么
- 敏感数据的读取 : 可以对外网服务器所在的内网、本地进行端口扫描,获取一些服务的banner信息,比如说用dict协议查看端口是否开放,当端口不开放的时候会有回显 。
- 攻击运行在内网或者本地的应用程序。
- 对内网web应用进行指纹识别,通过访问默认文件实现 。
- 内外网主机应用程序漏洞的利用 : 攻击内外网的web应用。sql注入、struct2、redis等。
![]()
![]()
![]()
![]()
![]()
发现这里有参数传入的是url,差不多可以断定就是在这个点存在ssrf漏洞了。上面我也讲过了,ssrf漏洞存在的情况,这一种比较普遍,就是传入url,并且服务器端验证没有对用户做出严格的过滤。
修改为一个不存在的端口,将会返回could not connect over HTTP to server![]()
- 利用SSRF可以探测内网开放的端口,这里需要注意的是,如果端口是开放的,访问会显示 403 禁止,如果端口是关闭的,则会显示 400 不存在
- 利用file协议读取本地文件等。
- Gopher
万能协议(利用Gopher攻击Redis、攻击Fastcgi 等
- FTP(S)/SMB(S)
匿名访问及爆破 - Tftp
UDP协议 发送UDP数据包 (DOS攻击(请求大文件,始终保持连接Keep-Alive Always)) - Telnet
SSH/Telnet匿名访问及爆破
【SSRF漏洞挖掘】
白盒审计 PHP相关函数
file_get_content()
curl -> curl_exec()
socket - fsockopen()
一、从web功能上寻找
1、分享:通过URL地址分享网页内容

2、转码服务:通过URL地址把原地址的网页内容调优使其适合手机屏幕浏览
3、在线翻译:通过URL地址翻译对应文本的内容 提供此功能的百度、有道等。有道翻译某处SSRF可通网易内网:
4、图片加载与下载:通过URL地址加载或下载图片 (就比如说个人资料里面需要用户上传头像图片,也可以上传图片的url地址,如果未对url地址进行过滤的话,就可能造成SSRF漏洞)
图片加载远程图片地址此功能用到的地方很多,但大多都是比较隐秘,比如在有些公司中的加载自家图片服务器上的图片用于展示。(此处可能会有人有疑问,为什么加载图片服务器上的图片 也会有问题,直接使用img标签不就好了,没错是这样,但是开发者为了有更好的用户体验通常对图片做些微小调整例如加水印、压缩等,就必须要把图片下载到服务器的本地,所以就可能造 成SSRF问题)。
5、图片、文章收藏功能
二、从URL关键字中寻找
share
wap
url
link
src
source
target
u
3g
display
sourceURL
imageURL
domain
..... 配合fofa或者sodan
三. 通用的SSRF实例
Weblogic配置不当,天生ssrf漏洞
Discuz x2.5/x3.0/x3.1/x3.2 ssrf漏洞
SSRF漏洞目前我还没有挖掘到,等什么时候凑巧挖到再来记录。。
0X-4 SSRF漏洞的验证
一、基本判断(排除法)
排除法一:
你可以直接右键图片,在新窗口打开图片,如果是浏览器上URL地址栏是http://www.baidu.com/img/bd_logo1.png,说明不存在SSRF漏洞
排除法二:
使用burpsuit等抓包工具来判断是否不是SSRF,首先SSRF是由服务端发起的请求,因此在加载图片的时候,是由服务端发起的,所有,在我们本地浏览器的请求中就不应该存在图片的请求,在此例子中,如果刷新当前页面,有如下请求,则可以判断不是SSRF。(前提是burpsuit截断图片的请求,默认是放行的)
用排除法的原因:
http://read.*******.com/image?imageUrl=http://www.baidu.com/img/bd_logo1.png
现在大多数修复SSRF的方法基本都是区分内外网来做限制(暂不考虑利用此问题来发起请求,攻击其他网站,从而隐藏攻击者IP,防止此问题就要做请求的地址的白名单了),如果我们请求
http://read.******.com/image?imageUrl=http://10.10.10.1/favicon.ico
而没有内容显示,我们是判断这个点不存在SSRF漏洞,还是http://10.10.10.1/favicon.ico这个地址被过滤了,还是http://10.10.10.1/favicon.ico这个地址的图片文件不存在,如果我们事先不知道http://10.10.10.1/favicon.ico这个地址的文件是否存在的时候是判断不出来是哪个原因的,所以我们采用排除法。
二、
三 、验证是否可以探测内网
经过简单的排除验证之后,我们就要验证看看此URL是否可以来请求对应的内网地址。在此例子中,首先我们要获取内网存在HTTP服务且存在favicon.ico文件的地址,才能验证是否是SSRF漏洞。
找存在HTTP服务的内网地址:
1、从漏洞平台中的历史漏洞寻找泄漏的存在web应用内网地址
2、通过二级域名暴力猜解工具模糊猜测内网地址
0X-5 SSRF漏洞练习
参考文章 : https://www.freebuf.com/column/157466.html
下载bWAPP靶场安装包下载地址:https://sourceforge.net/projects/bwapp/files/bWAPP/ 直接导入到 phpstudy中访问/install目录即可安装
进入到SSRF练习模块, 这个模块是文件包含加上SSRF漏洞利用,

可以看到,当language = 百度 的时候,直接就把百度的页面给包含了进来,这个题的主要思路是让你先文件包含进而利用SSRF漏洞
详细的文件包含漏洞可以看这里 https://www.freebuf.com/column/157466.html

0X-6 常见的过滤与绕过
0X-7 常见的修复方法
• 限制协议为HTTP、HTTPS,禁用不需要的伪协议,比如说file:///;gopher://;ftp://
• 禁止30x跳转
• 设置URL白名单或者限制内网IP
- 限制请求的端口为http常用的端口,比如,80,443,8080,8090
- 统一错误信息,避免用户可以根据错误信息来判断远端服务器的端口状态。







浙公网安备 33010602011771号