往年听说 X-NUCA 决赛有渗透,想着来补补渗透,结果今年没有了… 只有一道 Web,类似解题,提交 flag 每轮自动得分,没有防御概念。
题目基于 Wordpress 5.5.3 最新版本进行了一些改动,并添加了几个插件。拿到源码先 diff 一下,发现 wordpress 部分有几处小的改动,其中增加了对文件上传的一个过滤:
文件内容不允许含有 php。其他有部分改动,但感觉没什么可以利用的。继续看插件,发现除了contact-form-7,剩下的插件都是最新版本。contact-form-7 是 5.0.3 的版本。
预期解法
开始一直沿着预期解法做,后面卡住做不动了。
搜一下contact-form-7 5.0.3漏洞,发现有一个权限提升的漏洞:https://paper.seebug.org/774/
diff 一下题目的代码与 contact-form-7 5.0.3源码,发现很明显:
权限提升的漏洞最后利用就是通过邮件方式任意文件读取,这里出题人重写了发邮件函数,很明显就是要利用这个漏洞。
用文章的方法进行复现,发现可以越权创建 contact,但是无法设置 email 那些关键参数。
文章的exp:
1 | var settings = { |
exp中通过 meta_input
参数设置了 email 的一些关键属性。但是在本地复现过程中只能创建 contact,这些关键 meta 没有设置成功。
开启调试跟一下源码,发现 meta_input 参数被 ban 掉了…
wp-admin/includes/post.php
:
1 | function _wp_get_allowed_postdata( $post_data = null ) { |
注释一下这个过滤,可以看到最终确实是对 meta_input 参数的值设置了 meta:
wp-admin/includes/post.php
:
这里尝试了很多思路去绕过,无果,所以放弃了这个思路…
赛后问了下出题师傅,确实是利用这个漏洞。sendmail 函数有写日志的操作,预期解是写入文件,然后 phar 反序列化 getshell,关于这个漏洞如何利用,没有公布。
非预期解法
出题人在文件上传处加了过滤,不允许含有 php,所以需要利用上述漏洞达到任意文件写的目的。但是赛场上大家几乎都是非预期。

将 php 随便改成 xxx,phar 反序列化同样可以利用。
下面就是相同的思路了,反序列化 getshell,参考这篇 phar 的经典文章:https://paper.seebug.org/680/#31
pop 链,没有了 WooCommerce 这个插件,找一个代替的:
all-in-one-event-calendar 插件中 app/controller/shutdown.php
的Ai1ec_Shutdown_Controller
类。
1 | public function __destruct() |
构造:
1 |
|
现在需要找到触发点,文章中的 rpc 没有了,需要再找。
继续沿着wp_get_attachment_thumb_file
向前寻找调用,发现wp-includes/media.php
的image_downsize
方法:
寻找调用,wp-include/media.php
:
这里队友直接在几个调用处都下断点,然后在 media 处随便点击,看哪里可以断。最后发现新建一篇文章,并添加 media,可以触发到 image_downsize 函数。调用栈如下:
后面$file
与 $imagedata['thumb']
参考原来那篇文章,实际利用起来其实挺麻烦的。
首先注册个账户,在 /wp-admin 下,传一个 media( phar 构造出的)。
保存在了 wp-content/uploads/2020/12/phar.gif
。
然后我们需要控制这个 media 的$file
与 $imagedata['thumb']
,参考文章的打法。打开编辑这个 media 的页面,我的网址是 http://192.168.43.44/wp-admin/post.php?post=68&action=edit
。可以看到 post_id 是 68 。然后获取 wp_nonce,发包。
控制$file
:(需要修改_wpnonce与post_ID)
控制 $imagedata['thumb']
:(需要修改 _wpnonce,post_ID 与 thumb)
然后触发反序列化,新建一篇文章,添加 media:
点击insert,抓包。修改 attachment[image-size]=thumbnail
,这样才能进到wp_get_attachment_thumb_file
中。
另一条触发链,当时做题时也看到了,后面没去调那个,应该也是可以的。
也是寻找调用 image_downsize,在 wp-admin/includes/media.php
的image_size_input_fields
函数:
继续向前找调用,依次是wp-admin/includes/media.php
中的 get_attachment_fields_to_edit
函数、get_media_item
函数,最后wp-admin/async-upload.php
中调用了 get_media_item
函数。
所以触发链是 get_media_item
-> get_attachment_fields_to_edit
-> image_size_input_fields
-> image_downsize
-> wp_get_attachment_thumb_file
。