在使用Acunetix扫描代码以查找vunerabilities之后,下面的脚本出现了问题:
“对域hit0yPI7kOCzl.bxss.me启动了HTTP请求,这表明此脚本容易受到SSRF (服务器端请求伪造)的攻击。”
我怎么才能阻止这一切?
<?php
$filename = strip_tags($_GET['url']);
if (substr($filename,0,4) !== 'http') {
die("Need a valid URL...");
}
$ext = pathinfo($filename, PATHINFO_EXTENSION);
switch ($ext) {
case "gif":
header('Content-Type: image/gif');
readfile($filename);
break;
case "png":
header('Content-Type: image/png');
readfile($filename);
break;
case "jpg":
default:
header('Content-Type: image/jpeg');
readfile($filename);
break;
}
?>发布于 2016-03-14 13:22:49
源如果在您的情况下问题是您的服务器将尝试从任何传递的url中获取数据。由于它有http://google.com内部的url参数,脚本将响应实际的谷歌网站内容。
为什么不好?例如,可以利用该漏洞绕过防火墙设置、访问服务器的内部网络或污染套接字连接,从而使您的服务器无法连接或连接到服务器,并且无法响应。
首先,如果您真的想用PHP提供静态文件,那么您应该考虑一下。最有可能的情况是,这项责任可以委托给web服务器。它甚至可能“服务”静态从第三方网站与当前的网络服务器,所以你应该认真考虑摆脱该代码。
如果您100%确定在这种情况下要与PHP一起使用,则应该在代码中添加限制。
url变量中使用可信域列表;在这种情况下,代码将如下所示:
<?php
$whitelist = [
'some.whitelisted.com',
'other.whitelisted.com'
];
$extensionMap = [
'gif' => 'image/gif',
'png' => 'image/png',
'jpg' => 'image/jpeg',
'jpeg' => 'image/jpeg'
];
$filename = strip_tags($_GET['url']);
$host = parse_url($filename, PHP_URL_HOST);
if(empty($host) || !in_array($host, $whitelist)) {
header('HTTP/1.1 404 Not Found');
exit;
}
$ext = pathinfo($filename, PATHINFO_EXTENSION);
if(!isset($extensionMap[$ext])) {
header('HTTP/1.1 404 Not Found');
exit;
}
header(sprintf('Content-Type: %s', $extensionMap[$ext]));
readfile($filename);https://stackoverflow.com/questions/35896093
复制相似问题