尽人事以听天命
1.Server-Side Request Forgery服务器端请求伪造学习
SSRF(服务器端请求伪造)攻击的详细解析与防范
SSRF(Server-Side Request Forgery,服务器端请求伪造) 是一种安全漏洞,它允许攻击者通过伪造服务器端的请求,从服务器发起对攻击者指定的目标地址的请求。这种攻击通常利用了服务端向外部或内部网络发起请求的功能,但服务器没有对请求目标进行有效的验证与过滤,从而使攻击者能够利用这一漏洞访问内部网络或发起恶意请求。
SSRF的攻击流程
攻击者利用服务器可以发起网络请求的能力,向其传递恶意的目标地址(URL)。服务器处理该请求后,实际上是在未经过适当验证的情况下向外部或内部系统发起了请求,攻击者可能通过此请求获取敏感信息或执行恶意操作。数据流的简化模型如下:
攻击者 -----> 服务器 -----> 目标地址
攻击者通过输入一个恶意 URL 或目标地址,服务器会根据该地址执行请求,结果将返回给攻击者。这种攻击手段不仅限于外部攻击,也可能是针对内部服务和私有网络的攻击。
SSRF攻击的常见场景
-
内网穿透:攻击者利用 SSFR 漏洞,向内部网络的地址发起请求,访问服务器不应访问的资源。例如,内部数据库、管理接口、云服务元数据接口等。
-
信息泄露:通过 SSFR,攻击者可能会从目标服务获取敏感信息,比如内部文件、服务器状态信息、API 密钥、私有数据等。
-
拒绝服务(DoS)攻击:攻击者可以通过伪造大量请求,导致目标服务器的资源消耗殆尽,进而导致服务不可用。
-
跨站请求伪造(CSRF):某些情况下,攻击者可以伪造请求来执行某些敏感操作,甚至修改服务端数据库、配置等。
-
执行远程代码:通过伪造请求,攻击者可能利用远程文件包含等漏洞执行恶意代码。
PHP中导致 SSRF 漏洞的函数
在 PHP 中,一些常见的函数,如果使用不当,可能会导致 SSRF 漏洞。以下是几种常见的漏洞来源:
-
file_get_contents()
:此函数用于从指定的文件或 URL 中读取内容。如果攻击者能够控制传入的 URL,且没有进行足够的过滤与校验,可能会导致服务器向任意外部或内部目标发起请求。$data = file_get_contents($url); // 攻击者可以控制 $url
如果
$url
是攻击者传入的值,攻击者可以通过构造恶意的 URL,迫使服务器向内部敏感资源发起请求,或者访问外部恶意网站。 -
fsockopen()
:此函数用于打开一个网络连接(TCP/UDP)。如果攻击者能够控制传入的目标地址,则可以通过该函数向任意地址发起请求。$fp = fsockopen($host, $port); // 攻击者可以控制 $host 和 $port
类似于
file_get_contents()
,如果没有严格的目标验证,攻击者可以利用该函数绕过访问控制,从而获取或修改系统资源。 -
curl_exec()
:curl_exec()
是 PHP 中用于发起 HTTP 请求的常用函数。攻击者如果能控制请求的 URL,便能够通过该函数对任意服务器发起请求。$ch = curl_init($url); // 攻击者可以控制 $url $response = curl_exec($ch);
攻击者可以通过伪造 URL,使得 PHP 服务器访问内部资源,甚至执行跨站请求。
SSRF漏洞的影响
-
泄露敏感信息:如果攻击者能够访问到服务器内部的敏感服务,如数据库、私有 API 或元数据接口,那么他们可以获取敏感的凭证信息、配置或用户数据。
-
内网攻击:攻击者利用服务器发起请求到内部网络,访问那些直接无法访问的内网资源。比如,通过发起请求到
http://127.0.0.1:8080
或其他本地地址,攻击者可以发现内部未暴露的服务。 -
绕过认证与访问控制:有些系统可能会在外部请求和内部请求上进行不同的权限控制。通过伪造请求,攻击者可能能够绕过这些限制,访问本不应访问的资源。
-
服务拒绝(DoS):攻击者可以通过不断发起恶意请求,导致目标服务的负载过高,进而导致系统崩溃或拒绝服务。
如何防范SSRF
-
严格验证和过滤 URL:最有效的防御措施是对传入的 URL 进行严格的验证,确保只允许特定的、受信任的地址进行请求。可以使用白名单机制,只允许已知的合法地址。
- 正则过滤:检查目标地址是否为合法的域名格式、是否符合预期的协议(如 HTTP、HTTPS)等。
- 限制协议:禁止请求本地回环地址(如
127.0.0.1
,localhost
)或保留地址范围(如169.254.x.x
,10.x.x.x
)。 - 限制端口范围:禁止访问特定的端口(例如:只允许访问 80 和 443 端口,禁止访问 22 端口等)。
-
采用 DNS 解析与 IP 地址校验:在服务器进行外部请求之前,进行 DNS 解析,并确保解析结果符合预期。避免通过 IP 地址直接访问可能绕过 DNS 检查的攻击。
-
使用安全的 HTTP 客户端:避免使用
file_get_contents()
、fsockopen()
等函数发起请求,改用更安全的 HTTP 客户端库,如 Guzzle 或 Symfony HTTP Client,并确保它们内置了安全检查和防护机制。 -
访问控制和最小权限原则:对于需要与外部通信的服务,应严格控制访问权限,尽量将与外部通信的服务限制在最小范围内。
-
检测与日志监控:通过监控服务器发起的请求,及时发现是否存在异常的请求行为,特别是来自不受信任来源的请求。
-
防止内网穿透:如果服务器部署在云环境中,可以限制请求只能访问特定的资源,避免对内部网络的请求。
总结
SSRF 是一种非常危险的攻击方式,攻击者利用服务器的外部请求能力发起恶意请求,可能导致数据泄露、内网穿透、拒绝服务等严重后果。为了防范 SSRF,开发者需要对传入的目标地址进行严格的验证和过滤,避免任意 URL 的请求执行,确保服务器的请求行为符合预期,且不会受到外部或恶意攻击的干扰。
2.Server-Side Request Forgery服务器端请求伪造实战
首先点击页面中的链接,观察url
直接将url地址修改为百度
/vul/ssrf/ssrf_curl.php?url=https://www.baidu.com
这个页面是由服务器发送curl请求返回的页面
请求网页,成功访问
文笔生疏,措辞浅薄,望各位大佬不吝赐教,万分感谢。
免责声明:由于传播或利用此文所提供的信息、技术或方法而造成的任何直接或间接的后果及损失,均由使用者本人负责, 文章作者不为此承担任何责任。
转载声明:儒道易行 拥有对此文章的修改和解释权,如欲转载或传播此文章,必须保证此文章的完整性,包括版权声明等全部内容。未经作者允许,不得任意修改或者增减此文章的内容,不得以任何方式将其用于商业目的。
CSDN:
https://rdyx0.blog.csdn.net/
公众号:儒道易行
https://mp.weixin.qq.com/mp/appmsgalbum?__biz=Mzg5NTU2NjA1Mw==&action=getalbum&album_id=1696286248027357190&scene=173&from_msgid=2247485408&from_itemidx=1&count=3&nolastread=1#wechat_redirect
博客:
https://rdyx0.github.io/
先知社区:
https://xz.aliyun.com/u/37846
SecIN:
https://www.sec-in.com/author/3097
FreeBuf:
https://www.freebuf.com/author/%E5%9B%BD%E6%9C%8D%E6%9C%80%E5%BC%BA%E6%B8%97%E9%80%8F%E6%8E%8C%E6%8E%A7%E8%80%85