我网站的部分申请流程是用户必须证明网站的所有权。我迅速将一些代码汇总到一起,但直到现在还没有意识到它可能存在一些漏洞。
这样的事情:
$generatedCode="9s8dfOJDFOIesdsa";
$url="http://anyDomainGivenByUser.com/verification.txt";
if(file_get_contents($url)==$generatedCode){
//verification complete!
}
为file_get_contents()提供用户提供的网址是否有任何威胁?
编辑:上面的代码只是一个例子。 generatedCode显然有点复杂,但仍然只是一个字符串。
答案 0 :(得分:6)
是的,这可能是Server Side Request Forgery vulnerability - 如果$url
是动态的,您应该验证它是外部互联网地址,并且该方案指定HTTP或HTTPS协议。理想情况下,您只使用HTTPS协议,然后验证证书以防止任何DNS hijacking种可能性。
如果$url
是用户可控制的,他们可以使用您的应用程序作为代理来替换内部IP地址并探测防火墙后面的网络。例如,如果他们将主机设置为$url
到192.168.123.1
,则您的脚本会请求http://192.168.123.1/verification.txt
,并且由于响应不同,他们可能会确定另一台计算机位于托管环境中有效和无效内部地址之间的时间。这被称为Timing Attack。这可能是您可能不一定要公开公开的服务器。当然,这不太可能孤立地攻击您的网络,但它是Information Leakage的一种形式,可能有助于攻击者枚举您的网络以备另一次攻击。
您需要在每次请求时验证URL或已解析的DNS,否则攻击者可以将此设置为外部以通过验证,然后立即将其重新指向内部地址以便开始探测。
file_get_contents本身似乎是安全的,因为它检索URL并将其放入字符串中。只要您没有在任何脚本引擎中处理字符串或使用is作为任何执行参数,您应该是安全的。 file_get_contents
也可用于检索本地文件,但如果您验证它是一个有效的面向HTTP的URL,如上所述,如果您决定向用户显示{{{},则此措施应该会阻止读取本地文件1}}包含在不匹配的情况下。此外,如果您要在网站上的任何位置显示verification.txt
的内容,则应确保输出已正确编码以防止XSS。