BUUCTF第二章web进阶文件上传1
BUUCTF第二章web进阶文件上传1
该题已经把原码都给我们了,简单说说就是它会把我们上传的文件放到upload目录下的一个名字随机的临时目录,比如
同时它会在我们上传时做过滤,只允许zip,jpg,png,gif文件上传,也不允许空文件上传,如果上传的是zip文件会先检测压缩包内是否有php文件,如果有则终止运行,没有就自动解压,然后上传后它会在临时目录里再次进行过滤,只保留jpg,png,gif文件。
试错1:
我先尝试将一个.htaccess文件和一个图片马压缩上传,但是由于它会清理临时目录所以就把.htaccess文件删掉了。
试错2:
我又想有临时目录那是否可以进行条件竞争绕过,但是由于它的临时目录名字是随机的,所以在得知临时目录叫什么之前php文件就已经被删掉了(或者说可以用py脚本试试,有一点思路,即上传后查看upload文件夹下有哪些目录,随后锁定目标临时目录后在里面进行条件竞争,但还没有尝试过)
试错3:
有试着使用目录穿越,但是没成功,因为它是先判断文件后缀才放入临时目录,但是我尝试传一个正常图片然后抓包修改文件名为../../a.jpg居然在index目录也访问不到,理论上来说我应该要在index目录下访问到这个正常图片,但是还是404,然后我在upload下的那个随机目录里找到我的这张图片,但是文件名前的../../不见了,就变成了a.jpg。
正解:
最后经过查找资料,了解到apache有一个多扩展名解析,比如说a.php.www.qqq,apache会从最后的后缀开始解析,它不认识qqq,于是向前解析www,它也不认识www,于是再向前解析php,欸嘿现在认识了,最后就解析成a.php,这样就可以绕过网站检测我们压缩包内是否存在php文件这一关了。
但是就算绕过了,放到临时目录里还是会被过滤掉啊,但是这里用于解压压缩包的方法是PclZip
这种方法存在一个目录穿越漏洞,于是我们就可以利用这个漏洞将我们的木马穿越到网站根目录,这样就不会被临时目录给清理掉了,虽然上面试过的目录穿越无法成功,但这次是在压缩包内修改文件名,抱着尝试的心态再试一次
我们要穿越两个目录,所以要两个“../”,然后我们的文件名要有两个后缀且最后的后缀不能被识别出来,于是我们的最终文件名就叫做../../shell.php.aaa。
我们需要在压缩包内的哪个部分修改呢?如图所示是个正常的压缩包,压缩的文件为asddsaasd.php
我们所需要修改的文件名即压缩包内的第二个出现的被压缩文件的文件名,也就是被圈起来的部分
我们要保证只有被圈起来的部分被修改了,不能修改其他不属于文件名字的部分(具体原因应该和压缩包的解析有关,我不能确定,只是猜测),所以我们需要提前知道我们的目标修改文件名是多少个字,../../shell.php.aaa这里是19个字,于是我们要将我们的木马文件命名为1234567891234567891共19个字
现在将其压缩,然后修改包内的第二个文件名
修改前:
修改后:
随后上传压缩包,上传成功后访问shell.php.aaa
居然直接把flag给我了,我还想用蚁剑连接试试看呢
但连接失败了,难道不应该被解析成php文件吗???
再次尝试目录穿越:
经过以上折腾,我想着要不要把这个文件换成普通文件看能不能传到网页根目录下
我要将图片名在压缩包内改成../../a.jpg,于是我修改前的图片名应该有11个字,因为这里没有php所以不用担心压缩包内的文件被删掉所以不用.aaa
于是修改图片名为12345678912十一个字
这是张正常图片
再进行和上面一样的操作
上传然后访问
成功!!再次验证PclZip的目录穿越漏洞
尝试上传不是一句话木马的php文件:
既然都不用连接,那这题是不是只要上传php文件就直接给你flag呢?
重复以上一样的操作上传非木马php文件
居然也成功了
应该是只要上传php文件就可以给你flag,但是php语句没有被执行,难道是php文件其实没有被解析?难怪前面蚁剑无法连接,具体原因是什么还不清楚