白帽子黑客攻防系列課程(七)文件包含漏洞

課程前言

白帽子黑客攻防系列課程第二季現已上線。

本課程僅做學習交流之用,切勿用於任何不法用途!
白帽子黑客攻防系列課程將會深入淺出講解計算機網絡基礎、滲透靶場搭建、Kali Linux、系統漏洞、滲透工具(Nmap、Sqlmap、AWVS等)等的原理及實戰內容。
第二季主要講解DVWA黑客攻防演練等,配合講解網絡基礎知識及Linux基礎知識等。
知其然並知其所以然,相信通過學習,各位朋友對白帽子黑客攻防會有非常深刻理解。
夢想還是要有的,萬一實現了呢!

網易雲課堂地址:https://study.163.com/course/courseMain.htm?courseId=1209505841&share=2&shareId=480000001946405

本篇博文爲文件包含漏洞要點筆記,主要介紹黑客攻防中的文件包含攻防技術。

文件包含漏洞概述

程序開發人員一般會把重複使用的函數寫到單個文件中,需要使用某個函數時直接調用此文件,而無需再次編寫,這種文件調用的過程一般被稱爲文件包含(File Inclusion)。 通過函數包含文件時,由於沒有對包含的文件名進行有效的過濾處理,被攻擊者利用從而導致了包含了Web根目錄以外的文件進來,就會導致文件信息的泄露甚至注入了惡意代碼。

1. 本地文件包含 LFI 當被包含的文件在服務器本地時,就叫本地文件包含。

2. 遠程文件包含 RFI 當被包含的文件在第三方服務器時,就叫遠程文件包含。 需要開啓 php.ini 中的allow_url_fopen 和 allow_url_include。

include()、include_once()、require()、require_once()

include():只有代碼執行到該函數時纔會包含文件進來,發生錯誤時只給出一個警告並繼續向下執行。

include_once():和include()功能相同,區別在於當重複調用同一文件時,程序只調用一次。

require():只要程序執行就包含文件進來,發生錯誤時會輸出錯誤結果並終止運行。

require_once():和require()功能相同,區別在於當重複調用同一文件時,程序只調用一次。

初級原理及實操

view source

點擊file1.php看地址欄

http://192.168.199.217/dvwa/vulnerabilities/fi/?page=c:\boot.ini

http://192.168.199.217/dvwa/vulnerabilities/fi/?page=http://www.baidu.com

Windows:

C:\boot.ini  //查看系統版本 C:\Windows\System32\inetsrv\MetaBase.xml  //IIS配置文件 C:\Windows\repair\sam  //存儲系統初次安裝的密碼 C:\Program Files\mysql\my.ini  //Mysql配置 C:\Program Files\mysql\data\mysql\user.MYD  //mysql root C:\Windows\php.ini  //php配置信息 C:\Windows\my.ini  //mysql配置信息 ...

Linux:

/root/.ssh/authorized_keys /root/.ssh/id_rsa /root/.ssh/id_ras.keystore /root/.ssh/known_hosts /etc/passwd /etc/shadow /etc/my.cnf /etc/httpd/conf/httpd.conf /root/.bash_history /root/.mysql_history /proc/self/fd/fd[0-9]*(文件標識符) /proc/mounts /porc/config.gz ...

中級原理及實操

view source

// Input validation

無法使用 "http://", "https://"

$file = str_replace( array( "http://", "https://" ), "", $file );

無法使用"../", "..\""上層路徑

$file = str_replace( array( "../", "..\"" ), "", $file );

http://192.168.199.217/dvwa/vulnerabilities/fi/?page=c:\boot.ini

http://192.168.199.217/dvwa/vulnerabilities/fi/?page=HTTP://www.baidu.com

"./":代表目前所在的目錄。 " . ./"代表上一層目錄。 "/":代表根目錄。

1、文件在當前目錄(以圖像文件爲例,當前項目文件爲中心)  "./1.jpg" 或 "1.jpg"

2、文件在上層目錄

(1)在上層目錄下     "../1.jpg"

(2)在上層目錄下的一個Image文件夾下   "../Image/1.jpg"

(3)在上上層目錄下   "../../1.jpg"

3、文件在下一層目錄(Image1文件夾)    "./Image1/1.jpg"

4、根目錄表示法,任何頁面訪問Image下的Image.jpg圖片    "C:/Image/1.jpg"

高級原理及實操

view source

if( !fnmatch( "file*", $file ) && $file != "include.php" ) {    

// This isn't the page we want!    

echo "ERROR: File not found!";    

exit; }

只有文件名是有 file 開頭的文件才能打開

http://192.168.199.217/dvwa/vulnerabilities/fi/?page=file://c:\boot.ini

http://192.168.199.217/dvwa/vulnerabilities/fi/?page=file4.php

神仙級原理剖析

view source

// Only allow include.php or file{1..3}.php

if( $file != "include.php" && $file != "file1.php" && $file != "file2.php" && $file != "file3.php" ) {  

  // This isn't the page we want!    

echo "ERROR: File not found!";  

  exit;

}

總結

基於白名單的包含文件驗證,驗證被包含的文件是否在白名單中。

儘量不要使用動態包含,可以在需要包含的頁面固定寫好,如:include("func.php")。

對所有輸入提交可能包含的文件地址,包括服務器本地文件及遠程文件,進行嚴格的檢查,參數中不允許出現../之類的目錄跳轉符。

可以通過調用str_replace()函數實現相關敏感字符的過濾,一定程度上防禦了遠程文件包含。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章