免责声明:用户因使用公众号内容而产生的任何行为和后果,由用户自行承担责任。本公众号不承担因用户误解、不当使用等导致的法律责任
目录
SSRF 漏洞利用所涉及的file_get_contents()协议介绍
案例二:pikachu靶场SSRF(file_get_contents)
基本概念
SSRF(Server-Side Request Forgery,服务器端请求伪造)漏洞是一种常见的网络安全漏洞,主要出现在服务器端应用程序中,是指攻击者能够利用服务器端发起对其他服务器或资源的请求,从而实现对目标服务器的信息获取、端口扫描、内网攻击等恶意操作。攻击者利用的是服务器端的功能,而不是客户端的漏洞,因此这种攻击具有很强的隐蔽性和危害性。
形成条件
- 服务器具有发起请求的功能:服务器端代码需要具备向其他服务器或网络资源发起请求的能力,例如使用 HTTP 请求库、FTP 库等进行网络通信。常见的情况是服务器端需要获取外部资源,如从其他服务器获取数据、下载文件等操作。
- 对用户输入过滤不严格:服务器端没有对用户输入的 URL 或其他相关参数进行充分的验证和过滤。攻击者可以通过构造恶意的 URL,将服务器的请求导向攻击者指定的目标,而服务器会误认为这是一个合法的请求并进行处理。
攻击过程
- 构造恶意请求:攻击者首先会分析目标服务器的功能和接口,找到可以利用的点,通常是那些接收 URL 参数的功能,如图片加载、文件下载、数据获取,转码,在线翻译等。然后,攻击者构造一个包含恶意目标地址的 URL,这个地址可能是内网中的其他服务器、敏感服务端口或者是攻击者控制的服务器。
- 发送请求:攻击者通过各种方式将构造好的恶意 URL 发送给目标服务器,可能是通过在浏览器中直接访问带有恶意参数的链接,也可能是通过提交表单、发送 HTTP 请求等方式,让目标服务器接收到这个恶意请求。
- 服务器端处理:目标服务器接收到请求后,由于没有对输入进行严格验证,会按照请求中的 URL 发起对目标地址的请求。此时,服务器就成为了攻击者的 “代理”,代替攻击者向恶意目标发送请求。
- 获取响应:如果目标地址是一个可访问的服务器或资源,服务器会收到来自目标的响应。攻击者可以通过各种方式获取这个响应内容,例如,如果服务器将响应内容返回给客户端,攻击者可以在客户端浏览器中查看;如果服务器对响应进行了处理并存储在数据库等地方,攻击者可以通过其他漏洞或手段获取这些处理后的信息。
常见利用场景
-
扫描资产:借助服务器作为代理,向不同的 IP 地址和端口发起请求,根据响应情况判断目标是否存活以及端口是否开放。由于服务器通常处于内网环境,能够访问内网中的其他设备,因此可以绕过外网的访问限制,对内部网络进行资产探测。
-
获取敏感信息:利用服务器对敏感信息资源的访问权限,通过构造恶意 URL 让服务器去访问这些资源,从而获取其中的敏感信息。常见的敏感信息包括配置文件、数据库文件、用户信息等。
-
攻击内网服务器(绕过防火墙):大多数防火墙主要对外部网络的访问进行限制,而服务器所在的内网环境通常允许内部设备之间的相互访问。攻击者利用 SSRF 漏洞,让服务器作为中间人向内网中的其他服务器发起攻击请求,从而绕过防火墙的防护。
-
访问大文件,造成溢出:当服务器在处理大文件时,可能会因为内存分配不足、缓冲区溢出等问题导致系统崩溃或出现异常。攻击者通过构造指向大文件的 URL,让服务器尝试访问这些大文件,从而引发溢出漏洞。
-
通过Redis写入WebShell或建立反弹连接:Redis 是一种常见的内存数据库,若 Redis 服务配置不当,允许外部访问且没有进行有效的身份验证,攻击者可以通过 SSRF 漏洞让服务器与 Redis 服务建立连接,并执行恶意命令,如写入 WebShell 或建立反弹连接。(参考:https://www.cnblogs.com/flokz/p/weblogic_SSRF.html)
PHP函数
以下函数使用不当极有可能引起SSRF漏洞
- curl_exec() :
cURL 是一个功能强大的用于传输数据的工具,支持多种协议,如 HTTP、HTTPS、FTP 等。
curl_exec()
函数用于执行一个 cURL 会话,即发送请求并获取响应
- file_get_contents():
函数用于将整个文件读入一个字符串,它不仅可以读取本地文件,还可以通过支持的协议(如 HTTP、FTP 等)读取远程文件。当用于读取远程文件时,实际上就是发起了一个网络请求
- fsockopen()
函数用于打开一个网络连接或一个 Unix 套接字连接,它提供了更底层的网络操作能力,允许开发者手动构造和发送请求。
SSRF 漏洞利用所涉及的部分curl协议介绍
- file 协议
- 只能读取当前被攻击机的文件,内网机器文件不能读取:通常情况下,利用 file 协议进行 SSRF 攻击时,如果服务器配置和权限设置允许,攻击者可以通过构造形如
file:///D:/1.txt
的 URL,让服务器读取本地文件系统中的文件内容。
- 只能读取当前被攻击机的文件,内网机器文件不能读取:通常情况下,利用 file 协议进行 SSRF 攻击时,如果服务器配置和权限设置允许,攻击者可以通过构造形如
- dict 协议
- 泄露安装软件版本信息,查看端口,操作内网 redis 服务等:dict 协议主要用于字典查询等操作,但在 SSRF 漏洞利用中,攻击者可以利用它向内部网络中的服务发送查询请求。例如,通过向特定端口的服务发送查询命令,获取软件版本等信息。如果内网中有 Redis 服务且配置不当,攻击者可以构造 dict 协议请求来执行 Redis 命令,如查看 Redis 的配置信息、获取或修改数据等。
- gopher 协议
- gopher 支持发出 GET、POST 请求。可以先截获 get 请求包和 post 请求包,再构造成符合 gopher 协议的请求。gopher 协议是 ssrf 利用中一个最强大的协议 (俗称万能协议)。可用于反弹 shell
- http/s 协议
- 探测内网主机存活:攻击者可以利用服务器的 SSRF 漏洞,构造 HTTP 或 HTTPS 请求,向内部网络中的不同 IP 地址和端口发送请求。通过观察服务器的响应情况,判断目标主机是否存活以及特定端口是否开放。例如,向
http://internal_ip:port
发送请求,如果能收到响应,说明对应的主机和端口可能是可达的,进而可以进一步探测和攻击。
- 探测内网主机存活:攻击者可以利用服务器的 SSRF 漏洞,构造 HTTP 或 HTTPS 请求,向内部网络中的不同 IP 地址和端口发送请求。通过观察服务器的响应情况,判断目标主机是否存活以及特定端口是否开放。例如,向
SSRF 漏洞利用所涉及的file_get_contents()协议介绍
- http/https 协议
- 功能:可用于获取指定网址的网页内容。当使用
http://
或https://
开头的 URL 作为参数时,函数会向对应的服务器发起请求,并尝试读取网页数据。 - SSRF 利用风险:如果
file_get_contents()
函数的参数由用户可控且未对输入进行严格过滤,攻击者可利用该函数发起针对内网或其他服务器的恶意请求。攻击者构造http://内网IP/敏感页面
的 URL,若服务器存在 SSRF 漏洞,可能获取内网敏感信息。
- 功能:可用于获取指定网址的网页内容。当使用
- file 协议
- 功能:用于读取本地文件内容。在本地文件操作场景下,使用
file://
协议可以指定本地文件路径,从而获取文件内容。 - SSRF 利用风险:攻击者可利用此协议读取服务器上的敏感文件,如
file:///etc/passwd
(Linux 系统下获取用户信息文件 )、file://c:\windows\system32\drivers\etc\hosts
(Windows 系统下获取主机名与 IP 映射信息文件),若服务器权限配置不当,可能导致大量敏感信息泄露。
- 功能:用于读取本地文件内容。在本地文件操作场景下,使用
- php 协议
- 功能:
php://
是 PHP 特有的伪协议,配合不同的流包装器实现特定功能。例如php://filter
用于对文件内容进行过滤处理,可实现对文件内容编码转换等操作,使用php://filter/read=convert.base64-encode/resource=目标文件
,能将目标文件内容进行 Base64 编码输出。 - SSRF 利用风险:攻击者利用
php://filter
读取 PHP 文件源码,将文件内容编码后获取,分析代码中的敏感信息、数据库连接字符串等,为进一步攻击提供便利。
- 功能:
- ftp 协议
- 功能:用于与 FTP 服务器进行交互,实现文件的上传和下载。使用
ftp://
协议可以指定 FTP 服务器地址、端口、用户名和密码等信息,从而操作 FTP 服务器上的文件。 - SSRF 利用风险:攻击者利用漏洞构造恶意的 FTP 请求,使服务器向攻击者控制的 FTP 服务器发送连接请求。攻击者可借此上传恶意文件到服务器,或下载服务器上的敏感文件。
- 功能:用于与 FTP 服务器进行交互,实现文件的上传和下载。使用
总之,SSRF 漏洞的核心在于攻击者能够利用一个存在SSRF漏洞的主机A去访问内网主机B,从而获取主机B的信息。
案例一:pikachu靶场的SSRF(curl)
观察URL变化
可以看到URL由变为了,根据SSRF漏洞原理此处调取了本机下的文件,所以我们如果修改这个URL的话能否实现调取其他主机资源。
使用http/https协议
当我们修改URL为url=http://www.baidu.com,可以看到pikachu服务器成功调取了别的主机资源。典型的SSRF服务器端请求伪造漏洞。
使用file协议
File协议:访问本地主机资源(也就是被攻击机的资源)
格式:格式为file://<主机名>/<路径> 但一般不会写主机名所以就直接是file:///(路径)
File:///D:/1.txt
可以看到使用file协议成功访问到主机D盘下的资源
dict协议
Dict协议:泄露安装软件版本信息,查看端口是否开启,操作内网redis服务等
当我输入端口21时根据反应时间得知未开放此端口
当我输入80端口时有回馈信息,说明主机80端口(超文本传输协议(HTTP)服务)开启
本主机未开放6379端口,如果开启就可以利用6379端口进行redis写入webshell操作控制主机
案例二:pikachu靶场SSRF(file_get_contents)
与上关相同只是多了一个file_get_contents()函数来进行文件读取
使用http
使用file
如果探测端口或探测存活主机只能使用http/https。此函数无法使用dict。
SSRF防范措施
- 输入验证与过滤
- 1采用白名单机制,只允许访问指定的域名、IP 或协议。
- 2利用正则表达式严格验证输入 URL 格式。
- 限制协议只允许http或https协议。
- 限制端口:只允许端口号为http常用端口如80,8080 等
- 过滤返回信息: 验证远程服务器对请求的响应
- 统一错误信息: 避免用户可以根据错误信息来判断远端服务器的端口状态
总结
本文知识点案例总归有限,如深入学习还需进一步通过漏洞靶场练习(参考CVE-2024-38109。CVE-2024-38206,CVE-2021-32639等学习)
(需要源代码联系博主免费领取!!还希望多多关注点赞支持,你的支持就是我的最大动力!!!)