3

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

像这样的东西:

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

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

为 file_get_contents() 提供用户提供的 url 是否有任何威胁?

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

4

1 回答 1

7

是的,这可能是一个服务器端请求伪造漏洞——如果$url是动态的,您应该验证它是一个外部互联网地址,并且该方案指定了 HTTP 或 HTTPS 协议。理想情况下,您只使用 HTTPS 协议,然后验证证书以防止任何DNS 劫持的可能性。

如果$url是用户可控的,他们可以替换内部 IP 地址并使用您的应用程序作为代理来探测防火墙后面的网络。例如,如果他们将主机设置$url192.168.123.1,您的脚本将请求http://192.168.123.1/verification.txt并且由于有效和无效内部地址之间的响应时间不同,他们可能能够确定另一台机器处于托管环境中。这称为定时攻击。这可能是您可能不一定希望公开的服务器。当然,这不太可能单独攻击您的网络,但它是信息泄漏的一种形式,可能会帮助攻击者枚举您的网络,为另一次攻击做好准备。

您需要在每次请求时验证 URL 或解析的 DNS,否则攻击者可以将其设置为外部以通过验证,然后立即将其重新指向内部地址以开始探测。

file_get_contents本身看起来是安全的,因为它检索 URL 并将其放入字符串中。只要您不在任何脚本引擎中处理字符串或使用 is 作为任何执行参数,您就应该是安全的。file_get_contents也可用于检索本地文件,但如果您验证它是一个有效的面向 Internet 的 HTTP URL,如上所述,如果您决定向用户显示verification.txt不匹配的内容,则此措施应防止读取本地文件。此外,如果您要verification.txt在网站上显示任何地方的内容,则应确保正确编码输出以防止 XSS。

于 2013-07-15T11:38:56.620 回答