php xss 反序列化漏洞

hxdyjx / 2024-03-09 / 原文

介绍

反序列化漏洞,利用了后端服务的设计缺陷

序列化和反序列化

对象 =(序列化)》 字符串

对象 《(反序列化)= 字符串

序列化字符串构建

首先,理解下 对象 序列化后 是个 嘛玩意儿

上代码

<?php
class test{
    public $a = 'hello';
    private $b = 'hello';
    protected $c = 'hello';
    public function displayVar() {
        echo $this->a;
    }
}
$hxdyjx = new test();
echo serialize($hxdyjx);
echo PHP_EOL;
echo urlencode(serialize($hxdyjx));
//O:4:"test":3:{s:1:"a";s:5:"hello";s:7:"%00test%00b";s:5:"hello";s:4:"%00*%00c";s:5:"hello";}

对照理解

名称 意义
O:4:"test":3:{} 类 长度4 名称test 有3个小弟
s:1:"a";s:5:"hello" 一般的小弟 名字长度1 小弟叫a 小弟5cm长 铭文hello
s:7:"%00test%00b";s:5:"hello"; 大佬禁脔级小弟 名字长度7 小弟叫b(%00test%00 占了6个字节)小弟5cm长 铭文hello
s:4:"%00*%00c";s:5:"hello"; 受帮派保护的小弟 名字长度4 小弟叫c(%00*%00 占了3个字节)小弟5cm长 铭文hello

反序列化漏洞示例

<?php
class test{
    public $a = 'calc';
    public function displayVar() {
        eval($this->a);
    }
}

//$get = new test();
//$get = serialize($get);
//echo $get;

$get = 'O:4:"test":1:{s:1:"a";s:13:"exec("calc");";}';
$b = unserialize($get);
$b->displayVar() ;
?>

这里的'O:4:"test":1:{s:1:"a";s:13:"exec("calc");";}' 就是我构造的payload,如果是http 请求 ,是不是就是一个一句话木马啦?