文件上傳漏洞

Mou.webp
Published on
/
4 mins read
/
––– views

漏洞原理


概述

通過上傳一句話木馬,根據服務器返回的文件位置,向該路徑傳遞POST參數,控制服務器。

  • 即webshell
<?php eval($_POST['a']); ?>

常見繞過

文件頭繞過

文件類型文件頭HEX文件頭內容
PNG89504E47.PNG
GIF474946383961GIF89a
JPEGFFD8FF...
  • . 表示不可見內容

給php等文件添加文件頭繞過

  • php、asp、jsp等文件只要任意部位有解析標籤就可以,文件頭加上一串字符不影響解析。

拓展名繞過

發現php後綴被攔截,可用其他的後綴在進行繞過。

  • phtml、pht、php、php3、php4、php5
  • 還有:大小寫繞過、點號繞過(win)、空格繞過(win)

::$DATA 繞過

(WIN)如果文件名+::$DATA會把::$DATA之後的數據當成文件流處理,不會檢測後綴名,且保持::$DATA之前的文件名,效果就是不檢查後綴名。

  • 如:a.php::$DATAa.php 等價

<? 繞過

<script language="php">
  eval($_POST['zj'])
</script>

MIME

MIME類型用於HTTP協議,以告知服務器接收到的文件的類型。

可以通過抓包修改MIME類型,繞過驗證。

  • 注意:對於圖片上傳可能白名單隻有jpeg,導致png也被禁用,測試注意不要只測png

條件競爭繞過

有些網站是先允許任何文件上傳,在上傳之後再驗證,如果驗證不通過再刪除文件。

但是,攻擊者可以利用上傳後和刪除前的時間大量發送請求,有可能能訪問到webshell

文件解壓繞過

通過修改壓縮包二進制文件,使其在解壓時出現錯誤,通過出錯前已經解壓出的一部分文件獲取webshell。

原理是:在發生解壓錯誤時,網站邏輯會進入異常處理的分支,而開發人員往往會忽視對已經解壓的文件進行檢驗。


解析為php

.htaccess

  • 適用於Apache

上傳一個.htaccess文件將指定文件內容解析為php程序

<FilesMatch "zj.jpg">

SetHandler application/x-httpd-php

</FilesMatch>

.user.ini

  • 適用於Nginx

指定一個文件(如zj.jpg),將該文件就會被包含在要執行的php文件中(如index.php),類似於在index.php中插入一句:include(zj.jpg);

上傳的圖片文件的地址其實指向了一個php文件:

  • 例如 http://d2e89e76-3d3c-43ce-97ab-5a7db5826f78.node5.buuoj.cn/uploads/065831472858248584ff4993846d5065/index.php
  • zj.jpg 在 index.php 的頁面中,蟻劍也要連這個index.php
GIF89a

auto_prepend_file=zj.jpg

前端驗證

網頁彈窗顯然是前端驗證,直接抓包是沒有用的,因為前端驗證是在發送數據包給後端之前的,前端驗證發生錯誤直接return了,不會發包給後端。

解決:F12,刪除前端相應檢測代碼;假如是js腳本,(似乎chrome中刪了也沒用)可以直接在f12設置中,==禁用js功能!!!==


題目

  • [極客大挑戰 2019]Upload
← Previous postPHP 一句話木馬
Next post →PHP代碼審計