[WUSTCTF2020]朴实无华
[WUSTCTF2020]朴实无华
robots.txt里发现提示
打开这个页面,虽然页面里没有有用的信息,但是在响应头里发现了另一个页面提示
打开发现代码
<?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("去非洲吧");
}
?>
这题有三关,需要同时满足条件才能显示flag
level1的关键代码在这个判断
if(intval($num) < 2020 && intval($num + 1) > 2021)
intval() 函数用于获取变量的整数值。
intval() 函数通过使用指定的进制 base 转换(默认是十进制),返回变量 var 的 integer数值。 intval() 不能用于 object,否则会产生 E_NOTICE错误并返回 1。
在第一层中要使用get传参一个num变量,整数值要小于2020,但是加上1之后又要大于2021,根据intval()函数的使用方法,当函数中用字符串方式表示科学计数法时,函数的返回值是科学计数法前面的一个数,而对于科学计数法加数字则会返回原本科学计数法的数值。
举个例子:
<?php
$num='2e4';
echo(intval($num));
echo('<br>');
echo(intval($num+1));
?>
这里输出的值分别为2和20001
因此可以使用科学计数法解决,输入参数num=2e4
level2是md5绕过,一般的md5绕过是传入0e开头的md5值,因为在弱比较时,弱比较中会截取一个字符串的数字,知道遇到字符截止,对于0e+数字的值只会截取e之前的0,所以这里即便是令传入的md5值等于$md5后还需要等于其自身进行md5的值,我们选取0e或者加密后仍为0e开头的数就行例如:0e215962017、以及这些纯字符串转化后为0e+数字的数:QNKCDZO、s878926199a
level3过滤了空格和cat,因此可以用几个常见的字符替代
代替cat: more、less、head、tail、sort
代替空格:$IFS、${IFS}、$IFS$1
具体可参考:https://mayi077.gitee.io/2020/03/14/CTFHub-%E4%B9%8B-RCE/
首先通过ls查看文件
然后通过其他字符进行代替