2012-04-22 83 views
0

基本上,我想创建一个网站来向人们展示如何通过模拟它们来防止PHP漏洞。但是,我无法让他们自己工作。简单的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,所以我觉得我缺少一些简单的...

好吧,我犯了一个简单的错误。一个非常大的一个。抱歉。 感谢所有回复,我会非常小心自己的服务器被黑客入侵。在这个例子中,我应该是干净的,因为只有当它等于一个指定的值时才会包含页面。再次感谢。

+0

我不记得PHP是否严格'else if'或'elseif'就像JS一样。 – Blake 2012-04-22 20:06:08

+9

如果你不能自己完成基础知识,那么新手就要努力教育他人。 – 2012-04-22 20:07:06

+0

谢谢Dagon。 :P 我明白如何利用它,我从来没有试图自己重现它。 – Vreality 2012-04-22 20:09:40

回答

1

尝试

$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" ; 
+0

谢谢巴巴。正是我在找什么。我完全忘了设置$ page = $ _ GET [“page”]; 我不能相信我忘了那个...... – Vreality 2012-04-22 20:16:33

+0

@ Vreality2007作为每个人,你也可以看到,你没有经历过。但我认为这是一个非常好的方式,可以让您了解更多关于PHP的知识,同时也了解安全性。继续学习! – 2012-04-22 20:19:14

+0

我希望你不会忘记接受...:D – Baba 2012-04-22 20:19:28

0

更换

if(strlen(strstr($page,"../"))>0) 

随着

if(strpos($page, '../') !=== false) 
现在

正确的,你正在检查的strstr()通话时长,这是不正确的方式走。现在它会检查../的位置 - 如果它不是假的 - 我们肯定知道该字符串有它。

但是,您应该从另一个更简单的项目开始 - 因为只会确保您的服务器因为您忘记停止的漏洞攻击而遭到黑客攻击。

+0

感谢您对建议的更改和提示。 – Vreality 2012-04-22 20:30:54