博客园 首页 私信博主 显示目录 隐藏目录 管理
Live2D

SSRF服务器端请求伪造漏洞基础

0x00 思考

1、什么是SSRF漏洞?
2、SSRF漏洞的利用方式
3、SSRF漏洞绕过
4、SSRF漏洞加固

 

0x01 什么是SSRF漏洞

定义:
SSRF漏洞,中文全称为服务端请求伪造漏洞,是一种由攻击者构造一定的利用代码导致服务端发起漏洞利用请求的安全漏洞。一般情况下,SSRF攻击的应用是无法通过外网访问的,所以需要借助目标服务端进行发起,目标服务器可以链接内网和外网,攻击者便可以通过目标主机攻击内网应用。

漏洞成因:
由于业务需要,服务端程序需要从其他服务器应用中获取数据,例如获取图片、数据等,但是由于服务器没有对其请求的目标地址做过滤和限制,导致黑客可以利用此缺陷请求任意服务器资源,其中就包含隐匿在内网的应用。很多企业认为服务器在内网不会受到黑客攻击,便放任漏洞不管,不做补丁修复和版本升级,弱口令遍布内网。但是在SSRF漏洞面前这些漏洞都会成为黑客的“盘中餐”。
SSRF漏洞一般为HTTP/HTTPS方式出现,但类似TCP Connect方式也可以探测内网的IP活跃状态和端口的开放情况,但此类危害较小。

SSRF漏洞出现的位置:
服务器主动发起网络请求,例如HTTP/HTTPS/Socket
分享功能,通过URL分享网页内容,微博SSRF
图片加载、下载功能
邮件系统
api远程调用
只要是服务器可以主动发起网络请求便可能出现

SSRF漏洞的危害:
1. 对目标服务器所在的内网进行IP存活性扫描和端口扫描
2. 利用扫描的指纹信息判断开放的服务,从而对内网的主机进行攻击
3. 识别内网WEB应用指纹,判断应用类型进行攻击
4. 使用特定协议攻击应用(gopher、dict、file、FTP/SFTP等)

 

0x02 SSRF漏洞的利用方式

产生漏洞的函数
(1)file_get_contents()
(2)fsockopen()
(3)curl_exec()

file_get_contents函数:

 1 <?php
 2 if(isset($_POST['url']))
 3 {
 4     $content=file_get_contents($_POST['url']);
 5     $filename='./images/'.rand().'.img';\
 6     file_put_contents($filename,$content);
 7     echo $_POST['url'];
 8     $img="<img src=\"".$filename."\"/>";
 9 }
10 echo $img;
11 ?>

 


以上代码是获取post参数url中的值地址,通过file_get_contents获取url中的图片内容,保存到image目录下,然后显示。
file_get_contents函数使用前需要将php.ini的allow_url_fopen设置为ON。
以上的漏洞代码是存在SSRF漏洞的,可以控制url参数,自定义任意的URL,包括内网的URL,例如现在验证内网192.168.0.118是否开启了6379端口,可以做以下访问

 

 

 根据上图的报错信息可以看出开启了6379,接下来测试是否开启了8888端口

 

 

 测试8888端口时,根据上图提示,显示错误信息,说明端口未开放。接下来测试80端口,看显示结果(因为109的80端口是开放的,所以测试下,看回显内容)

 

 

 
访问109的80端口并未报错,此时,查看图片内容(选中图片,点复制链接),如下图:

 

 

 

发现请求的80端口的数据被写入到了图片问题中,符合代码预期。除了可以探测端口,也可以做文件包含漏洞的利用,这里不再细说文件包含的知识。

fsockopen函数:

<?php
$host=$_GET['url'];
$port=$_GET['port'];
# fsockopen(主机名称,端口号码,错误号的接受变量,错误提示的接受变量,超时时间)
$fp = fsockopen($host, intval($port), $errno, $errstr, 30);
if (!$fp) {
    echo "$errstr ($errno)<br />\n";
} else {
    $out = "GET / HTTP/1.1\r\n";
    $out .= "Host: $host\r\n";
    $out .= "Connection: Close\r\n\r\n";
    # fwrite() 函数将内容写入一个打开的文件中。
    fwrite($fp, $out);
    # 函数检测是否已到达文件末尾 ,文件末尾(EOF)
    while (!feof($fp)) {
        echo fgets($fp, 128);
    }
    fclose($fp);
}
?>

 


以上函数是接受url和port来制定socket访问的地址和端口,由于地址和端口用户可控,所以可以用来SSRF漏洞的利用。
例如可以做以下访问可以探测104的3306端口是否开放:

 

 

 curl_exec函数

1 <?php
2 $url = $_GET['url'];
3 $curlobj = curl_init($url);
4 echo curl_exec($curlobj);
5 ?>

 


curl_exec函数是危害最大的函数,也是需要重点讲的函数。以上代码是获取参数url的值,使用curl进行访问。
curl_exec的使用需要3个条件:
1、PHP版本>=5.3
2、开启extension=php_curl.dll
3、--wite-curlwrappers(编译PHP时用,此时不需要,可忽略)
使用dict协议探测22端口(后面会讲dict协议)

0x03 SSRF绕过方式

在SSRF漏洞利用时,经常被pass,接下来讲一下常规的绕过方法。
(1)攻击本机
  http://127.0.0.1:80
  http://localhost:22
(2)利用@绕过
  http://example.com@127.0.0.1
  # 这里的example.com可以任意替换,
(3)利用短地址绕过
  http://127.0.0.1可以变为http://suo.im/5UHEvD
  # 转换地址you很多,可以采用http://tool.chinaz.com/tools/dwz.aspx
(4)特殊域名绕过
  http://127.0.0.1.xip.io/
  http://www.margin.com.127.0.0.1.xip.io/
(5)利用Enclosed alphanumerics
  利用Enclosed alphanumerics
  ⓔⓧⓐⓜⓟⓛⓔ.ⓒⓞⓜ  >>>  example.com
  List:
  ① ② ③ ④ ⑤ ⑥ ⑦ ⑧ ⑨ ⑩ ⑪ ⑫ ⑬ ⑭ ⑮ ⑯ ⑰ ⑱ ⑲ ⑳
  ⑴ ⑵ ⑶ ⑷ ⑸ ⑹ ⑺ ⑻ ⑼ ⑽ ⑾ ⑿ ⒀ ⒁ ⒂ ⒃ ⒄ ⒅ ⒆ ⒇
  ⒈ ⒉ ⒊ ⒋ ⒌ ⒍ ⒎ ⒏ ⒐ ⒑ ⒒ ⒓ ⒔ ⒕ ⒖ ⒗ ⒘ ⒙ ⒚ ⒛
  ⒜ ⒝ ⒞ ⒟ ⒠ ⒡ ⒢ ⒣ ⒤ ⒥ ⒦ ⒧ ⒨ ⒩ ⒪ ⒫ ⒬ ⒭ ⒮ ⒯ ⒰ ⒱ ⒲ ⒳ ⒴ ⒵
  Ⓐ Ⓑ Ⓒ Ⓓ Ⓔ Ⓕ Ⓖ Ⓗ Ⓘ Ⓙ Ⓚ Ⓛ Ⓜ Ⓝ Ⓞ Ⓟ Ⓠ Ⓡ Ⓢ Ⓣ Ⓤ Ⓥ Ⓦ Ⓧ Ⓨ Ⓩ
  ⓐ ⓑ ⓒ ⓓ ⓔ ⓕ ⓖ ⓗ ⓘ ⓙ ⓚ ⓛ ⓜ ⓝ ⓞ ⓟ ⓠ ⓡ ⓢ ⓣ ⓤ ⓥ ⓦ ⓧ ⓨ ⓩ
  ⓪ ⓫ ⓬ ⓭ ⓮ ⓯ ⓰ ⓱ ⓲ ⓳ ⓴
  ⓵ ⓶ ⓷ ⓸ ⓹ ⓺ ⓻ ⓼ ⓽ ⓾ ⓿
(6)利用句号代替点绕过
  127.0.0.1 变为127。0。0。1
(7)使用其他进制绕过,例如127.0.0.1
  1、8进制格式:0177.0.0.1
  2、16进制格式:0x7F.0.0.1
  3、10进制整数格式:2130706433(转16进制,在转10进制)
  4、16进制整数格式:0x7F000001
  5、还有一种特殊的省略模式,例如127.0.0.1这个IP可以写成127.1
(8)特殊域名绕过(DNS解析)
  http://127.0.0.1.xip.io/
  # 会解析道本地的127.0.0.1

 

0x04 SSRF漏洞加固

1. 禁止302跳转,或者没跳转一次都进行校验目的地址是否为内网地址或合法地址。
2. 过滤返回信息,验证远程服务器对请求的返回结果,是否合法。
3. 禁用高危协议,例如:gopher、dict、ftp、file等,只允许http/https
4. 设置URL白名单或者限制内网IP
5. 限制请求的端口为http的常用端口,或者根据业务需要治开放远程调用服务的端口
6. catch错误信息,做统一错误信息,避免黑客通过错误信息判断端口对应的服务

posted @ 2020-05-27 08:54  My_Dreams  阅读(773)  评论(0编辑  收藏  举报
(function() { $("pre").addClass("prettyprint"); prettyPrint(); })();