SSRF攻击

SSRF攻击

漏洞原理

SSRF(Server-Side Request Forgery:服务器端请求伪造) 是一种由攻击者构造,由服务端发起请求的一个网络攻击,一般用来在外网探测或攻击内网服务,其影响效果根据服务器用的函数不同,从而造成不同的影响。

SSRF 形成的原因大都是由于服务端提供了从其他服务器获取数据的功能且没有对目标地址做过滤与限制。比如从指定URL地址获取网页文本内容,加载指定地址的图片,下载等等。

💡 **攻击的数据流:攻击者—>服务器—>目标主机**

漏洞的产生

在PHP中的curl()file_get_contents()fsockopen() 等函数是几个主要产生ssrf漏洞的函数

curl()

<?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);
?>

function 定义一个函数,叫做curl,有一个参数,叫$url

curl_init()初始化一个curl会话后。将$url传入curl_setopt($ch,CURLOPT_URL,$url);

(curl_setopt($ch, CURLOPT_HEADER, 1) 这边是设定返回信息信息,是否要返回响应信息头这里的话可以注释掉)

注释后的:

没注释的:

然后通过 curl_exec 发起一个请求,这就是一个函数,接下来再设置一个get传参为变量url,然后再把这个变量url代入前面所创建的那个 curl函数

file_get_contents()

file_get_content函数从用户指定的url获取内容,然后指定一个文件名进行保存,并展示给用户。file_put_content函数把一个字符串写入文件中。

fsockopen()

fsockopen 函数实现对用户指定url数据的获取,该函数使用socket(端口)跟服务器建立tcp连接,传输数据。变量host为主机名,port为端口,errstr表示错误信息将以字符串的信息返回,30为时限

Precautions

SSRF利用

  • 内外网的端口和服务扫描

  • 主机本地敏感数据的读取

  • 内外网主机应用程序漏洞的利用

  • 内外网Web站点漏洞的利用

  • ......

💡 个人觉得**所有调外部资源的参数**都有可能存在SSRF漏洞

Gopher协议介绍

协议

file: 在有回显的情况下,利用 file 协议可以读取任意内容

dict:泄露安装软件版本信息,查看端口,操作内网redis服务等

gopher:gopher支持发出GET、POST请求:可以先截获get请求包和post请求包,再构造成符合gopher协议的请求。可用于反弹shell

http/s:探测内网主机存活

绕过方式

利用[::]

利用@

利用短链接

修改类型

利用Enclosed alphanumerics

利用句号

利用进制转换

利用协议

修复方式

1、过滤返回的信息,如果web应用是去获取某一种类型的文件。那么在把返回结果展示给用户之前先验证返回的信息是否符合标准。

2、统一错误信息,避免用户可以根据错误信息来判断远程服务器的端口状态。

3、限制请求的端口,比如80,443,8080,8090。

4、禁止不常用的协议,仅仅允许http和https请求。可以防止类似file:///,gopher://,ftp://等引起的问题。

5、使用DNS缓存或者Host白名单的方式。

最后更新于

这有帮助吗?