PHP_Code_Challenge-7 - $$変数をカバー

タイトル

<?php
include "flag.php";
$_403 = "Access Denied";
$_200 = "Welcome Admin";
if ($_SERVER["REQUEST_METHOD"] != "POST")
    die("BugsBunnyCTF is here :p...");
if ( !isset($_POST["flag"]) )
    die($_403);
foreach ($_GET as $key => $value)
    $$key = $$value;
foreach ($_POST as $key => $value)
    $$key = $value;
if ( $_POST["flag"] !== $flag )
    die($_403);
echo "This is your flag : ". $flag . "\n";
die($_200);

分析

if ($_SERVER["REQUEST_METHOD"] != "POST")
    die("BugsBunnyCTF is here :p...");

これは、POSTリクエストメソッドである必要があります

if ( !isset($_POST["flag"]) )
    die($_403);

POSTは、可変という名前のフラグが必要です

foreach ($_GET as $key => $value)
    $$key = $$value;
foreach ($_POST as $key => $value)
    $$key = $value;

$$被覆変数
最初のforeachは、任意の変数の値は、任意の変数付与することができる
入力変数缶の任意の値で第二のforeachを

if ( $_POST["flag"] !== $flag )
    die($_403);
echo "This is your flag : ". $flag . "\n";
die($_200);

$_POST["flag"]そして、なら$flagない正確に等しく、すなわち、値型、および出力が場合$_403
であれば正確に等しく、出力$flag、および$_200

POSTを試みるようになった状況を試してみてください

これは明らかにフラグ1ではありません
上記の変数は、カバーを見てみるとバックforeach ($_POST as $key => $value)$$key = $value;
1のときのみ、POST変数フラグ値を、$$key = $valu=> $flag = 1そうでない場合は存在するかもしれない変数はフラグがtrueフラグは変数flagの値に変更されている$ 1に割り当てられ、最初の二つの場合ので、これは変更することができない
ので、その値が他の変数と出力することができるように変更される前に、それが実際のフラグを必要と
出力のみができるdie($_403);die($_200);そう考えを変更フラグに覆われるように変数を使用することです真の前に$flag値カバレッジ$_403または$_200出力
変数カバーのforeachの時のみ、最初の場所をカバーする変数他の変数の値を利用することができます

知識ポイント

$$変数網羅


ソリューション

$ _200

実際のフラグカバー$_200と出力$_200

$_GET['_200']='flag';
$_POST['flag']=1;

foreach ($_GET as $key => $value)
    $$key = $$value;

等価$_200=$flag、それは本当のフラグを与えます$_200

foreach ($_POST as $key => $value)
    $$key = $value;
if ( $_POST["flag"] !== $flag )
    die($_403);

$flag図1に示すように、変更された$_POST['flag']タイプなどの等価、満たされていません$_POST["flag"] !== $flag

echo "This is your flag : ". $flag . "\n";
die($_200);

出力$_200trueフラグ出力であります

$ _403

カバー実際のフラグ$_403となるように構成された$_403エネルギー出力を

$_GET['_403']=flag$_GET["_POST['flag']"]=2
$_POST['flag']=1;

foreach ($_GET as $key => $value)
    $$key = $$value;

対応するが$_403=$flag、真のフラグを$_403、同様に$_POST['flag']=$2$2すなわち、存在していない$_POST['flag']空である[実際のコードが与えられるべきです]

foreach ($_POST as $key => $value)
    $$key = $value;
if ( $_POST["flag"] !== $flag )
    die($_403);

$flag図1に示すように変更され、$_POST['flag']範囲は満たすために$_POST["flag"] !== $flag出力を$_403

おすすめ

転載: www.cnblogs.com/Rain99-/p/12638275.html