[反序列化篇]史上最全PHP反序列化漏洞实例复现姿势详解(补充ing)

0x01

实验环境

靶场:pikachu+LKWA

平台:bugku+攻防世界+0CTF+南邮ctf+其他

环境:win10+VPS(ubuntu)+Docker

工具:Burp+MantraPortable

预备知识

Session反序列化漏洞

phar://协议

phar文件

简单回顾

对上一篇博客做一些补充:
所谓序列化(serialize),即把一个对象变成易存储的字符串,比如下面是一个对象:

class OWL{
   
    public $aaa="bbb";
}
$o=new OWL(); //创建一个对象
serialize($o); //把这个对象进行序列化
# 序列化后:
O:1:"S":1:{
   s:3:"aaa";s:3:"bbb";}
        O:对象object
        1:对象名称长度为1个字符
        S:对象名称
        1:对象属性个数为1(public)
        s:数据类型
        3:变量名称长度
        aaa:变量名称
        s:数据类型
        3:变量值长度
        bbb:变量值

与它相对应的反序列化则是把被序列化后的字符串还原为之前的对象.

0x02

1.php反序列化漏洞(Pikachu)

靶场:Pikachu

[反序列化篇]史上最全PHP反序列化漏洞实例复现姿势详解(补充ing)_第1张图片
贴上unser.php的源码:

class S{
   
    var $test = "pikachu";
    function __construct(){
      //类S的魔术方法被__construct()重写了
        echo $this->test;     //现在的作用是直接输出test的值
    }
}

$html='';
if(isset($_POST['o'])){
   
    $s = $_POST['o'];
    if(!@$unser = unserialize($s)){
   
        $html.="

大兄弟,来点劲爆点儿的!

"
; }else{ $html.="

{ $unser->test}

"
; } }

审计上面的源码可以知道:

  • 类S的魔术方法被__construct()重写,直接输出test的值
  • 以post的方式传参给$o,然后在赋值给$unser
  • @表示不再有回显
  • 若赋值成功, 即将$s反序列化, 并作为p标签返回到网页中

解题思路:

这里要输出$s的反序列化后的值,且再无任何过滤和限制,那么我们如果提交一个序列化后的参数,则网页会给我们返回序列化前的参数(利用点),一般涉及浏览器我也只知道XSS了,所以在这里构造一个序列化后的xss payload,那unser.php反序列化后,正好会触发我们提交的payload,即可利用成功.

下面我们开始利用,先要构造一个序列化后的payload:


// 注意
//这里需要满足与目标后端的类名一致
//因为这样目标后端反序列化后的payload才是我们想利用的
class S{
   
    var $test<

你可能感兴趣的:(Web安全,php,linux,docker,xss,安全)