一、PHP反序列化逃逸--增加:
首先分析源码:
<?php highlight_file(__FILE__); error_reporting(0); class A{ public $v1 = 'ls'; public $v2 = '123'; public function __construct($arga,$argc){ $this->v1 = $arga; $this->v2 = $argc; } } $a = $_GET['v1']; $b = $_GET['v2']; $data = serialize(new A($a,$b)); $data = str_replace("ls","pwd",$data); var_dump(unserialize($data));
通过分析代码,后台将我们输入的字符串中的 'ls' 全部都替换为了 'pwd'。
我们可以利用这个漏洞构造以下payload:
原有字符串的长度为66,加长后的字符串超出了66之后,就将我们想要写入的序列化语句挤了出来,并且挤出的字符串的末尾为 ;} 将序列化语句闭合,将闭合符号后面的语句直接注释掉,达到了我们的目的。
二、PHP反序列化逃逸--减少:
<?php highlight_file(__FILE__); error_reporting(0); class A{ public $v1 = "abcsystem()system()system()"; public $v2 = '123'; public function __construct($arga,$argc){ $this->v1 = $arga; $this->v2 = $argc; } } $a = $_GET['v1']; $b = $_GET['v2']; $data = serialize(new A($a,$b)); $data = str_replace("system()","",$data); var_dump(unserialize($data)); ?>
逃逸减少的代码通过 str_replace()函数将输入字符串中的 'system()' 替换成了 "" 空字符。
通过这个特性构造payload:
利用溢出的长度将事先准备的后面的字符串吃掉,并且衔接上我们自己想要写入的字符串,达到我们的目的。