文件上传漏洞总结笔记--第一次迭代

一、什么是文件上传漏洞

  一些网站为了正常的用户需求有时会提供文件上传功能,比如上传头像、发表文章时添加图片等。文件上传本是正常的功能,而攻击者会利用这些文件上传点上传一些webshell到服务器上,以达到控制服务器的目的,这就形成了文件上传漏洞。

 

二、为什么会出现文件上传漏洞

  网站管理者对文件上传点没有进行应有的过滤或过滤不严,就造成了文件上传漏洞的出现。比如XX网站允许用户上传头像图片进行个性化设置,但并没有对上传的是否为图片文件做检查,或者检查很简单以至于攻击者可以轻松绕过。

 

三、文件上传原理与过程(以PHP为例)

1、通过数组获取并存储上传文件的相关信息

 

 2、文件上传处理过程

 

 上传的文件到达服务器端后会先被存储在临时目录中,通过$_FILES数组获取了上传文件的相关信息后,检查用户是否点击了上传按钮,上传路径是否存在等。所有条件都满足后,通过move_uploaded_file()这个函数将文件从临时目录中存储到上传路径中。如:上传文件为test.jpg,最终会被存储在uploads/test.jpg(文件没有被重命名的情况下)。

 

四、如何预防文件上传

1、前端javascript(js)检测

  前端javascript检测就是:在网站前端用javascript脚本编写检测上传文件是否为合法文件,一般都是检测文件上传后缀名。

  如果选择了想要上传的文件但是还没有点击上传按钮,页面就会弹窗告警显示该文件非合法文件,那么这就是前端js检测。

2、服务器端MIME类型检测

  MIME类型检测就是:检查发送的数据包中的Content-type字段,以检测该上传文件是否为合法文件。

  比如该上传点只允许图片(jpg/png/jpeg)上传,那么就会检测Content-type是否为image/jpg、image/png、image/jpeg三者之一,如果不是提示上传的为不合法文件。

3、服务端后缀检测

  服务端后缀检测就是:当数据包发送到服务器端,在服务器存储该上传文件之前,会检查该文件的后缀名是否合法,只有后缀名合法才会存储该文件。

4、利用 getimagesize 函数获取图片信息

  getimagesize()函数用于获取图像大小及相关信息,成功返回一个数组,失败则返回False并产生一条Warning。

5、读取图片的前 2 个字节(文件头),然后判断是不是图片

  文件头就是为了描述一个文件的一些重要的属性,通过文件头可以辨别该文件是什么类型的文件。

6、使用随机数改写文件名和文件路径

  使用户不能轻易访问自己上传的文件,即使成功上传webshell也无法加以利用。且文件重命名能使00阶段和分号截断不起作用。

7、对图片进行压缩或二次渲染

  对图片使用压缩函数或resize函数,处理图片时破坏其他包含的恶意代码,可以预防图片马。

 

五、如何绕过文件上传防御

1、如果目标上传点只存在前端js检测,只需上传文件时用合法的后缀名,绕过前端检测后用burp抓包修改为原来的后缀名。

2、如果目标上传点只存在服务端MIME检测,只需上传webshell时用burp抓包,把Content-type字段修改成合法的。

3、服务端后缀检测

(1)如果后缀检测没有区分大小写,可以大小写绕过,如:Php

(2)如果源代码检测到非法后缀名时操作是将其替换为空白,则可以用双写绕过,如:pphphp

(3)如果源代码中对非法后缀名检测不全,可以绕过黑名单

在php网站中,如果只检测了php,php4,php5,php7等还可以被当做php解析(具体会不会被当做php文件解析还是要看php的配置文件内容)。

在asp网站中,如果只检测了asp,asx,cer等还可以被当做asp解析,具体看asp网站的配置。

主目录-缓存ISAPI扩展 asp 设定哪些后缀也可以被解析

 

 (4)00截断

当服务器通过$_FILES[‘upfile’][‘name’]获取文件名时,如果 silic.phpp.jpg被更改为silic.php0x00.jpg时,在获取变量值是,遇到00,认为 是截断符号,从而name=silic.php。

所以,当需要绕过服务端后缀名检测时,数据包中必须含有上传文件后的目录情况才可以用

例如:数据包中存在 path: uploads/,那么攻击者可以通过修改path的值来构造paylod: uploads/123.php%00

程序中检测的是文件的后缀名,如果后缀合法则拼接路径和文件名。那么最终存储到服务器中的文件及路径为uploads/123.php

(5)分号截断

分号截断利用的就是IIS的解析漏洞了,例如上传文件test.asp;.jpg,检查的后缀名是.jpg,存储到服务器的也是test.asp;.jpg,但访问时会被当做test.asp进行解析。

4、如果服务器端对上传文件进行了头文件检测,可以通过制作图片马来进行绕过,再配合文件包含漏洞或者中间件解析漏洞配合解析。

图片马的制作:

(1)找一张图片pic.png和一个webshell文件shell.php

(2)在cmd窗口中输入 copy pic.png/b+shell.php hack.png

注意:图片文件名称一定要先敲,代码文件名称一定要放后面;图片文件名称一定接“/b”,“/b”代表这是一个二进制文件。

(3)生成的图片马应能正常显示,用文本编辑器打开可以看到插入在末尾的php代码。

 

 (4)图片马被当做php文件执行后,会在执行php代码的当前目录中创建一个shell01.php,内容为一句话木马,菜刀连接密码为hack。

5、如果服务器端使用随机数改写文件名和文件路径,有两种方法可以知道改写后的文件名和路径:

(1)如果上传的文件是要显示在页面中的,则可以找到相应的显示页面,右键查看页面源码,就可以找到该文件的路径和文件名。

(2)使用burp拦截response包,也可以找到存储的路径和文件名。

 

六、文件上传漏洞实例

文件上传漏洞的利用总的来说就是想方设法把一个可执行文件上传到服务器并以可执行文件的方式运行起来,得以控制服务器。

找到文件上传漏洞最重要的就是积累经验,多看实际案例,仔细观察进行分析,往往能在意想不到的地方找寻到漏洞。

1、一个网站的后台数据库备份功能

(1)如图,可将数据库文件改名另存。

 

(2)想法:上传一个后缀名为.jpg的大马,将数据库路径改写为该上传文件的路径,备份数据库路径与数据库路径保持一致,除了文件名改为80sec.asp

(3)上传80sec.jpg,拦截response包查看保存路径及文件名。

 

 

 

 

(4)在后台修改数据库路径和登录路径

 

 

 

(5)点击备份,备份成功,访问http://192.168.1.14/admin/Upfiles/80sec.asp,大马成功被解析。

 

 

 

posted @ 2021-08-22 18:56  H2OH2OH2O  阅读(339)  评论(0)    收藏  举报