基本上,我想创建一个站点来向人们展示如何通过模拟来防止PHP漏洞。但是,我不能让他们自己工作。
我想看看一个变量是否等于一个有效的页面(我只有两个用于测试),如果是,加载该页面。否则,我看看它是否包含"../".如果两者都不是真的,它只是说"找不到页面"。
这是我到目前为止的代码:
<?php
if($page=="LOLone.php" || $page=="LOLtwo.php"){
echo "Welcome, look at the LOL cats!";
include($page);
}else if(strlen(strstr($page,"../"))>0){
echo "Congrats, you found the transversal attack vulnerability!";
}else{
echo "Page not found!";
}
?>
每当我尝试使用page=LOLone.php
(或LOLtwo.php
甚至../
)时,它都会说"找不到页面!我可以不以我的方式比较变量,或者这可能是我的网络主机安全地玩吗?我有点困惑,但我对 PHP 比较陌生,所以我觉得我错过了一些简单的东西......
好吧,我犯了一个简单的错误。一个非常大的。不好意思。感谢您的所有回复,我会非常小心我自己的服务器被黑客入侵。在这个例子中,我应该是干净的,因为我让它只在它等于指定值时才包含页面。再次感谢。
尝试
$webPath = "/home/www/somesite/userpages" ;
$pages = array(
"page1.php",
"page2.php"
);
//http://testing.com?page=xxx
$_GET['page'] = "../../etc/passwd" ; //Sample Hack
//Prepare Include
$page = realpath($_GET['page']);
$dirName = dirname($page);
$baseName = basename($page) . ".php";
if($dirName != $webPath)
{
die("Die! Die! Die!");
}
if(!in_array($baseName, $pages))
{
die("Kill! Kill! Kill!");
}
echo "Welcome" ;
替换
if(strlen(strstr($page,"../"))>0)
跟
if( strpos($page, '../') !=== false )
现在,您正在检查strstr()
调用的长度,这不是正确的方法。现在它改为检查../
的位置 - 如果它不是假的 - 我们确定字符串有它。
但是,您可能应该从另一个更简单的项目开始 - 因为一个项目只会确保您的服务器因您忘记停止的漏洞而被黑客入侵。