RoarCTF-simple_upload-WriteUp
话说…这个题从打比赛到后来的复现,一直想着是爆破文件名,但是也一直没跑出来,条件竞争又竞争不过…后来偶然才发现另一种思路,新大陆🧐
RoarCTF-simple_upload
- tip:该题目在BUUCTF的题库里有环境可复现:https://buuoj.cn
题目描述
打开题目链接之后,看到如下代码
|
可以发现,该站是ThinkPHP
写的一个文件上传网站。
题目分析
- 1、分析代码可知,该站可以通过
POST
方法实现上传文件功能,但是从第14行代码发现php后缀的文件被禁止上传,因此我们需要想办法绕过限制,上传php小马
。 - 2、该脚本通过
allowExts
方法设置上传类型,但是查阅资料得知这种使用方法是不对的,并不能限制上传的文件类型。 - 3、upload()函数不传参时为多文件上传,整个
$_FILES
数组的文件都会上传保存,可以利用该属性通过一次访问上传多个文件。
结合以上分析得知的内容可知,可以利用$_FILES
数组上传多个文件来绕过对php的过滤。
解题过程
1、测试上传功能
首先编写python脚本向网站POST一个非php的文件,这里上传了一个txt
文件,测试能否正常上传文件,下面是上传测试代码段:
url = "http://c85e5a48-c5f8-4a5b-9a30-6a81677fd75e.node3.buuoj.cn" |
回显内容如下:
{"url":"\/Public\/Uploads\/2019-10-24\/5db1841fb439d.txt","success":1} |
能够成功上传文件。
2、测试上传php文件:
url = "http://c85e5a48-c5f8-4a5b-9a30-6a81677fd75e.node3.buuoj.cn" |
回显内容如下:
{"url":"\/Public\/Uploads\/2019-10-24\/5db18420027a3.txt","success":1} |
由回显可知,我们成功上传了php文件,但是并没有回显php的文件名
- 其实在比赛做赛题的时候发现,直接上传php文件也是可以成功的,只不过也不会回显文件名。
通过多次上传发现规律:新文件名是以微秒
为单位转十六进制
的字符串(后来在WP中了解到ThinkPHP中,文件名是通过uniqid
函数生成的,uniqid
函数是基于以微秒计的当前时间计算的)
因此找到php的文件名,理论上就可以成功连接到我们上传的小马,而方法只有一个,那就是爆破
。
3、爆破php文件名
爆破代码如下:
import requests |
由于我们是利用$_FILES
数组的属性实现一次访问,上传两个文件,因此中间相隔的时间较短,利用以上单线程的爆破即可拿到php的文件名,然后常规操作连接小马拿flag。
这里还有另一种方法是利用BP进行爆破,只需爆破文件名的后三个字符即可,其实原理是一样的,只是工具不同而已。
但是在BUUCTF的站上使用BP爆破时会回显429 Too Many Requests (太多请求)
,同样如果用自己的多线程代码去爆破也会遇到这个问题,是网站为了限制客户端的请求数量的配置,没办法,只能用单线程。
总结
在比赛的时候,由于不了解代码中一次访问可以上传多个文件的漏洞,便采用了上传三次文件的方法(第一次上传txt,第二次传php小马,第三次再传txt,以此得到命名范围),这就导致第一次和第三次拿到的文件名范围比较广,爆破困难,当时自己写了个蹩脚的多线程,最终也没能成功爆破出文件名…
赛后看了几个WP关键步骤还是在于爆破文件名,我采用的这种方法也有人成功拿到了flag…不过正解应该还是利用漏洞一次上传多个文件来爆破吧。
- Post Title: RoarCTF-simple_upload-WriteUp
- Post Author: ggb0n
- Post Link: http://ggb0n.cool/2020/02/02/RoarCTF-simple_upload-WriteUp/
- Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.
1.第五空间pwn题练习
2.虎符CTF两道web学习JS
3.SWPU2019复现
4.RootersCTF复现
5.BSidesSF2019-WriteUp
6.HackTM2020-WriteUp
7.UNCTF-Twice_Insert WriteUp
8.HEBCTF-easy_RSA-WriteUp
1.TCTF2020部分题解
2.第五空间pwn题练习
3.堆溢出-Tcache_Attack
4.堆溢出-Housese_Of_XXX
5.堆溢出基础
6.入坑二进制