Overview
函数 fsockopen() 将使用资源 URI 的用户控制数据启动与第三方系统的网络连接。攻击者可以利用此漏洞代表应用程序服务器发送一个请求,因为此请求将自应用程序服务器内部 IP 地址发出。
Details
当攻击者可以影响应用程序服务器建立的网络连接时,将会发生 Server-Side Request Forgery。网络连接源自于应用程序服务器内部 IP 地址,因此攻击者将可以使用此连接来避开网络控制,并扫描或攻击没有以其他方式暴露的内部资源。
示例:在下列示例中,攻击者将能够控制服务器连接至的 URL。
$url = $_GET['url'];
$c = curl_init();
curl_setopt($c, CURLOPT_POST, 0);
curl_setopt($c,CURLOPT_URL,$url);
$response=curl_exec($c);
curl_close($c);
攻击者能否劫持网络连接取决于他可以控制的 URI 的特定部分以及用于建立连接的库。例如,控制 URI 方案将使攻击者可以使用不同于 http 或 https 的协议,类似于下面这样: - up:// - ldap:// - jar:// - gopher:// - mailto:// - ssh2:// - telnet:// - expect:// 攻击者将可以利用劫持的此网络连接执行下列攻击: - 对内联网资源进行端口扫描。 - 避开防火墙。 - 攻击运行于应用程序服务器或内联网上易受攻击的程序。 - 使用 Injection 攻击或 CSRF 攻击内部/外部 Web 应用程序。 - 使用 file:// 方案访问本地文件。 - 在 Windows 系统上,file:// 方案和 UNC 路径可以允许攻击者扫描和访问内部共享。 - 执行 DNS 缓存中毒攻击。
Recommendations
请勿基于用户控制的数据建立网络连接,并要确保请求发送给预期的目的地。如果需要提