PHP檔案包含漏洞攻防實戰____PHP

來源:互聯網
上載者:User
摘要:本文對PHP檔案包含漏洞的形成、利用技巧及防範進行了詳細分析,並通過一個真實案例示範了如何利用PHP檔案包含漏洞對目標網站進行滲透測試,最終成功擷取到網站的WebShell。

本文對PHP檔案包含漏洞的形成、利用技巧及防範進行了詳細分析,並通過一個真實案例示範了如何利用PHP檔案包含漏洞對目標網站進行滲透測試,最終成功擷取到網站的WebShell。

PHP是一種非常流行的Web開發語言,互連網上的許多Web應用都是利用PHP開發的。在利用PHP開發的Web應用中,PHP檔案包含漏洞是一種常見的漏洞,利用PHP檔案包含漏洞入侵網站也是主流的一種攻擊手段。

PHP檔案包含漏洞介紹

首先,我們來介紹下何為檔案包含漏洞。嚴格來說,檔案包含漏洞是“代碼注入”的一種,其原理就是注入一段使用者能控制的指令碼或代碼,並讓服務端執行。“代碼注入”的典型代表就是檔案包含,檔案包含漏洞可能出現在JSP、PHP、ASP等語言中,原理都是一樣的,本文只介紹PHP檔案包含漏洞。

要想成功利用檔案包含漏洞進行攻擊,需要滿足以下兩個條件:

Web應用採用include()等檔案包含函數通過動態變數的方式引入需要包含的檔案

使用者能夠控制該動態變數

在PHP中,有四個用於包含檔案的函數,當使用這些函數包含檔案時,檔案中包含的PHP代碼會被執行。下面對它們之間的區別進行解釋:

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

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

require():1.require()與include()的區別在於require()執行如果發生錯誤,函數會輸出錯誤資訊,並終止指令碼的運行。2.使用require()函數包含檔案時,只要程式一執行,立即調用檔案,而include()只有程式執行到該函數時才調用。

require_once():它的功能與require()相同,區別在於當重複調用同一檔案時,程式只調用一次。

現在來看一段簡單的檔案包含代碼,如下圖1所示。

圖1

通過上面的代碼可以看到,在得到變數$filename的值後沒有經過任何處理,直接帶入include()函數中。此處就存在一個檔案包含漏洞,利用該漏洞我們可以查看系統中的任意檔案。

下面我們來實際測試一下。首先將該PHP頁面上傳到Web伺服器,先讓其包含一個正常的txt檔案,運行結果如下圖2所示。

圖2

接著我們在該txt文本中插入php代碼,看結果如何。這裡給其插入如下圖3所示代碼。

圖3

再次訪問,結果如下圖4所示。

圖4

通過上圖我們可以看到文本中的PHP代碼被成功執行了。

利用該漏洞,我們可以查看系統中的任意檔案,比如經常用到的“/etc/passwd”檔案,如圖5所示。

圖5

PHP檔案包含漏洞分為本地檔案包含漏洞(LFI)和遠程檔案包含漏洞(RFI),能夠開啟並包含本地檔案的漏洞,被稱為本地檔案包含漏洞。利用本地檔案包含漏洞,可以查看系統任意檔案內容,如果具備一些條件,也可以執行命令。在下面的漏洞利用技巧部分對這個有詳細介紹。

如果php.ini的配置選項allow_url_fopen和allow_url_include為ON的話,則檔案包含函數是可以載入遠程檔案的,這種漏洞被稱為遠程檔案包含漏洞。利用遠程檔案包含漏洞,可以直接執行任意命令。在實際滲透攻擊過程中,攻擊者可以在自己的Web伺服器上放一個可執行檔惡意檔案,通過目標網站存在的遠程檔案包含漏洞來負載檔案,從而實現執行任意命令的目的。

檔案包含漏洞利用技巧

遠程檔案包含漏洞之所以能夠執行命令,就是因為攻擊者可以自訂被包含的檔案內容。因此,本地檔案包含漏洞要想執行命令,也需要找一個攻擊者能夠控制內容的本地檔案。

目前主要有幾下幾種常見的技巧:

包含使用者上傳的檔案。這個很好理解,也是最簡單的一種辦法。如果使用者上傳的檔案內容中包含PHP代碼,那麼這些代碼被檔案包含函數載入後將會被執行。但能否攻擊成功,取決於上傳功能的設計,比如需要知道上傳檔案存放的實體路徑,還需要上傳的檔案有執行許可權。

包含data://或php://input等偽協議。這需要目標伺服器支援,同時要求allow_url_fopen為設定為ON。在PHP5.2.0之後的版本中支援data:偽協議,可以很方便地執行代碼。

包含Session檔案。這部分需要攻擊者能夠控制部分Session檔案的內容,PHP預設產生的Session檔案一般存放在/tmp目錄下。

包含記錄檔。比如Web伺服器的訪問記錄檔,這是一種通用的技巧。因為幾乎所有網站都會將使用者的訪問記錄到訪問日誌中。因此,攻擊者可以向Web日誌中插入PHP代碼,通過檔案包含漏洞來執行包含在Web日誌中的PHP代碼,下面的案例中就是利用該技巧成功擷取到目標網站的WebShell的。但需要注意的是,如果網站訪問量大的話,記錄檔可能會非常大,這時如果包含一個這麼大的檔案時,PHP進程可能會卡死。一般網站通常會每天產生一個新的記錄檔,因此在淩晨時進行攻擊相對來說容易成功。

包含/proc/self/environ檔案。這個也是一種通用的技巧,因為它根本不需要猜測被包含檔案的路徑,同時使用者也能控制它的內容,常見的做法是向User-Agent中注入PHP代碼來完成攻擊。

利用PHP檔案包含漏洞滲透某網站案例

上面我們詳細地介紹了PHP檔案包含漏洞的形成和測試,下面我們通過一個真實案例來講解下如何利用PHP檔案包含漏洞對目標網站進行滲透攻擊。

目標網站:中國電信某業務系統

目的:擷取到目標網站的WebShell

詳細滲透過程如下:

1. 發現漏洞

我們先來開啟目標網站的一個URL看下,如下所示:

URL:http://XXX.vnet.mobi/index.php?path=jcb/zt/gfsdtjqg/index.html

注意path=後面的內容,通過這個URL可以發現index.php調用檔案包含函數來包含網站目錄下的檔案,並展示給使用者。但這時我們並不能確定此URL存在檔案包含漏洞。下面我們來手工測試下是否存在檔案包含漏洞。因為該網站存在一個phpinfo.php的測試頁面,我們可以通過該頁面得到目標網站的很多有用資訊,不必進行模糊測試就可以擷取到Web目錄的絕對路徑,所以這裡可以直接構造已知檔案的路徑,讓其包含,來快速確認是否存在檔案包含漏洞。

我們通過包含一個已知的檔案”/etc/passwd”檔案來確認以上URL是否檔案包含漏洞。

圖6

通過上面返回的結果可以確定網站存在檔案包含漏洞,下面我們來示範下如何利用該漏洞進行滲透測試。

2. 漏洞利用

通過上面的測試,我們可以確定網站存在檔案包含漏洞。那麼這時問題來了,如何利用這個漏洞來達到我們的目的呢。其中一個思路就是將後門代碼插入網站的Web記錄檔中,利用目標網站存在的檔案包含漏洞包含此記錄檔,這時Web日誌中的後門代碼將會作為PHP代碼執行,這樣我們就可以擷取到一個WebShell進行後續攻擊。但這時面臨一個問題,我們需要知道Web日誌的存放路徑,否則無法實現目標。通常Web日誌存放路徑通過Web伺服器的設定檔指定,通過上面擷取的資訊可以確定目標網站使用的是Nginx伺服器,因此我們可以先通過包含Web伺服器設定檔(Nigix.conf)來擷取到Web日誌存放路徑,具體操作如下圖7所示。

圖7

3. 擷取WebShell

上面我們通過Web伺服器設定檔(Nginx.conf)擷取到了Web訪問日誌的存在路徑(/opt/nginx/logs/access.log),但因為該網站的記錄檔很大,這時訪問WebShell程式會卡死,所以我們選擇淩晨的時候進行再次攻擊。因為一般的網站都是每天產生一個訪問記錄檔,在淩晨的時候記錄檔較小,容易成功。下圖8展示了如下向Web訪問日誌中插入後門代碼.

圖8

最終,我們成功擷取到了目標網站的WebShell,如圖9。

圖9

PHP檔案包含漏洞防範

本部分主要從代碼層和Web伺服器安全配置兩個方面來講解PHP檔案包含漏洞的防範。首先來從代碼層來講,在開發過程中應該盡量避免動態變數,尤其是使用者可以控制的變數。一種保險的做法是採用“白名單”的方式將允許包含的檔案列出來,只允許包含白名單中的檔案,這樣就可以避免任意檔案包含的風險,可參考下面圖10所示的代碼實現。

圖10

還有一種做法是將檔案包含漏洞利用過程中的一些特殊字元定義在黑名單中,對傳入的參數進行過濾,但這樣有時會因為過濾不全,導致被有經驗的攻擊者繞過。

在Web伺服器安全配置方面可以通過設定php.ini中open_basedir的值將允許包含的檔案限定在某一特定目錄內,這樣可以有效避免利用檔案包含漏洞進行的攻擊。需要注意的是,open_basedir的值是目錄的首碼,因此假設設定如下值:open_basedir=/var/www/test,那麼實際上以下目錄都是在允許範圍內的。

/var/www/test

/var/www/test123

/var/www/testabc

如果要限定一個指定的目錄,需要在最後加上“/”,這一點需要特別注意。

open_basedir=/var/www/test/

如果有多個目錄,在Windows下目錄間用分號隔開,在Linux下面則用冒號隔開。

總結

上面我們通過文字和代碼對PHP檔案包含漏洞的形成、利用技巧及防範都做了詳細分析,並結合一個真實案例講解了如何利用PHP檔案包含漏洞對目標網站進行滲透測試,最終擷取到一個WebShell許可權。通過這些內容,相信讀者對PHP檔案包含漏洞有了一個深入的認識。其實只要明白了漏洞的原理,對漏洞有一個深入的認識,加上安全意識,徹底解決PHP檔案包含漏洞並不是一件困難的事情。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.