1. 程式人生 > >PHP:文件包含漏洞

PHP:文件包含漏洞

data adf 校驗和 all php版本 req 服務器文件 常用 man

簡單記錄一些文件包含漏洞的常用方法

產生原因:

文件包含漏洞的產生原因是在通過引入文件時,由於傳入的文件名沒有經過合理的校驗,或者校檢被繞過,從而操作了預想之外的文件,就可能導致意外的文件泄露甚至惡意的代碼註入。

常見的導致文件包含的函數如下:

PHP: include(), include_once(), require(), require_once(), fopen(), readfile() ...
當使用前4個函數包含一個新的文件時,該文件將作為 php 代碼執行,php 內核不會在意該被包含的文件是什麽類型。

本地文件包含(LFI):

當被包含的文件在服務器本地時,就形成的本地文件包含漏洞。我們可以通過該漏洞讀取服務器文件,並執行包含php代碼的文件。以DVWA為例:

技術分享圖片

我們成功讀取了php探針文件。而本地文件包含在遇到過濾的情況下也需要一些繞過方法,比如%00截斷,點號截斷等。

%00截斷:
`/etc/passwd%00`
(需要 magic_quotes_gpc=off,PHP小於5.3.4有效)

%00截斷目錄遍歷:
`/var/www/%00`
(需要 magic_quotes_gpc=off,unix文件系統,比如FreeBSD,OpenBSD,NetBSD,Solaris)

路徑長度截斷:
`/etc/passwd/././././././.[…]/./././././.`
(php版本小於5.2.8(?)可以成功,linux需要文件名長於4096,windows需要長於256)

點號截斷:
`/boot.ini/………[…]…………`
(php版本小於5.2.8(?)可以成功,只適用windows,點號需要長於256)

修復方案:

限制用戶訪問區域,並校驗和過濾用戶傳入的參數。

遠程文件包含(RFI):

技術分享圖片

這裏註意一下,當我們遠程服務器上的文件為xx.php與xx.txt時,存在遠程文件包含漏洞的服務器在執行這兩個文件時結果是不同的,以DVWA為例:

技術分享圖片這是xx.txt文件執行phpinfo後所顯示的ip。

技術分享圖片這是xx.php執行phpinfo後的ip地址。

這說明遠程文件包含漏洞所包含的文件為非php後綴才是正確的,因為當後綴名為php結尾的文件被執行時實在攻擊者本機上執行的,而非php後綴的文件實在受害機上執行的。

PHP的部分常用偽協議:

* file 協議讀取本地文件:`file=file://etc/passwd`
(需要allow_url_fopen=On並且 allow_url_include=On)

* 利用php流input:`?file=php://input`
(需要allow_url_include=On,詳細→http://php.net/manual/en/wrappers.php.php)

* 利用php流filter:`?file=php://filter/convert.base64-encode/resource=index.php`
(同上)

* 利用data URIs:`?file=data://text/plain;base64,SSBsb3ZlIFBIUAo=%00`
(需要allow_url_include=On)

當網站存在本地文件包含漏洞和上傳漏洞時我們可以配合兩個漏洞GETSHELL。

任重而道遠,共勉!

PHP:文件包含漏洞