反序列化(下)

目录

unserialize3(攻防世界进阶)


class xctf{                #定义一个以xctf为名的类
public $flag = '111';    #给xctf类定义一个$falg,并且赋值为111
public function __wakeup(){      #定义__wakeup()构造方法,#在对象反序列化的时候触发
exit('bad requests');        退出,肯定是绕过wakeup这种方法
}
?code=                     //这code肯定是url?code 输出这种格式

这是题目经过分析,可以直接构造反序列化

?code=O:4:"xctf":1:{s:4:"flag";s:3:"111";}

输入以后发现url并不返回值,并且bad requests出现。然后我们就看见了——wakeup魔术方法,应该是直接exit了,而没有绕过,所以这时候把1改为2就可以绕过,原理在下面会有解析。

?code=O:4:"xctf":2:{s:4:"flag";s:3:"111";}出现flag

Web_php_unserialize(攻防世界进阶)

接下里让我们看一道反序列化的进阶题

打开题目出现源码,

 

<?php 
class Demo { 								#定义一个以Demo为名的类
    private $file = 'index.php';			#给Demo类定义一个$file属性,并且赋值为index.php
    public function __construct($file) { 	#定义__construct()构造方法
        $this->file = $file; 				#在调用对象之前,给$file属性初始化赋值
    }
    function __destruct() { 				#定义一个__destruct()析构方法
        echo @highlight_file($this->file, true); #在销毁对象之前,高亮打印出$file属性的源码
    }
    function __wakeup() { 					#定义一个__wakeup()魔术方法
        if ($this->file != 'index.php') { #在对象反序列化的时候,判断$file属性的值是否为index.php
            //the secret is in the fl4g.php	#提示flag在一个以fl4g.php为名的php文件里
            $this->file = 'index.php'; 		#若$file属性不等于index.php,则赋值为index.php
        } 
    } 
}
if (isset($_GET['var'])) { 					#判断客户端是否以GET形式传递$var参数到后台
    $var = base64_decode($_GET['var']); 	#若传递了,先经过base64解码一次
    if (preg_match('/[oc]:\d+:/i', $var)) { #解码后,判断是否匹配正则
        die('stop hacking!'); 				#若匹配正则,则退出,并且回应“stop hacking”
    } else {								#若没有匹配正则,则反序列化$var属性
        @unserialize($var); 
    } 
} else { 									#若没有传递$var参数到后台,则高亮回显index.php的源码
    highlight_file("index.php"); 
} 
?>

思路:很明显,该段代码的关键点在于"echo @highlight_file(t h i s − > f i l e , t r u e ) ; " , 对 的 , 就 是 高 亮 打 印 this->file, true);",对的,就是高亮打印this−>file,true);",对的,就是高亮打印file属性的值对应的源码的这句代码,那么如果打印了fl4g.php页面的源码,岂不是就得到了

通俗一点说一下,肯定执行unserialize反序列化输出,肯定要绕过wakeup 和 正则匹配。


 $chen这个可以换成任何一个都可以,比如$a。就是构建一个新的Demo类,file属性给fl4g.php赋值。

用get方法传入url就可以得到flag

总结:

绕过正则匹配

(1)分析正则:if (preg_match(’/[oc]:\d+:/i’, $var )

[oc] 	 匹配o或者c
\d    	 匹配任意一个10进制的数
+    	 匹配前面的字符 1-N 次
i     	 表示不区分大小写

(2)用+4替换成4是为了绕过preg_match的正则表达式

(3)同样的把2替换成1是利用了CVE-2016-7124的漏洞,即当序列化字符串中表示对象属性个数的值大于真实的属性个数时会跳过__wakeup的执行

(4)其他:

php中带有双下划线(__)的是魔术方法,会在满足条件时自动调用

序列化是把数据类型压缩成一个字符串,方便处理,反序列化是把字符串还原成数据类型

正则表达式用于匹配字符串

这个师傅的博客,更加的详细:反序列化的探究到此就结束了,以后碰见题目在分析

5.level5-[XCTF-Web_php_unserialize]-[+的利用]-[私有属性的序列化]-[base64编码]_qwsn的博客-CSDN博客

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值