1. 程式人生 > >檔案上傳漏洞的講解

檔案上傳漏洞的講解

為什麼檔案上傳存在漏洞

  • 上傳檔案的時候,如果伺服器指令碼語言,未對上傳的檔案進行嚴格的驗證和過濾,就容易造成上傳任意檔案,包括上傳指令碼檔案。

  • 如果是正常的PHP檔案,對伺服器則沒有任何危害。

  • PHP可以像其他的程式語言一樣,可以檢視目錄下的檔案,檢視檔案中的嗎內容,可以執行系統命令等。

  • 上傳檔案的時候,如果伺服器端指令碼語言,未對上傳的檔案進行嚴格的驗證和過濾,就有可能上傳惡意的PHP檔案,從而控制整個網站,甚至是伺服器。這個惡意的PHP檔案,又被稱為WebShell

檔案上傳漏洞的例項:

這是我在DVWA裡面擷取的關於檔案上傳的後端程式碼讓我們來分析一下

low級別的檔案上傳

我們對這裡的後端程式碼進行分析
$target_path  = DVWA_WEB_PAGE_TO_ROOT . "hackable/uploads/";         表示上傳的路徑
 basename( $_FILES[ 'uploaded' ][ 'name' ] );    表示獲取上傳的檔案的名字
move_uploaded_file( $_FILES[ 'uploaded' ][ 'tmp_name' ], $target_path )  //表示將檔案儲存到新的taeget_path目錄下
這個例項沒有對我們上傳的檔案進行任何過濾,因此我們可以很容易的進行攻擊
$_file['uploaded']['tmp_name']表示上傳檔案臨時存放的路徑

這個並沒有過濾條件,因此我們可以直接進行上傳我們想要上傳的檔案建立一個php檔案,並加入<?php eval($_POST['KEY']);?>

這個表示一句話木馬,KEY表示自己建立的密碼,我們將這個檔案上傳上去。

如圖:

這時我們便成功的連線上了網站,我們可以檢視任何內容。

medium級別的上傳漏洞

這個程式碼和上面的類似,不同之處在於對上傳的檔案進行了過濾  if( ( $uploaded_type == "image/jpeg" || $uploaded_type == "image/png" ) &&( $uploaded_size < 100000 ) )

這句便是過濾的語句,限制了上傳h的f型別sa和大小,我們可以針對不同的版本來進行繞過

我們可以看到$_file陣列,這個是php中自定義的超全域性變數,這個變數是針對上傳檔案的,這是一個二維陣列,第一【】內表示上傳的檔名字這個檔案的物件,第二個【】表示一些這個檔案的屬性.

$_FILE常見的屬性有:

  • $_FILES["file"]["name"] - 被上傳檔案的名稱
  • $_FILES["file"]["type"] - 被上傳檔案的型別
  • $_FILES["file"]["size"] - 被上傳檔案的大小,以位元組計
  • $_FILES["file"]["tmp_name"] - 儲存在伺服器的檔案的臨時副本的名稱
  • $_FILES["file"]["error"] - 由檔案上傳導致的錯誤程式碼

我們這個題目便是利用到了$_FILE['name']['type']這個屬性,表示被上傳的檔案型別,這個便很容易繞過,因此這個屬性的值是從content-type這個欄位得到的,我們可以修改這個欄位的值來進行繞過。

接下來是high級別的

上面我們對後端是怎麼處理我們上傳的檔案有了一些瞭解了,接下來該是我們怎麼利用這些存在漏洞的學習了,下面我將列舉出一些我們常見的漏洞,並舉一些例項來加深對這些知識的瞭解。

iis漏洞

使用iis5-iis6的伺服器存在漏洞,這個版本的伺服器通常以asp語言作為後端語言

  1. 目錄的解析漏洞:伺服器會將 .asp結尾的目錄中的檔案解析為asp檔案

    原理: 伺服器預設會把.asp,.asp目錄下的檔案都解析成asp檔案

    eg:www.baidu.com/aa.asp/bb.txt當我們訪問bb.txt時實際上伺服器會將bb.txt當作asp語言來解析

  2. 檔案解析

    形式:www.xxx.com/xx.asp;.jpg

    原理:伺服器預設不解析;號後面的內容,因此xx.asp;.jpg便被解析成asp檔案了。

    因此又是我們可以新增;來進行檔案型別的繞過

  3. IIS6.0 預設的可執行檔案除了asp還包含這三種 :

    /test.asa

    /test.cer

    /test.cdx

apache解析漏洞

漏洞的原理:

Apache 解析檔案的規則是從右到左開始判斷解析,如果字尾名為不可識別檔案解析,就再往左判斷

eg:aa.php.aa 但解析這個檔案時apache不知道.aa是什麼型別便會繼續向左解析,直到解析到apache認識的檔案型別,因此這個便會被解析成php檔案