使用变量位置的 file_get_contents() 的安全漏洞

问题描述 投票:0回答:1

我的网站申请流程的一部分是用户必须证明网站的所有权。我很快就拼凑了一些代码,但直到现在才意识到它可能存在一些漏洞。

类似这样的:

$generatedCode="9s8dfOJDFOIesdsa";
$url="http://anyDomainGivenByUser.com/verification.txt";

if(file_get_contents($url)==$generatedCode){
//verification complete!
}

用户提供的 file_get_contents() 网址是否存在任何威胁?

编辑:上面的代码只是一个例子。 generatedCode 显然更复杂一些,但仍然只是一个字符串。

php security verification
1个回答
7
投票

是的,这可能是一个服务器端请求伪造漏洞 - 如果

$url
是动态的,您应该验证它是一个外部互联网地址并且该方案指定了HTTP或HTTPS协议。理想情况下,您应该仅使用 HTTPS 协议,然后验证证书以防止任何 DNS 劫持 的可能性。

如果

$url
是用户可控的,他们可以替换内部 IP 地址并使用您的应用程序作为代理来探测防火墙后面的网络。例如,如果他们将
$url
中的主机设置为
192.168.123.1
,您的脚本将请求
http://192.168.123.1/verification.txt
,并且由于有效和无效内部之间的响应时间差异,他们可能能够确定另一台计算机位于托管环境中。地址。这称为“定时攻击”。这可能是您不一定希望公开暴露的服务器。当然,这不太可能单独攻击您的网络,但它是“信息泄漏”的一种形式,可能会帮助攻击者枚举您的网络,为另一次攻击做好准备。 您需要在每次请求时验证 URL 或已解析的 DNS,否则攻击者可以将其设置为外部以通过验证,然后立即将其重新指向内部地址以开始探测。

file_get_contents()

本身看起来很安全,因为它检索 URL 并将其放入字符串中。只要您不在任何脚本引擎中处理该字符串或将其用作任何执行参数,您就应该是安全的。 file_get_contents()

 也可用于检索本地文件,但如果您如上所述验证它是面向互联网的有效 HTTP URL,则如果您决定向用户显示 
verification.txt 包含的内容,此措施应阻止读取本地文件如果不匹配。此外,如果您要在网站上的任何位置显示
verification.txt
的内容,您应该确保输出经过正确编码以防止 XSS。
    

© www.soinside.com 2019 - 2024. All rights reserved.