【BJDCTF2020】マークは猫が大好き(3解)

練習範囲: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=フラグ$フラグ=フラグ

 

おすすめ

転載: blog.csdn.net/m0_64118193/article/details/125742457