2012-04-22 70 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