-1

基本的には、PHP の脆弱性をシミュレートして防止する方法を人々に示すサイトを作成したいと考えています。しかし、私はそれらを自分で機能させることはできません。

変数が有効なページ (テスト用に 2 つしかありません) と等しいかどうかを確認し、等しい場合はそのページを読み込みます。それ以外の場合は、「../」が含まれているかどうかを確認します。どちらも当てはまらない場合は、単に「ページが見つかりません」と表示されます。

これまでの私のコードは次のとおりです。

<?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に比較的慣れていないので、単純なものが欠けているように感じます...

わかりました、私は単純な間違いを犯しました。とても大きなものも。ごめん。すべての返信に感謝します。自分のサーバーがハッキングされることに細心の注意を払います。この例では、指定された値に等しい場合にのみページを含めるようにしているため、きれいにする必要があります。再度、感謝します。

4

2 に答える 2

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" ;
于 2012-04-22T20:13:15.147 に答える
0

交換

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

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

strstr()現在、通話の長さを確認していますが、これは正しい方法ではありません。代わりに、の場所をチェックし、../それが false でない場合は、文字列にその場所があることを確認します。

ただし、おそらく別のより単純なプロジェクトから始める必要があります。これは、停止するのを忘れたエクスプロイトが原因でサーバーがハッキングされることを確実にするためです。

于 2012-04-22T20:14:45.740 に答える