首頁  >  文章  >  後端開發  >  深入淺析PHP檔案包含漏洞

深入淺析PHP檔案包含漏洞

WBOY
WBOY轉載
2022-05-09 17:30:2410740瀏覽

本篇文章為大家帶來關於PHP的相關知識,其中主要介紹了關於文件包含漏洞的相關問題,文件包含漏洞的產生原因是在透過PHP的函數引入文件時,由於傳入的檔案名稱沒有經過合理的校驗,因此操作了預想以外的文件,希望對大家有幫助。

深入淺析PHP檔案包含漏洞

推薦學習:《PHP影片教學

漏洞描述

文件包含漏洞的產生原因是透過PHP的函數引入檔案時,由於傳入的檔案名稱沒有經過合理的校驗,從而操作了預想之外的文件,就可能導致意外的檔案外洩甚至惡意的程式碼注入。
PHP中引發檔案包含漏洞的通常是以下四個函數:
1、include()當使用該函數包含檔案時,只有程式碼執行到include()函數時才將檔案包含進來,發生錯誤時只給予一個警告,繼續向下執行。
2、include_once()功能和include()相同,差別在於重複呼叫相同檔案時,程式只會呼叫一次。
3、require()只要程式一執行就會立即呼叫檔案,發生錯誤的時候會輸出錯誤訊息,並且終止腳本的執行
4、require_once()它的功能與require()相同,區別在於重複呼叫相同檔案時,程式只會呼叫一次。

漏洞危害

攻擊者可利用此漏洞進行任意檔案包含讀取,以取得伺服器敏感資訊。

漏洞影響版本

此漏洞的存在與版本無關

#漏洞分析

在給PHP發送POST封包時,如果封包包含檔案區塊,無論你造訪的程式碼中有沒有處理檔案上傳的邏輯,PHP都會將這個檔案保存成一個暫存檔案(通常是/tmp/php[6個隨機字元]),檔案名稱可以在$ _FILES變數中找到。這個臨時文件,在請求結束後就會被刪除。
同時,因為phpinfo頁面會將當前請求上下文中所有變數都列印出來,所以我們如果向phpinfo頁面發送包含文件區塊的資料包,則即可在返回包裡找到$_FILES變數的內容,自然也包含臨時檔案名稱。
在檔案包含漏洞找不到可利用的檔案時,即可利用這個方法,找到暫存檔案名,然後包含之。
但檔案包含漏洞和phpinfo頁面通常是兩個頁面,理論上我們需要先傳送封包給phpinfo頁面,然後從回傳頁面中配對出暫存檔案名,再將這個檔案名稱傳送給檔案包含漏洞頁面,進行getshell。在第一個請求結束時,臨時檔案就被刪除了,第二個請求自然也無法進行包含。
這時候就需要用到條件競爭,具體流程如下:
1)發送包含了webshel​​l的上傳封包給phpinfo,這個封包的header,get等位置一定要塞滿垃圾資料。
2)phpinfo這時會將所有資料都列印出來,其中的垃圾資料會將phpinfo撐得非常大。
3)PHP預設緩衝區大小是4096,即PHP每次回傳4096個位元組給socket連線。
4)所以,我們直接操作原生socket,每次讀取4096個字節,只要讀取到的字元裡包含臨時檔案名,就立即發送第二個資料包。
5)此時,第一個封包的socket連線其實還沒結束,但PHP還在繼續每次輸出4096個位元組,所以臨時檔案還未被刪除。
6)我們可以利用這個時間差,成功包含臨時文件,最後getshell。

環境建構

  1. 啟動docker:
    service start docker
  2. 在docker-compose.yml檔案所在的路徑執行:
    docker-compose build
    docker-compose up -d
    深入淺析PHP檔案包含漏洞

#漏洞重複

  1. 訪問http://your-ip:8080/phpinfo.php ,可以看到頁面出現phpinfo頁面
    深入淺析PHP檔案包含漏洞2. 再造訪http://your-ip:8080/lfi.php?file=/etc/passwd,可以看到該頁面是存在檔案包含漏洞的。
    深入淺析PHP檔案包含漏洞POC驗證:
    使用方法:python3 PHP檔案包含漏洞_poc.py --target-url http://192.168.60.244:8080
    深入淺析PHP檔案包含漏洞

##修復建議

設定白名單。

推薦學習:《PHP影片教學

以上是深入淺析PHP檔案包含漏洞的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:csdn.net。如有侵權,請聯絡admin@php.cn刪除