SSRF漏洞
在了解ssrf漏洞前先了解curl命令的使用
1.curl命令的使用
基本格式:curl<参数值>请求地址
get请求:curl http://127.0.0.1
post请求:curl -X POST -d "a=1&b=2" http://127.0.0.1/(其中,使用-X参数来指定请求模式,-d参数来指定发送数据)
带cookie请求:curl -- cookie "PHPSESSID=xxxxxxx" http://127.0.0.1
上传文件:curl -F "file=@/etc/passwd" http://127.0.0.1(-F参数来表示上传文件请求,file是文件上传
中html form表单的name值,=@是格式,后面跟要上传的本地文件路径。)
协议补充
file协议:一般用于读取本地文件。
Gopher协议:是一个可以发送自定义TCP数据的协议。(由于可以发送任意的TCP数据,这也大大拓宽了攻击面。)将HTTP包转换成Gopher只需要把特殊字符URL编码即可。
eg:
http请求:
发送的URL格式:
(其他的TCP数据只要将其不可见字符URL编码后按照格式即可发送。)
dict协议:当我们发送dict://127.0.0.1:80/test123时,我们可以使用nc监听80端口,然后接收到的数据如下:
我们仅仅能控制其中一行内容,那么对于这个协议可以用于攻击那些支持单行命令的应用,如Redis。Redis的控制命令(如SET user admin)是可以单行输入执行的。而像HTTP这类命令必须有一个跨多行的完整的请求格式才算正常请求,不然就不会被解析。
2. SSRF漏洞的基础概念
(1)概念:SSRF(Server-Side Request Forgery:服务器端请求伪造) 是一种由攻击者构造形成由服务端发起请求的一个安全漏洞。ssrf是利用存在缺陷的web应用作为代理攻击远程和本地的服务器。一般情况下,SSRF攻击的目标是从外网无法访问的内部系统。(正是因为它是由服务端发起的,所以它能够请求到与它相连而与外网隔离的内部系统)
(2)形成原因:SSRF 形成的原因大都是由于服务端提供了从其他服务器应用获取数据的功能且没有对目标地址做过滤与限制。
3.SSRF漏洞挖掘
(1)分享:通过URL地址分享网页内容

(2)在线翻译:通过URL地址翻译对应文本的内容。提供此功能的国内公司有百度、有道等。

(3)图片、文章收藏功能:此处的图片、文章收藏中的文章收蒙就类似于分享功能中获取URL地址中title以及文本的内容作为显示,目的还是为了更好的用户体验。
例如title参数是文章的标题地址,代表了一个文章的地址链接,请求后返回文章是否保存,收藏的返回信息。如果保存,收藏功能采用了此种形式保存文章,则在没有限制参数的形式下可能存在SSRF。
(4)从URL关键字中寻找
利用google 语法加上这些关键字去寻找SSRF漏洞
share
wap
url
link
src
source
target
u
display
sourceURl
imageURL
domain

4.产生SSRF漏洞的函数
1、file_get_contents:
下面的代码使用file_get_contents函数从用户指定的url获取图片。然后把它用一个随即文件名保存在硬盘上,并展示给用户。
<?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;
?>


2、sockopen():
以下代码使用fsockopen函数实现获取用户制定url的数据(文件或者html)。这个函数会使用socket跟服务器建立tcp连接,传输原始数据。
<?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;
}
}
?>
3、curl_exec():
cURL这是另一个非常常见的实现,它通过 PHP获取数据。文件/数据被下载并存储在"curled"文件夹下的磁盘中,并附加了一个随机数和".txt"文件扩展名。
<?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漏洞利用(危害)
主要是用来进行内网探测,也可以说是内网信息收集,存活主机和开放端口。
1.可以对外网服务器所在的内网进行端口扫描,获取一些服务的banner信息;
2.有时候还可以攻击运行在内网或本地的应用程序;比如通过ssrf给内网的redis写定时任务,实现反弹shell
3.对内网web应用进行指纹识别;
4.攻击内外网的web应用,比如struts2,sq注入等;