【web安全】文件上传漏洞原理是什么

2021-01-20 20:26发布

9条回答
Sophia
2楼 · 2021-01-21 09:28

在有上传功能的系统中,如果应用程序没有对用户上传的文件做严格的校验,那么可能会导致用户上传脚本文件,然后用户再通过访问这些文件的方式,来达到执行该脚本文件,从而控制服务器的目的。


用户上传了一个可执行的脚本文件,并通过该文件获得了执行服务端命令的权限

樱田妮妮NiNi
4楼 · 2021-01-21 10:44

Web应用程序通常会有文件上传的功能, 例如在 BBS发布图片 , 在个人网站发布ZIP 压缩 包, 在办公平台发布DOC文件等 , 只要 Web应用程序允许上传文件, 就有可能存在文件上传漏 洞.

什么样的网站会有文件上传漏洞?

大部分文件上传漏洞的产生是因为Web应用程序没有对上传文件的格式进行严格过滤 , 还有一部分是攻击者通过 Web服务器的解析漏洞来突破Web应用程序的防护, 后面我们会讲 到一些常见的解析漏洞, 最后还有一些不常见的其他漏洞,  IIS PUT 漏洞等 .


不吃鱼的猫
5楼 · 2021-01-21 10:55

当文件上传点没有对上传的文件进行严格的验证和过滤时,就容易造成任意文件上传,包括上传动态文件(asp,php,jsp)等
如果上传的目标目录没有限制执行权限,导致所上传的动态文件可以正常执行,就导致了文件上传漏洞

我是大脸猫
6楼 · 2021-01-21 11:04

一. 什么是文件上传漏洞

Web应用程序通常会有文件上传的功能, 例如在 BBS发布图片 , 在个人网站发布ZIP 压缩 包, 在办公平台发布DOC文件等 , 只要 Web应用程序允许上传文件, 就有可能存在文件上传漏 洞.

什么样的网站会有文件上传漏洞?

大部分文件上传漏洞的产生是因为Web应用程序没有对上传文件的格式进行严格过滤 , 还有一部分是攻击者通过 Web服务器的解析漏洞来突破Web应用程序的防护, 后面我们会讲 到一些常见的解析漏洞, 最后还有一些不常见的其他漏洞,  IIS PUT 漏洞等 .

二. 文件上传漏洞的危害

上传漏洞与SQL注入或 XSS相比 , 其风险更大 , 如果 Web应用程序存在上传漏洞 , 攻击者甚至 可以直接上传一个webshell到服务器上 .

三. 常见的解析漏洞

1.IIS 解析漏洞

IIS6.0 在解析文件时存在以下两个解析漏洞 .

①当建立 *.asa  、*.asp 格式的文件夹时 , 其目录下的任意文件豆浆被 IIS 当作 asp 文件 来解析 .

② 在 IIS6.0 下 , 分 号 后面 的 扩 展 名 不 会 被 解 析 , 也 就 是 说 当 文 件 为 *.asp;.jpg

时,IIS6.0 同样会以 ASP脚本来执行 .

2.Apache 解析漏洞

 Apache 1.x  Apache 2.x 中存在解析漏洞 , 但他们与 IIS 解析漏洞不同 .

Apache 在解析文件时有一个规则 : 当碰到不认识的扩展名时 , 将会从后向前解析 , 直到 碰到认识的扩展名位置 , 如果都不认识 , 则会暴露其源码 . 比如 :

1.php.rar.xx.aa

Apache 首先会解析 aa 扩展名 , 如果不认识则接着解析 xx 扩展名 , 这样一直遍历到认识 的扩展名为止 , 然后再将其进行解析 .

3.PHP CGI 解析漏洞

在 PHP的配置文件中有一个关键的选项 : cgi.fi: x_pathinfo. 这个选项在某些版本是

默认开启的 , 在开启时访问 url, 比如 :http://www.xxx.com/x.txt/x.php,x.php 是不存在的 文件 , 所以 php 将会向前递归解析 , 于是就造成了解析漏洞 . 由于这种漏洞常见于 IIS7.0  IIS7.5 、 Nginx 等 Web服务器 , 所以经常会被误认为是这些 Web服务器的解析漏洞 .

4.Nginx <8>

影响版本 :0.5,0.6,0.7<=0.7.65 0.8<=0.8.37

Nginx 在图片中嵌入 PHP代码 , 然后通过访问 xxx.jpg.php 可以执行其中的代码 .

5. 其他

 windows  环境下, xx.jpg[ 空格 ] 或 xx.jpg. 这两类文件都是不允许存在的 , 若这样命 名,windows 会默认除去空格或点 , 攻击者可以通过抓包 , 在文件名后加一个空格或者点绕过 黑名单 . 若上传成功 , 空格和点都会被 windows 自动消除 , 这样也可以 getshell.

如果在 Apache 中 .htaccess 可被执行 . 且可被上传 . 那可以尝试在 .htaccess 中写入 :

SetHandlerapplication/x-httpd-php

然后再上传名称为 shell.jpg 的 webshell, 这样 shell.jpg 就可解析为 php 文件 .

四. 文件上传漏洞的防御方法

很多开发者仅仅通过使用 javascript 来防御非法文件上传 , 这样验证对于一些普通用户防 止上传错误还可以 , 对专业的技术人员来说 , 这是非常低级的验证 . 攻击者可以通过非常多的 方法来突破前端验证  , 下面举两个例子 :

1. 使用 FireBug

FireBug 是一款开源的浏览器插件 , 它支持 Firefox,Chrome 等浏览器 . 它可以让 Web 发者轻松地调试  HTML、javascirpt   AJAX、 CSS等前端脚本代码  . 正是因为 FireBug 功能强 大, 所以也成为了黑客的必备利器   .

如何使用 FireBug 绕过客户端检测 .

当单击提交按钮后 ,Form 表单将会触发 onsubmit 事件 ,onsubmit 事件将会调用 checkFile 函数 .checkFile 函数将会检测文件扩展名是否合法 , 并返回一个布尔值 , 如果 checkFile 函数返回 true, 则表单提交 , 反之则拦截要上传的文件 . 知道这一点后 , 可以用 FireBug 将 onsubmit 事件删除 , 这样就可以绕过 javascript 函数验证 .

2. 中间人攻击

中间人攻击和使用 FireBug 的方法完全不同 ,FireBug 是删除客户端的 javascript 验证 , 而使用 Burp Suite 等抓包软件则是按照正常的流程通过 javascript 验证 , 然后在传输中的 HTTP层做修改 .

首先把木马文件的扩展名字改为一张正常图片或文档的扩展名 , 如 jpg 扩展名 , 在上传 时使用 Burp  拦截上传数据 , 再将其中的扩展名 jpg  修改成 jsp, 就可以绕过客户端验证 .

通过以上例子  , 大家可以看出前端脚本验证是一种非常不可靠的验证方式  , 不管是对文 件上传 、XSS还是别的漏洞来说都是如此 , 当然这并不是说完全不需要做前端验证 , 而是要把 前端验证和服务器端验证相结合   .

我们来看服务端检测 , 在上传文件时 ,  大多开发者会对文件扩展名检测 , 验证文件扩展名 通常有两种方式 : 黑名单和白名单 .

黑名单过滤是一种不安全的方式 , 黑名单定义了一系列不安全的扩展名 , 服务器端在接 收文件后 , 与黑名单扩展名对比 , 如果发现文件扩展名与黑名单里的扩展名匹配 , 则认为文件 不合法 .

为什么黑名单过滤是一种不安全的方式呢 ?

比如一个 Web服务器为 IIS6.0,Web 语言为 asp 的网站 , 假定开发者使用了黑名单过滤 ,

过滤了 asp、 asa、 cer 等文件格式 , 那么可以尝试以下几种方式来绕过 : 1. 大小写 , 比如 AsP、 cER等.

2. 被忽略的扩展名 ,IIS6.0 会把 cdx 格式的文件当成 asp 来解析 .

3. 配合解析漏洞 , 上传 asp;.jpg 格式文件 .

4. 如果 Web服务器开启了其他语言的支持 , 比如可以解析 php 文件 , 那么可以上传 php

格式的木马 .

5. 利用 Windows 系统自动去除 . 和空格的特性 , 如上传扩展名 asp. 格式的文件来绕过 .

通过以上几个例子可以看出 , 黑名单过滤的可靠性并不高 , 白名单过滤相对来说较为可靠.

白名单与黑名单的机智恰恰相反 , 黑名单是定义不允许上传的扩展名 , 白名单则是定义允许 上传的扩展名 , 虽然采用白名单可以防御未知风险 , 但是不能完全依赖白名单 , 因为白名单不 能完全防御上传漏洞 , 例如各种解析漏洞等 , 白名单仅仅是防御上传漏洞的第一步 . 通常会结 合其他验证方式来使用 , 虽然不能完全防御文件上传漏洞 , 但也基本上规避了绝大部分风险.。

其他几种文件上传漏洞防御方法 :

1. 检查文件上传路径 ( 避免 0x00 截断、 IIS6.0 文件夹解析漏洞、目录遍历 )

2. 文件扩展名检测 ( 避免服务器以非图片的文件格式解析文件 )

3. 文件 MIME验证 ( 比如 GIF 图片 MIME为 image/gif,CSS 文件的 MIME为 text/css 等 ) 3. 文件内容检测 ( 避免图片中插入 webshell)

4. 图片二次渲染 ( 最{{BANNED}}的上传漏洞防御方式 , 基本上完全避免了文件上传漏洞 )

5. 文件重命名 ( 如随机字符串或时间戳等方式 , 防止攻击者得到 webshell 的路径 )

另外值得注意的一点是, 攻击者上传了webshell之后需要得到webshell 的路径才能通过工 具连接 webshell, 所以尽量不要在任何地方 ( 如下载链接等 ) 暴露文件上传后的地址, 在这里 必须要提一点 , 就是有很多网站的上传点在上传了文件之后不会在网页上或下载链接中暴露 文件的相对路径, 但是在服务器返回的数据包里却带有文件上传后的路径 .

 


赵小刀
7楼 · 2021-01-24 16:52

系统漏洞会影响到的范围很大,包括系统本身及其支撑软件,网络客户和服务器软件,网络路由器和安全防火墙等。

腾讯电脑管家可以修复Windows操作系统漏洞,还可以智能筛选区分出高危漏洞补丁及功能性补丁,操作方法:腾讯电脑管家-工具箱-选择“修复漏洞”。


一朵大红花啊
8楼 · 2021-01-28 13:51

 windows  环境下, xx.jpg[ 空格 ] 或 xx.jpg. 这两类文件都是不允许存在的 , 若这样命 名,windows 会默认除去空格或点 , 攻击者可以通过抓包 , 在文件名后加一个空格或者点绕过 黑名单 . 若上传成功 , 空格和点都会被 windows 自动消除 , 这样也可以 getshell.

如果在 Apache 中 .htaccess 可被执行 . 且可被上传 . 那可以尝试在 .htaccess 中写入 :

SetHandlerapplication/x-httpd-php

然后再上传名称为 shell.jpg 的 webshell, 这样 shell.jpg 就可解析为 php 文件


征戰撩四汸
9楼 · 2022-01-18 17:01

大部分的网站和应用系统都有上传功能,而程序员在开发任意文件上传功能时,并未考虑文件格式后缀的合法性校验或者是否只在前端经过js进行后缀检验。这时攻击者能够上传一个与网站脚本语言相对应的恶意代码动态脚本,例如(jsp、asp、php、aspx文件后缀)到服务器上,从而访问这些恶意脚本中包含的恶意代码,进行动态解析最终达到执行恶意代码的效果,进一步影响服务器安全。

相关问题推荐

  • 回答 6

    这个还是因人而异吧,看你自己对哪方面感兴趣,兴趣是最好的老师,感兴趣了才愿意钻研学习下去,简单说一下这两个学习知识方面的不同吧:软件测试岗位虽然对于从业者的知识基础要求不高,但是软件测试岗位所涉及到的知识面还是比较广的,所以软件测试人员也需...

  • 回答 5

    SQL注入漏洞的危害:1、数据库中存储的用户隐私信息泄漏;2、通过操作数据库对某些网页进行篡改;3、修改数据库一些字段的值,嵌入网马链接,进行挂马攻击;4、数据库服务器被恶意操作,系统管理员帐户被窜改;5、数据库服务器提供的操作系统支持,让黑客得以...

  • 回答 16

    一、CISP(Certified Information Security Professional)证书中文叫注册信息安全专业人员,由中国信息安全产品测评认证中心实施的国家认证。可以说,这是目前国内对于个人来说认可度最高的信息安全人员资质,堪称最权威、最专业、最系统。根据实际岗位的不...

  • 回答 14

    渗透测试(也称为pentest)是测试移动应用程序漏洞的过程。此测试的主要目的是确保外部人员的重要数据.通过模拟黑客的思维和攻击手段,对计算机业务系统的弱点、技术缺陷和漏洞进行探查评估。经过客户授权后,在不影响业务系统正常运行的条件下,渗透人员在黑...

  • 回答 1

    网络安全是指网络系统的硬件、软件及其系统中的数据受到保护,不因偶然的或者恶意的原因而遭受到破坏、更改、泄露,系统连续可靠正常地运行,网络服务不中断。主要涉及到的有:1、物理措施:例如,保护网络关键设备(如交换机、大型计算机等),制定严格的网络...

  • 回答 33

      网络安全工程师学习内容:  1、计算机应用、计算机网络、通信、信息安全等相关专业本科学历,三年以上网络安全领域工作经验;  2、精通网络安全技术:包括端口、服务漏洞扫描、程序漏洞分析检测、权限管理、入侵和攻击分析追踪、网站渗透、病毒木马防...

  • 回答 26

      学历不是问题,技术才是硬道理!只要你的技术过硬的话,你完全可以进国家安全部门去工作的。比如公安局里的网监工作,大都是九零后的电脑方面的精英。未必都是本科生。还有从社会上特招进去的。所以说,现在是拿技术说话,不是靠学历吃饭的时代了。  网...

  • 回答 16

    网络安全的知识是比较简单的,比较好入门,好多知识理论,大家都是可以听懂的,这是完全没有问题的。网络安全最终的则是实战的应用,怎么把这些理论知识运用到事件中,这些才是重中之重。所以在选择培训机构的时候,也需要尽量去找这些实践操作多的培训机构。...

  • 回答 22

      能够胜任的岗位主要有:渗透测试工程师、大数据安全工程师、信息安全工程师、安全测试工程师、安全服务工程师、安全运维工程师、系统安全工程师、服务器安全工程师、云计算安全工程师、网络安全工程师、安全分析师、渗透讲师等;  按照web渗透、内网渗透...

  • 回答 23

    一些典型的网络安全问题,可以来梳理一下:IP安全:主要的攻击方式有被动攻击的网络窃听,主动攻击的IP欺骗(copy报文伪造、篡改)和路由攻击(中间人攻击);2. DNS安全:这个大家应该比较熟悉,修改DNS的映射表,误导用户的访问流量;3. DoS攻击:单一攻击...

  • 回答 19

    运维一般是设备或者环境的搭建和维护,网络安全可以看做是防火墙

  • 回答 12

    先说说运维工程师和网络工程师的区别。运维工程师是泛指,网络工程师为特指,所以不能这么对比。你应该这么理解,网络工程师是一个人(也可以是理解成一个岗位),而运维则是他的工作内容。从工作内容上来说,运维可细分为桌面运维、网络运维、服务器运维三大...

没有解决我的问题,去提问