前言
文件上传是一种常见的网络安全,存在于许多Web应用程序中。利用这个可以上传恶意文件到目标服务器,从而执行各种恶意操作,如执行恶意代码、获取敏感信息、控制服务器等。
文件上传的原理是,Web应用程序没有对用户上传的文件进行充分的验证和过滤。可以通过构造特定的文件内容和文件名,绕过应用程序的验证机制,将恶意文件上传到服务器上。
文件上传可以通过以下方式来利用:
1. 上传恶意脚本文件:可以上传包含恶意代码的脚本文件,如PHP、ASP、JSP等。一旦服务器执行这些恶意脚本,就可以执行任意代码,包括执行系统命令、访问数据库等。
2. 上传恶意文件类型:可以上传具有危险扩展名的文件,如可执行文件、Webshell、恶意软件等。这些文件可能会被服务器执行或以某种方式被访问,从而危害服务器和用户的安全。
3. 绕过文件类型验证:应用程序通常会验证上传文件的类型,但可以通过修改文件的内容、伪造文件头等方式绕过这个验证机制,上传被禁止的文件类型。
为了防止文件上传,开发者可以采取以下措施:
1. 文件类型验证:应用程序应该对上传的文件进行类型验证,只允许特定的文件类型上传。这可以通过检查文件的扩展名或文件的内容进行验证。
2. 文件名验证:应用程序应该对上传的文件名进行验证,防止使用特殊字符或路径遍历等方式绕过文件名验证。
3. 文件内容检查:应用程序应该对上传的文件内容进行检查,确保文件不包含恶意代码或危险的内容。
4. 文件存储位置:应该将上传的文件存储在非Web可访问的目录下,确保攻击者无法直接访问上传的文件。
5. 权限控制:应该为上传文件设置适当的权限,以防止非授权用户访问或执行上传的文件。
总的来说,为了防止文件上传,开发者需要在应用程序中实施适当的安全措施,如文件类型验证、文件名验证、文件内容检查、文件存储位置和权限控制等。同时,定期更新和维护应用程序,以修复已知的和安全问题。用户也应保持浏览器和操作系统的更新,并警惕点击未知或可疑的链接。
一、介绍
upload-labs是一个专门用于学习文件上传的开源实验平台。它由Web安全研究人员余弦(knownsec)团队开发和维护,旨在帮助安全爱好者深入理解文件上传的原理和防护措施。
upload-labs提供了一系列的场景,每个场景都模拟了不同类型的文件上传。通过这些场景,用户可以学习如何发现、利用和修复文件上传。
在upload-labs中,用户可以通过上传文件表单与服务器进行交互。每个场景都有特定的点,用户需要通过尝试不同的上传方式和绕过技巧,成功上传恶意文件或绕过文件类型限制。
upload-labs提供了详细的解题指南,包括的原理、攻击方法、防护措施等。用户可以通过实际操作来加深对文件上传的理解,并提升自己的安全技能。
upload-labs是一个开源项目,源代码和相关文档都可以在GitHub上找到。这使得用户可以自由地学习、修改和分享这个实验平台。
总的来说,upload-labs是一个用于学习文件上传的实验平台,提供了一系列的场景和解题指南。通过实际操作,用户可以深入了解文件上传的原理和防护措施,并提升自己的安全技能。
二、Pass-01(禁用 JS)
上传 PHP 文件提示不允许上传,根据提示框猜测在前端做了验证
F12 查看源代码发现是在前端做的验证
设置中直接禁用 JS
上传文件后即可发现图片地址为 PHP 表示成功
三、Pass-02(修改 Content-Type)
提示对 Content-Type 检查
使用 BurpSuite 开启拦截抓包
上传 PHP 文件拦截数据包
将 Content-Type 修改为允许上传的类型(image/jpeg、image/png、image/gif)三选一,然后点击放行
上传成功!!
四、Pass-03(修改 filename)
这一关禁止了一些后缀名上传
使用 BurpSuite 开启拦截,修改 filename 值即可
上传成功
五、Pass-04(上传 .htaccess)
禁止了大量文件后缀名但是缺少 .htaccess 文件
htaccess文件(“分布式配置文件”)提供了针对目录改变配置的方法, 即,在一个特定的文档目录中放置一个包含一个或多个指令的文件, 以作用于此目录及其所有子目录。作为用户,所能使用的命令将受到限制。管理员可以通过Apache的AllowOverride指令来设置。
概述来说,htaccess文件是Apache服务器中的一个配置文件,它负责相关目录下的网页配置。通过htaccess文件,可以帮我们实现:网页301重定向、自定义404错误页面、改变文件扩展名、允许/阻止特定的用户或者目录的访问、禁止目录列表、配置默认文档等功能原理:上传覆盖.htaccess文件,重写解析规则,将上传的图片马以脚本方式解析
<FilesMatch "webshell"> SetHandler application/x-httpd-php </FilesMatch>
上传.htaccess文件设置的关键字的文件名,即上传一个名单没有过滤的随意后缀名文件,但文件名中一定要包含 webshell,如"webshell.jpg",内容为一句话。此时"webshell.jpg"会被Apache当作php解析
六、Pass-05(上传 .user.ini)
这一关过滤了 .htaccess 文件,查看提示说目录下存在一个 readme.php 文件
可以利用 user.ini ,这里简要说明下
.user.ini 文件是 PHP 中用于配置特定目录的设置的特殊文件。它类似于 Apache 服务器中的 .htaccess 文件,但仅适用于 PHP。.user.ini 文件允许用户为特定目录定义 PHP 配置指令,这些配置指令将在该目录及其所有子目录中的 PHP 脚本执行时生效。
.user.ini 文件的主要目的是为了允许非管理员用户自定义某些 PHP 配置选项,而不需要访问主 php.ini 文件。这样,不同的应用程序或用户可以在自己的目录中设置特定的 PHP 配置,而不影响整个服务器的配置。
在PHP环境中,.user.ini 文件与 .htaccess 文件类似,可以用来配置某些 PHP 环境 settings。当PHP.ini中的 user_ini.filename 和 user_ini.cache_ttl 被启用时,PHP会尝试在每个目录下查找并解析.user.ini文件。如果能够上传一个恶意的.user.ini文件到 PHP 服务器上,他们可能会利用这个文件来改变服务器的配置,例如修改auto_prepend_file或者auto_append_file设置,从而在服务器执行任意代码
例如,可能会在一个上传目录中放置一个.user.ini文件,内容如下:
auto_prepend_file=webshell.png //其中 webshell.png 需要与你上传的文件名相同
user.ini 文件里的意思是:所有的php文件都自动包含 webshell.png 文件
所以先上传 .user.ini 文件,然后上传 webshell.png 文件
七、Pass-06(大小写混淆)
打开提示发现黑名单对于大小写的过滤不全
可以将扩展名修改为 PhP
上传成功
八、Pass-07(双写绕过)
从这关之后就得看源码了,发现过滤了有点全,但从扩展名这可以尝试双写绕过
打开 BurpSuite 拦截数据包,修改 filename 值
上传成功
九、Pass-08(双点绕过)
审计源码发现没有过滤双点(单点过滤了)
打开 BurpSuite 拦截数据包,修改 filename 值
上传成功
十、Pass-09(::DATA)
查看源码发现没有过滤 " ::DATA “
在window的时候如果 文件名+"::$DATA"
会把::$DATA
之后的数据当成文件流处理,不会检测后缀名,且保持::$DATA
之前的文件名,他的目的就是不检查后缀名
打开 BurpSuite 拦截数据包,修改 filename 值