SSRF 漏洞简介

admin 2024年10月23日17:12:57评论30 views字数 4659阅读15分31秒阅读模式

SSRF 漏洞简介

漏洞描述

SSRF(全称Server-Side Request Forgery),即服务器端请求伪造。SSRF是一种由攻击者构造请求,服务端发起请求的漏洞。SSRF攻击的目标是外网无法访问的内部系统(服务端可以请求到与自身相连而与外网隔离的内部系统)。SSRF形成的原因是服务端提供了从其他服务器获取数据的功能,但没有对目标地址做过滤与限制,导致攻击者在服务端从指定URL地址获取内部系统的数据(文件、图片等)。

SSRF 漏洞简介
01

漏洞危害

1.1利用漏洞探测其他应用,如对服务器所在的内网环境进行端口扫描、指纹识别、资源访问等。

1.2利用漏洞攻击其它内网应用(如内网web应用、redis服务等),特定情况可结合内网RCE等漏洞突破互联网边界。

1.3利用file协议读取服务器本地文件,造成信息泄露风险。

1.4云上SSRF漏洞可读取云主机的元数据信息。

SSRF 漏洞简介
SSRF 漏洞简介
02

常见漏洞函数

2.1

SSRF 漏洞简介

Java中的SSRF

SSRF 漏洞简介
SSRF 漏洞简介

2.1.1、HttpURLConnection

当使用HttpURLConnection发起HTTP请求时,当没有对url参数进行限制,此时就可能存在SSRF漏洞,可以通过修改url参数来探测、攻击其他应用,漏洞代码示例如下:
String url = request.getParameter("url");
StringBuffer response = new StringBuffer();
URL pic = new URL(url);
HttpURLConnection con = (HttpURLConnection) pic.openConnection();
con.setRequestMethod("GET");
con.setRequestProperty("User-Agent", "Mozilla/5.0");

BufferedReader in = new BufferedReader(new InputStreamReader(con.getInputStream()));

SSRF 漏洞简介

2.1.2、httpClient

当使用httpClient获取图片二进制流时,如果url参数可控且没有对url参数进行校验,此时就可能存在SSRF漏洞,可以通过修改url参数来探测、攻击其他应用,漏洞代码示例如下:

CloseableHttpClient httpClient = HttpClients.createDefault();
HttpGet getRequest = new HttpGet(url);
HttpResponse response = httpClient.execute(getRequest);
SSRF 漏洞简介

2.1.3、Socket

当使用Socket建立链接判断ip对应端口的联通性,如果host和port参数是由用户输入,且没有对可访问的host和port进行限制,此时就会存在SSRF漏洞,利用SSRF进行端口扫描,漏洞代码示例如下:

String host = request.getParameter("host");

String port = request.getParameter("port");

socket = new Socket(host, port);

SSRF 漏洞简介

2.1.4、OkHttpClient

当使用OkHttpClient发起http请求时,如果url参数可控且没有对url参数进行校验,此时就可能存在SSRF漏洞,可以通过修改url参数来探测、攻击其他应用,漏洞代码示例如下:

String url = request.getParameter("url");
OkHttpClient httpClient = new OkHttpClient();
Request request = new Request.Builder()
      .url(url)
      .build();
Response response = httpClient.newCall(request).execute();

return response.body().string();

SSRF 漏洞简介

2.1.5、ImageIO

当使用ImageIO读取远程图片时,如果url参数可控且没有对url参数进行校验,此时就可能存在SSRF漏洞,可以通过修改url参数来探测、攻击其他应用,漏洞代码示例如下:

String imgurl = request.getParameter("url");
URL url = new URL(imgurl);
Image image = ImageIO.read(url);

return image;

2.2

SSRF 漏洞简介

Python中的SSRF

SSRF 漏洞简介
SSRF 漏洞简介

python中可以造成SSRF漏洞的库有pycurl、urllib、urllib3、requests等,如urllib库请求一个url,如果url参数可控且没有对url参数进行校验,此时就可能存在SSRF漏洞,可以通过修改url参数来探测、攻击其他应用,漏洞代码示例如下:

import urllib.request
req = urllib.request.urlopen("url")

print(req.read())

2.3

SSRF 漏洞简介

PHP中的SSRF

SSRF 漏洞简介
SSRF 漏洞简介

2.3.1、curl_exec()

通过get传参变量url,然后再把这个变量url代入curl函数,通过curl_exec发起一个请求,如果url参数可控且没有对url参数进行校验,此时就可能存在SSRF漏洞,可以通过修改url参数来探测、攻击其他应用,漏洞代码示例如下:

<?php
function curl($url){
    $ch = curl_init();
    curl_setopt($ch,CURLOPT_URL,$url);
    #curl_setopt($ch,CUPLOPT_HEADER,1);
    curl_exec($ch);
    curl_close($ch);
}
$url = $_GET['url'];
curl($url);

?>

SSRF 漏洞简介

2.3.2、file_get_contents()

file_get_content函数从用户指定的url获取内容,并展示给用户。当url参数可控就可能存在SSRF漏洞,此时可以利用file协议读取服务器上任意文件,漏洞代码示例如下:

<?php
$url = $_GET['url'];;
echo file_get_contents($url);

?>

SSRF 漏洞简介

2.3.3、fsockopen()

fsockopen 函数实现对用户指定url数据的获取,该函数使用socket(端口)跟服务器建立tcp连接,传输数据。变量host为主机名,port为端口,当host和port可控时就可能存在SSRF漏洞,通过遍历host和port进行内网端口扫描,漏洞代码示例如下:

<?php
$host=$_GET['url'];
$port=$_GET['port'];
$fp = fsockopen($host, $port, $errno, $errstr, 30);
if (!$fp) {
    echo "$errstr ($errno)<br />n";
} else {
    fwrite($fp);
    while (!feof($fp)) {
        echo fgets($fp, 128);
    }
    fclose($fp);

}?>

SSRF 漏洞简介
03

漏洞案例

SSRF 漏洞简介

3.1

利用SSRF探测攻击其他应用

SSRF 漏洞简介

SSRF漏洞形成的原因大多是由于服务端提供了从其他服务器获取数据的功能但没有对目标地址做过滤与限制。很多网站提供了从其他的服务器上获取数据的功能。通过指定的URL,网站可以从其他地方获取图片、下载文件、读取文件内容等。

如下站点存在一个输入指定站点url,获取对应站点内容的功能。由于没有对输入的url进行限制,就会存在SSRF漏洞,利用SSRF可以请求任意站点获取数据。如利用SSRF探测内网应用,发现一个tomcat应用。

SSRF 漏洞简介

通过对内网探测发现存在一个redis服务,此时可以利用SSRF漏洞攻击内网的redis服务

SSRF 漏洞简介

最终获取redis服务器权限,成功突破互联网边界进入内网

SSRF 漏洞简介

SSRF 漏洞简介

3.2

利用file协议读取本地文件

SSRF 漏洞简介
利用file协议来读取本地文件是SSRF漏洞的一种常见形式。攻击者可以构造一个指向本地文件的URL,当服务器端向该URL发起请求时,会读取本地文件的内容并返回给攻击者。如下图利用file协议读取服务器本地的/etc/passwd文件:

SSRF 漏洞简介

SSRF 漏洞简介

3.3

云上SSRF读取云主机的元数据

SSRF 漏洞简介

ECS实例元数据是指实例ID、VPC信息、网卡信息等实例属性信息,支持在ECS实例内部通过访问元数据服务(Metadata Service)获取。通过该获取方式,您无需登录控制台或调用API,在实例内部即可访问实例信息,可以更便捷、安全地配置或管理正在运行的实例或实例上的程序。例如,运行在ECS实例中的应用程序,可以通过访问实例元数据服务获取绑定到实例上的RAM角色身份凭证(STS),以在不硬编码凭证的情况下访问授权资源(如OSS、KMS、其他ECS等)。

各个云厂商都有自己的元数据metadata服务,下面的部分云厂商的元数据访问地址:

阿里云元数据地址:http://100.100.100.200/
腾讯云元数据地址:http://metadata.tencentyun.com/
华为云元数据地址:http://169.254.169.254/
亚马云元数据地址:http://169.254.169.254/
微软云元数据地址:http://169.254.169.254/
谷歌云元数据地址:http://metadata.google.internal/
如果实例中应用存在SSRF漏洞,那么元数据服务将会完全暴露在攻击者面前。攻击者可以通过SSRF漏洞访问元数据服务,获取实例RAM角色的临时访问凭据,最终获取实例控制权限。
如下存在SSRF漏洞的服务部署在云服务器上,因此可以利用SSRF漏洞访问元数据服务读取云主机元数据。该漏洞点会将读取结果返回为一张图片

SSRF 漏洞简介

访问图片地址即可获取读取到的数据

SSRF 漏洞简介

当实例授予了RAM角色时,访问元数据服务就会存在一个ram路径

SSRF 漏洞简介

访问/latest/meta-data/ram/security-credentials/<实例RAM角色名称> 即可获取临时凭据

SSRF 漏洞简介

最终利用临时凭据即可获取实例控制权限

SSRF 漏洞简介

SSRF 漏洞简介
SSRF 漏洞简介
04

漏洞修复建议

1、屏蔽或过滤返回的详细信息

2、仅允许HTTP和HTTPS请求,禁用高危协议如:file://、gopher://、ftp://、dict://等

3、限制请求的端口为http请求,如:80、443等

4、设置请求的URL白名单或者限制内网IP

5、统一错误信息,避免攻击者可以根据错误信息来判断远端服务器的端口状态

6、针对云上SSRF读取元数据可以设置元数据访问模式为加固模式,即通过token鉴权访问元数据接口

SSRF 漏洞简介

END

参考链接

https://github.com/Cryin/Paper/blob/master/JAVA%E4%BB%A3%E7%A0%81%E5%AE%A1%E8%AE%A1%E4%B9%8BSSRF%E6%BC%8F%E6%B4%9E.md

https://github.com/MisakiKata/python_code_audit/blob/master/SSRF.md

https://www.cnblogs.com/0x7e/p/14463234.html

https://www.cnblogs.com/zpchcbd/p/17839539.html

SSRF 漏洞简介

原文始发于微信公众号(搜狐安全):SSRF 漏洞简介

免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2024年10月23日17:12:57
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   SSRF 漏洞简介https://cn-sec.com/archives/3306571.html
                  免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉.

发表评论

匿名网友 填写信息