错误使用TP上传类导致getshell

首先这个案例来自 RoarCTF2019 中的 simple_upload 一题。其实看到这题的时候,就发现这题的考点,和之前自己审计某款产品的前台任意文件上传漏洞几乎一样。这里不想再浪费时间记录这道题的解法,直接转载官方WP。懒:)


官方题解如下

题目提供了源代码,可以看出题目是thinkphp写的,并且存在文件上传

1

根据源码构造出上传文件的数据包并测试上传

2

测试上传功能没问题,但是源码中限制了$_FILES[file]文件名不能是.php文件,得想办法绕过。 $upload->allowExts 并不是 Think\Upload 类的正确用法,所以 allowexts 后缀名限制是无效的。

熟悉 thinkphp 的应该知道, upload() 函数不传参时为多文件上传,整个 $_FILES 数组的文件都会上传保存。

题目中只限制了 $_FILES[file] 的上传后缀,也只给出 $_FILES[file] 上传后的路径,那我们上传多文件就可以绕过 php 后缀限制

3

php 文件肯定是上传成功了,下一步就是要知道上传后的php文件名。多上传几次看回显就会发现保存的文件名是有规律的,那能否找到这个规律呢。这里可以下一份 thinkphp3 的源码,看一下 think\upload 类是怎么生成文件名的

4

查看 thinkphp 源码得知文件名是通过 uniqid 函数生成的, uniqid 函数是基于以微秒计的当前时间计算的,两个同时上传生成的文件名相差不会太远

5

同时上传txt文件跟php文件,txt上传后的文件名跟php的文件名非常接近。我们只需要构造Burp包,遍历爆破txt文件名后三位 0-9 a-f 的文件名,就能猜出php的文件名

6

7

爆破没成功的话多上传多尝试几次就可以,或者加大爆破范围,最后爆破访问php文件成功直接返回flag

8

PS:把 $upload->allowExts 替换成 $upload->exts 就可以修补这个漏洞了。

题解转自: https://github.com/berTrAM888/RoarCTF-Writeup-some-Source-Code/blob/master/Web/simple_upload/writeup/SimpleUpload-Writeup.docx

文章作者: Mochazz
文章链接: https://mochazz.github.io/2019/10/21/错误使用TP上传类导致getshell/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Mochazz's blog