主要考察变量覆盖漏洞
    先扫目录,扫到.git,用git_extract还原。

    1. <?php
    2. include 'flag.php';
    3. $yds = "dog";
    4. $is = "cat";
    5. $handsome = 'yds';
    6. foreach($_POST as $x => $y){
    7. $$x = $y;
    8. }
    9. foreach($_GET as $x => $y){
    10. $$x = $$y;
    11. }
    12. foreach($_GET as $x => $y){
    13. if($_GET['flag'] === $x && $x !== 'flag'){
    14. exit($handsome);
    15. }
    16. }
    17. if(!isset($_GET['flag']) && !isset($_POST['flag'])){
    18. exit($yds);
    19. if($_POST['flag'] === 'flag' || $_GET['flag'] === 'flag'){
    20. exit($is);
    21. }
    22. echo "the flag is: ".$flag;

    首先正常情况,会发现底端输出了一个dog,也就是说在第二处if时断掉了,那么传入一个flag变量,结果发现底部变成了the flag is:,然而后面什么都没显示,原因是因为上面的foreach将flag变量覆盖了:

    1. ?flag=1 ==> $flag=$1

    显然$1是不存在的,那么如果传递flag=flag呢,这样就会触发最下面的$_GET['flag'] === 'flag'判断,输出cat。但是如果再传入is,让其被flag的值覆盖,最后输出的就是flag了。
    payload:

    1. index.php?flag=flag&is=flag