CISCN2019 Dropbox Writeup
0x00关于本文 感谢@glzjn大佬提供的buuoj复现环境! 0x01漏洞突破口 LFI 在注册登陆简单测试之后可以轻易地发现download.php的LFI漏洞 后退两个目录即可获取源码(怎么知道是后退两个目录?多试试就知道了),我们发现download.php有这一行 if ( strlen ( $filename ) < 40 && $file -> open ( $filename ) && stristr ( $filename , "flag" ) === false ) { 看来很不幸,没法直接读flag 但是好在这个漏洞可以把题目中的所有源码都下载下来,方便我们审计 0x01 反序列化漏洞发现 看到download.php代码中存在这一行 include "class.php" ; 一般来说像CTF题目这种超级超级小规模的项目是不会需要真正用到OOP来开发的,除非....想要用到相关的漏洞,比如反序列化 哪里有反序列化点呢?就藏在文件操作中。(相关阅读 利用 phar 拓展 php 反序列化漏洞攻击面 ) 在download.php中存在如下代码(事实证明download.php并不能正常利用,在之后我会讲) $file = new File (); ... $filename = ( string ) $_POST [ 'filename' ]; ... $file -> open ( $filename ) 跟到File类里面的open函数中,这个$filename被直接带入 file_exists ( $filename ) 这样大黑客们就可以利用phar://伪协议用反序列化搞事情,好了我们开始审计代码! 0x02 POP Chain构造 我们现在需要构造POP Chain来RCE或者文件读取,要审计反序列化,我们第一步是需要找到起点,那就是__destruct或__wakeup函数,不过这道题目里面没有__wakeup函数,只有两个__destruct函数。