文件上传基础学习
一、基础知识
1、上传功能存在漏洞
通常,Web应用程序允许用户上传文件,例如图像、文档或其他类型的文件,以便后续处理或共享。漏洞出现在服务器未正确验证或限制上传文件的类型、大小和位置时。
2、不正确的输入验证:
文件上传漏洞通常是由于不正确的输入验证引起的。攻击者可以通过绕过应用程序的输入验证来上传任意文件,而不仅仅是允许的文件类型。
3、恶意文件上传:
攻击者可能会上传包含恶意代码的文件,如Web外壳、木马程序或恶意脚本文件(例如PHP或JavaScript),这些文件可以在服务器上执行。
4、执行恶意操作:
一旦攻击者成功上传了恶意文件,他们可以执行多种恶意操作,包括:
- 远程执行代码:如果服务器上的文件上传目录具有执行权限,攻击者可以通过上传的恶意文件执行任意命令,从而控制服务器。
- 文件覆盖:攻击者可以上传一个恶意文件,其文件名与现有文件相同,从而覆盖或替换现有文件,导致应用程序的不正常行为或数据损坏。
- 信息泄露:攻击者可以上传包含敏感信息的文件,例如密码文件、配置文件或数据库备份文件,从而泄露敏感数据。
-
危害范围:
文件上传漏洞的危害范围取决于服务器的配置和应用程序的权限。如果服务器上的上传目录具有执行权限,攻击者可能能够完全接管服务器。如果应用程序有访问敏感数据的权限,攻击者可能能够窃取敏感信息。
5、防范措施:
为了防止文件上传漏洞,开发人员和管理员可以采取以下措施:
- 文件类型验证:应用程序应该仅允许上传受信任的文件类型,并拒绝所有其他文件类型。
- 文件大小限制:应用程序应该限制上传文件的大小,以防止上传大型文件导致服务器资源耗尽。
- 隔离上传文件:上传文件应该存储在服务器上的一个独立目录中,并且不应该允许执行上传的文件。
- 文件重命名:上传的文件应该根据一定的规则进行重命名,以防止覆盖现有文件。
- 安全权限配置:服务器上的文件上传目录应该仅允许应用程序和管理员访问,并限制任何不必要的执行权限。
6、文件上传的过程
-
客户端:选择发送的文件->服务器接收->网站程序判断->临时文件->移动到指定的路径
-
服务器:接收的资源程序
二、文件上传的相关知识
1、可执行脚本的文件后缀名,可被网站目录解析,以下是常见后缀名
- asp
- asa
- cdx
- cer
- php
- aspx
- ashx
- jsp
- php3
- php.a
- shtml
- pthml
2、文件上传的常用工具
-
菜刀:ASP语言编写的 Windows 远控管理软件,年代比较久,鼻祖级别的,曾经风靡一时,现已经逐渐被其他三个所取代
-
冰蝎:基于 Java 编写,有跨平台特性,流量动态加密(AES128 + 随机密钥)
-
哥斯拉:基于C#编写,流量加密能过大部分静态查杀和WAF(查杀和WAF也在更新,随时就可能不行了),自带的各种插件功能异常强大
-
蚁剑:基于Java编写跨平台远控管理工具,模块化开发,代码简单易懂,可扩展性强
三、靶场实操
1、任意文件上传漏洞
任意文件漏洞又名文件直接上传漏洞,如果攻击者能直接长传恶意脚本到网站存放的目录,且这个目录可解析动态脚本语言,那么攻击者就能够直接获取网站权限,甚至进一步权限提升,控制服务器。采用dvwa的upload的靶场
2、绕过前端js检测上传(upload-1)
文件上传时,前端对文件的后缀名进行检验
2.1、在开发者工具中修改代码来上传文件
-
先选择上传的一句话木马
phpinfo.php
<?php phpinfo();?>
-
在按
f12
然后将检测的js代码删除,随后点击上传 -
鼠标放图片上,单机右键,选择复制图像链接
-
重新打开一个窗口,粘贴图像链接
2.2、如果采用edge浏览器的话,可以关闭js的权限
2.3、利用抓包工具burpsuite
来在上传时修改文件的后缀名
-
新建
phpinfo.jpg
图片文件,并且在文件中写入一句话木马<?php phpinfo(); ?>
-
上传该文件,用bp拦截,修改后缀名,将jpg修改为php
-
复制图像链接,也就是图像在靶场中的路径
3、绕过Content-Type(内容类型)检测(upload-2)
Content-Type(内容类型),一般是指网页中存在的 Content-Type,用于定义网络文件的类型和网页的编码,决定浏览器将以什么形式、什么编码读取这个文件,
-
查看源码
if (($_FILES['upload_file']['type'] == 'image/jpeg') || ($_FILES['upload_file']['type'] == 'image/png') || ($_FILES['upload_file']['type'] == 'image/gif')) { $temp_file = $_FILES['upload_file']['tmp_name']; $img_path = UPLOAD_PATH . '/' . $_FILES['upload_file']['name']
对于文件内容类型的检测,只有图片类型的才容许上传
以下是一些常见的Content-Type
Content-Type 描述 text/plain 纯文本,没有特定的格式或编码。 text/html HTML文档,用于网页内容。 text/css Cascading Style Sheets(CSS),用于定义网页的样式和布局。 application/json JSON(JavaScript Object Notation)数据,常用于数据交换。 application/xml XML(eXtensible Markup Language)数据,通常用于数据交换和配置文件。 application/pdf Adobe Portable Document Format(PDF)文件,用于可移植的文档表示。 image/jpeg JPEG格式的图像。 image/png PNG格式的图像,通常用于网页上的图像。 image/gif GIF格式的图像,也用于网页上的图像。 application/javascript JavaScript代码,通常用于网页上的客户端脚本。 application/octet-stream 二进制数据,没有指定具体的类型。 multipart/form-data 通常用于HTTP POST请求中的文件上传,用于在表单中上传文件。 application/x-www-form-urlencoded 通常用于HTTP POST请求中的表单数据,数据被编码成URL格式。 audio/mpeg MP3音频文件。 video/mp4 MP4视频文件。 -
提交phpinfo.php文件,并用bp修改Content-Type
-
查看上传的
phpinfo()
4、php拓展名
-
查看源码,后台禁止上传以下后缀名的文件
-
可以上传php5,phtml等的文件,将phpinfo.php修改为phpinfo.html,然后直接上传文件,复制图像链接
-
在浏览器中打开上传的文件