文件上传绕过

Posted by Tattoo on 2019-02-26
Estimated Reading Time 3 Minutes
Words 853 In Total
Viewed Times

前端检测绕过

JavaScript检测:通过浏览器提交上传请求前,出发检测用JS脚本进行检测(如:普通的表单上传)

Flash AS脚本检测:上传用Flash中,提交上传请求前,出发检测用AS脚本进行检测(如:DZ的头像上传)

APP上传检测:检测卸载APP客户端代码中,或者所调用的HTML页面中

客户端检测一般只检测文件扩展名。客户端进行的检测,可通过对客户端代码的一些修改或直接拦截修改报文即可绕过,所以这种上传限制约等于没有。

前端JavaScript检测绕过

①查看onchange、onsubmit等事件
onchange事件会在域的内容改变时发生
onsubmit事件会在表单中的确认按钮被点击时发生

②删除掉相关事件中的检测函数

服务器检测绕过

文件扩展名检测:

用白名单检测是否是允许上传的文件扩展名类型

MIME类型检测:

MIME (Multipurpose Internet Mail Extensions) 是描述消息内容类型的因特网标准。MIME 消息能包含文本、图像、音频、视频以及其他应用程序专用的数据。

浏览器会自动根据所上传的文件的扩展名,对应到相应的MIME类型上。MIME在请求报文中的Content-Type里,Content-Type的内容由浏览器生成,可以随意修改,不影响上传的内容。

常见的白名单MIME TYPE

文件内容检测:

1.文件头检测

文件头是位于文件开头的一段承担一定任务的数据,一般在开头的部分。文件头的起始部分中一般开头标记文件类型。如gif的文件头为GIF89a或GIF87a

常见图片文件头(HEX):
  JPEG (jpg),文件头:FF D8 FF (\xff\xd8\xff)
  PNG (png),文件头:89 50 4E 47 (\x89PNG\x0d\x0a)
  GIF (gif),文件头:47 49 46 38 (GIF87a/GIF89a)

2.完整文件结构检测

通过调用函数(如getimagesize /imagecreatefromgif /imagecreatefrompng),进行检测文件是否为图像,需要文件内容保持相对完整,所以无法通过在图片头部追加起始字节的方法进行绕过。针对这种检测,可以将图片文件与欲上传的文件进行合并来进行绕过,合并后的文件称为图片马,图片马只要未经过清洗或缩放等操作即可通过检测。
由于上传文件的图片部分在解析为PHP时会以乱码显示,建议与尽量小的图片文件进行合并,否则会有大量的乱码。

通过dos命令进行文件合并

1
copy /b xxx.jpg + phpinfo.php  1.php

3.恶意文件内容检测

检测提交内容中是否包含Webshell等数据

常见恶意文件内容关键字:
    eval
    base64_encode
    assert
    java.lang.Runtime
    java.lang.ProcessBuilder
    

开源的webshell收集项目:
https://github.com/tennc/webshell

文件上传一些技巧:

1.文件参数多个filename属性

文件上传过程中,如果存在waf拦截一些扩展名,可以通过尝试写入多个filename属性。filename属性存在于数据包的Content-Disposition。

2.目录可控时,尝试使用目录穿越的方法(../)


If you like this blog or find it useful for you, you are welcome to comment on it. You are also welcome to share this blog, so that more people can participate in it. If the images used in the blog infringe your copyright, please contact the author to delete them. Thank you !