任意文件讀取漏洞
漏洞概念及成因
任意文件讀取漏洞(Arbitrary File Read Vulnerability)是指攻擊者可以通過web應用程序讀取任意文件而不受訪問控制限制的漏洞。這種漏洞可能導致敏感信息泄露、系統(tǒng)崩潰等問題。
攻擊者可以利用任意文件讀取漏洞訪問服務器上的任意文件,包括密碼文件、配置文件等,從而獲取系統(tǒng)權(quán)限和敏感信息。此外,攻擊者還可以利用該漏洞讀取應用程序中的敏感數(shù)據(jù),如數(shù)據(jù)庫憑據(jù)、API密鑰等。
任意文件讀取漏洞通常是由于未正確驗證用戶輸入所導致的。攻擊者可以通過構(gòu)造特殊的請求參數(shù)來繞過應用程序的訪問控制,從而訪問任意文件。例如,攻擊者可以通過修改URL路徑或添加特殊字符來訪問非預期的文件。
PHP語言相關漏洞
- 通過網(wǎng)頁頁面信息進行挖掘
我們可以通過查看網(wǎng)頁源代碼查看是否有以下PHP中任意文件漏洞常見觸發(fā)點進行挖掘,如果$filename沒有經(jīng)過校驗或者校驗不合格,用戶就可控制變量讀取任意文件,如/etc/passwd、/index.php、/config.ini等。
標準庫函數(shù):
fopen();//打開一個文件或 URL。
file();//把整個文件讀入一個數(shù)組中。數(shù)組中的每個元素都是文件中相應的一行,包括換行符在內(nèi)。
file_get_contents();//把整個文件讀入一個字符串中。
文件讀取函數(shù)等:
fread();//語法 string fread(int handle,int length);fread() 從文件指針 handle 讀取最多 length 個字節(jié)。
fgets();//語法:string fgets( int handle [,int length] );fgets() 從 handle 指向的文件中讀取一行并返回長度最多為 length-1 字節(jié)的字符串。
文件包含相關的函數(shù)等:
include();
require();
include_once();
require_once();
讀文件的執(zhí)行系統(tǒng)命令:
system();
exec();
shell_exec();
passthru();
PHP擴展也可以讀取文件的函數(shù):
php-curl擴展(文件內(nèi)容作為HTTP body)涉及文件存取的庫(如數(shù)據(jù)庫相關擴展、圖片相關擴展)、XML模塊造成的XXE等。
- 通過url連接進行挖掘
一般鏈接形式:
download.php?path=
download.php?file=
down.php?file=
data.php?file=
readlife.php?file=
read.php?filename=
或者包含參數(shù):
&url=
&file_name=
&Filepath=
&Path=
&Data=
文件讀取代碼
<?php
$filename = $_GET['file'];
if(isset($filename)){
readfile($filename);
}
?>
<?php
$filename=”test.txt”;
Echo fiile_get_contents($filename);
?>
漏洞之所以會發(fā)生是因為攻擊者可以將路徑遍歷序列放入文件夾內(nèi),從當前位置向上回溯,從而瀏覽整個瀏覽器的任何文件。
漏洞驗證
Index.php?i=../../../../../../../../etc/passwd
Index.php?i=../index.php
Index.php?i=file:///etc/passwd
參數(shù)i的參數(shù)值為PHP文件時:
- 顯示源代碼,則是文件查看漏洞 。
- 文件被解析,則是文件包含漏洞。
- 提示下載附件,則是文件下載漏洞。
敏感文件
發(fā)現(xiàn)漏洞后可以進行以下敏感操作
Linux:
/etc/passwd // 賬戶信息
/etc/shadow // 賬戶密碼文件
/etc/my.conf //mysql 配置文件
/etc/httpd/conf/httpd.conf // Apache配置文件
/usr/local/app/apache2/conf/httpd.conf //Apache2默認配置文件
/usr/local/app/apache2/conf/extra/httpd-vhost.conf //虛擬網(wǎng)站配置
/usr/local/app/php5/lib/php.ini //PHP相關配置
Windows:
C:\boot.ini //查看系統(tǒng)版本
C:\Windows\System32\inetsrv\MetaBase.xml //IIS配置文件
C:\Windows\repair\sam //存儲系統(tǒng)初次安裝的密碼
C:\Program Files\mysql\my.ini //Mysql配置
C:\Program Files\mysql\data\mysql\user.MYD //Mysql root密碼
C:\Windows\php.ini //php配置信息
應用的日志文件
1、 /var/log/apache2/access.log
2、 /var/log/nginx/access.log
Wrapper 機制
PHP 提供的文件打開方式不僅僅是簡單的文件路徑,而是通過文件流的方式進行操作。這些文件流可以被看作是一種特殊的協(xié)議,即 Wrapper 協(xié)議(PHP中有很多功能不同但形式相似的協(xié)議,統(tǒng)稱為Wrapper)。Wrapper 協(xié)議是一種在 PHP 中定義的標準協(xié)議,類似于 HTTP 協(xié)議,但用于訪問不同的資源,例如文件、HTTP、FTP、SSH 等等。
例如,我們可以通過 php://
協(xié)議訪問 PHP 內(nèi)置的資源,例如標準輸入、標準輸出和標準錯誤等等。我們也可以使用 http://
協(xié)議來訪問遠程服務器上的文件,或使用 ftp://
協(xié)議來訪問 FTP 服務器上的文件。這些 Wrapper 協(xié)議為我們提供了不同的方式來訪問不同的資源。
另外,PHP 還提供了一種接口 stream_wrapper_register
,允許開發(fā)者自定義 Wrapper 協(xié)議。通過這種方式,我們可以自己實現(xiàn)一些 Wrapper 協(xié)議,用于訪問自定義的資源。這種方式可以很好地擴展 PHP 的文件操作功能,讓我們可以方便地訪問不同的資源,同時也需要注意安全性問題,避免被攻擊者利用這些 Wrapper 協(xié)議進行惡意操作。
Filter 機制
- 在 PHP 中,另一個具有特色的機制是 Filter。Filter 的作用是對當前的 Wrapper 進行處理,例如將文件流中的內(nèi)容全部變?yōu)榇髮?。對于自定義的 Wrapper,開發(fā)者需要通過
stream_filter_register
進行注冊 Filter。 - PHP 內(nèi)置的一些 Wrapper 會自帶一些 Filter,例如
php://
協(xié)議會有一些類型的 Filter。這些 Filter 特性給我們進行任意文件讀取提供了很多便利。 - 假設服務端的
include
函數(shù)的路徑參數(shù)可控,正常情況下,它會將目標文件當作 PHP 文件去解析。如果解析的文件中存在<?php
等 PHP 相關標簽,那么標簽中的內(nèi)容會被作為 PHP 代碼執(zhí)行。這種情況下,攻擊者可以通過注入惡意代碼來實現(xiàn)任意代碼執(zhí)行,造成嚴重的安全問題。 - 為了避免這種情況的發(fā)生,我們可以使用 Filter 進行文件處理,例如使用 Base64 相關的 Filter 將文件流編碼成 Base64 的形式,這樣讀取的文件內(nèi)容中就不會存在 PHP 標簽。另外,如果服務端開啟了遠程文件包含選項
allow_url_include
,那么攻擊者就可以直接執(zhí)行遠程 PHP 代碼,這種情況也需要特別注意防范。
中間件/服務器相關
Nginx 錯誤配置
Nginx是一款常用的Web服務器軟件,如果配置不當,會導致任意文件讀取漏洞。下面是一個Nginx錯誤配置造成的任意文件讀取漏洞的示例說明:
配置一
假設服務器上存在一個文件路徑為/var/www/html/index.php
的文件,攻擊者通過任意文件讀取漏洞想要讀取該文件的內(nèi)容,而服務器的Nginx配置文件/etc/nginx/nginx.conf
中包含以下錯誤配置:
location ~ \.(php)$ {
include fastcgi_params;
fastcgi_pass unix:/var/run/php-fpm/php-fpm.sock;
fastcgi_param SCRIPT_FILENAME /var/www/html$fastcgi_script_name;
}
這個配置的意思是將以.php
結(jié)尾的請求交給PHP解釋器處理,并將文件路徑設置為/var/www/html
加上請求的文件名。這里存在一個問題,就是如果攻擊者發(fā)送以下請求:
http://example.com/index.php/../../../etc/passwd
由于Nginx的正則表達式匹配,$fastcgi_script_name
會被設置為/index.php/../../../etc/passwd
,加上/var/www/html
后得到的文件路徑為/var/www/html/index.php/../../../etc/passwd
,最終將會讀取到/etc/passwd
文件的內(nèi)容,造成任意文件讀取漏洞。
要解決這個問題,可以在配置文件中添加以下內(nèi)容,使用Nginx的try_files
指令來防止任意文件讀取漏洞:
location ~ \.php$ {
try_files $uri =404;
include fastcgi_params;
fastcgi_pass unix:/var/run/php-fpm/php-fpm.sock;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}
這個配置使用try_files
指令將文件路徑與URI進行比較,如果文件路徑中包含..
則返回404錯誤,否則將文件路徑設置為$document_root$fastcgi_script_name
。這樣即使攻擊者發(fā)送了類似的請求也無法讀取到其他文件的內(nèi)容,從而解決了任意文件讀取漏洞。
配置二
在 Nginx 的配置文件中,alias
指令可以用于為請求的路徑指定一個本地文件路徑。這個功能類似于 Apache 的 mod_alias
模塊中的 Alias
指令。通過 alias
指令,可以讓 Nginx 將某個 URL 映射到服務器文件系統(tǒng)中的一個文件或目錄。例如,在下面的配置中,請求 /static/logo.png
將會被映射到 /home/myapp/static/logo.png
文件:
location /static {
alias /home/myapp/static/;
}
這種配置可能會導致任意文件讀取漏洞,因為攻擊者可以通過構(gòu)造特定的 URL 請求,來訪問服務器上任意的文件。具體來說,攻擊者可以在 URL 中使用特定的路徑,使得 Nginx 映射到服務器上敏感文件的路徑,從而實現(xiàn)任意文件讀取。例如,如果攻擊者請求 /static/../../../etc/passwd
,則 Nginx 會將該請求映射到 /etc/passwd
文件,從而導致敏感文件泄露。
為了防止這種攻擊,需要對 URL 進行嚴格的限制,使得請求的文件路徑只能位于特定的目錄下。在上面的例子中,可以通過添加以下配置,限制請求的文件路徑只能位于 /home/myapp/static/
目錄下:
location /static {
alias /home/myapp/static/;
if ($request_filename !~ ^/home/myapp/static/) {
return 404;
}
}
在這個配置中,使用了 Nginx 的內(nèi)置變量 $request_filename
,該變量包含了請求文件的完整路徑。使用 if
指令和正則表達式,判斷請求文件路徑是否以 /home/myapp/static/
開頭。如果請求的文件路徑不符合要求,就返回 404 錯誤。這樣可以有效地防止任意文件讀取漏洞。
Docker-API
Docker是一個流行的容器化平臺,允許用戶在輕量級的虛擬環(huán)境中運行應用程序。Docker提供了一組RESTful API,允許開發(fā)者通過程序化方式管理Docker容器。
然而,這些API可能存在任意文件讀取漏洞。具體來說,如果攻擊者能夠利用API中的某些函數(shù)(如“/containers/{id}/archive”),他們就可以讀取容器中的任意文件,甚至可以在主機文件系統(tǒng)中讀取文件。
例如,如果攻擊者能夠通過API獲取到容器的ID,并知道容器中某個敏感文件的路徑,他們可以使用以下curl命令來獲取該文件的內(nèi)容:
curl -XPOST --unix-socket /var/run/docker.sock http://localhost/containers/[container_id]/archive -H "Content-Type: application/json" --data-binary '{"path":"[file_path]"}'
這條命令將向Docker API發(fā)送一個POST請求,請求下載容器中的文件。攻擊者將文件路徑設置為相對路徑,即可讀取任意文件。
為了防止此類攻擊,應當在Docker API的使用上實行合理的權(quán)限控制,并限制API的訪問范圍。如果API服務不能禁止外部訪問,則應將其放置在內(nèi)部網(wǎng)絡中,只開放給受信任的主機。此外,還應當使用Docker中的安全機制,如Docker的安全標簽功能,來保護容器內(nèi)的數(shù)據(jù)和文件系統(tǒng)。
軟鏈接
之前學校戰(zhàn)隊招新賽遇到過的題目類型,給出一個上傳頁面可以上傳壓縮包,但是壓縮包里其實可以藏一個軟鏈接,這樣的話可以把特定文件像個鉤子一樣勾出來,實現(xiàn)任意文件讀取
例如在虛擬機終端中:
ln -s /etc/passwd passwd //創(chuàng)建一個指向/etc/passwd的軟鏈接,文件名為passwd
zip --symlinks passwd.zip passwd //將這個文件壓縮到zip里
拖出后上傳并訪問
查看文件
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
sys:x:3:3:sys:/dev:/usr/sbin/nologin
sync:x:4:65534:sync:/bin:/bin/sync
games:x:5:60:games:/usr/games:/usr/sbin/nologin
man:x:6:12:man:/var/cache/man:/usr/sbin/nologin
lp:x:7:7:lp:/var/spool/lpd:/usr/sbin/nologin
mail:x:8:8:mail:/var/mail:/usr/sbin/nologin
news:x:9:9:news:/var/spool/news:/usr/sbin/nologin
uucp:x:10:10:uucp:/var/spool/uucp:/usr/sbin/nologin
proxy:x:13:13:proxy:/bin:/usr/sbin/nologin
www-data:x:33:33:www-data:/var/www:/usr/sbin/nologin
backup:x:34:34:backup:/var/backups:/usr/sbin/nologin
list:x:38:38:Mailing List Manager:/var/list:/usr/sbin/nologin
irc:x:39:39:ircd:/var/run/ircd:/usr/sbin/nologin
gnats:x:41:41:Gnats Bug-Reporting System (admin):/var/lib/gnats:/usr/sbin/nologin
nobody:x:65534:65534:nobody:/nonexistent:/usr/sbin/nologin
systemd-timesync:x:100:102:systemd Time Synchronization,,,:/run/systemd:/bin/false
systemd-network:x:101:103:systemd Network Management,,,:/run/systemd/netif:/bin/false
systemd-resolve:x:102:104:systemd Resolver,,,:/run/systemd/resolve:/bin/false
systemd-bus-proxy:x:103:105:systemd Bus Proxy,,,:/run/systemd:/bin/false
_apt:x:104:65534::/nonexistent:/bin/false
mysql:x:105:109:MySQL Server,,,:/nonexistent:/bin/false
extract0r:x:1000:1000::/home/extract0r:
可以看到我們實現(xiàn)了對/etc/passwd的讀取。
客戶端相關
瀏覽器/Flash XSS
瀏覽器/Flash XSS(跨站腳本攻擊)是一種常見的網(wǎng)絡安全漏洞,攻擊者可以利用這種漏洞來讀取用戶系統(tǒng)中的任意文件。
XSS攻擊通常通過注入惡意腳本代碼來實現(xiàn),攻擊者可以通過各種方式將這些惡意代碼注入到網(wǎng)站的頁面中,比如在表單中輸入特定的代碼,或者在URL中加入惡意參數(shù)。一旦用戶訪問了被注入了惡意代碼的頁面,這些代碼就會被執(zhí)行,從而導致各種安全問題,包括任意文件讀取漏洞。
在利用XSS漏洞進行任意文件讀取時,攻擊者通常會構(gòu)造特定的惡意腳本代碼,利用瀏覽器或Flash的某些功能來讀取用戶系統(tǒng)中的任意文件,比如:
- 利用XMLHttpRequest對象(XHR)發(fā)送HTTP請求,從而讀取用戶系統(tǒng)中的任意文件內(nèi)容。
- 利用Flash中的FileReference對象,從用戶系統(tǒng)中選擇一個文件,然后將文件內(nèi)容讀取到攻擊者的服務器上。
為了防止瀏覽器/Flash XSS漏洞,開發(fā)者需要注意以下幾點:
- 過濾用戶的輸入,包括表單數(shù)據(jù)、URL參數(shù)等,避免注入惡意腳本。
- 將所有輸入的特殊字符進行轉(zhuǎn)義處理,避免被解釋為腳本代碼。
- 在Web應用程序中使用CSP(內(nèi)容安全策略),以限制腳本執(zhí)行的范圍。
- 避免使用Flash等插件,或者對插件進行嚴格限制。
- 對文件讀取操作進行嚴格的權(quán)限控制,避免攻擊者利用漏洞讀取敏感文件。
MarkDown語法解析器XSS
Markdown是一種輕量級的標記語言,用于編寫易于閱讀和編寫的文檔。由于其簡單易用的特點,現(xiàn)在在各種場合廣泛使用,如博客、文檔撰寫、社區(qū)討論等。
但是,在MarkDown語法解析器中存在一些安全問題,其中包括任意文件讀取漏洞。具體來說,當使用MarkDown解析器時,如果輸入的內(nèi)容包含惡意代碼,就會導致任意文件讀取漏洞。
一種常見的攻擊方式是通過XSS攻擊來實現(xiàn)任意文件讀取漏洞。攻擊者可以通過XSS攻擊在MarkDown中嵌入惡意代碼,使其在用戶瀏覽器中執(zhí)行。在執(zhí)行的過程中,惡意代碼可以利用MarkDown解析器的漏洞,來讀取任意文件內(nèi)容,包括敏感文件內(nèi)容。
例如,攻擊者可以在MarkDown中嵌入以下代碼:
[link](javascript:fetch('http://example.com/read.php?file=/etc/passwd').then(response => response.text()).then(data => document.write(data)))
當用戶點擊該鏈接時,惡意JavaScript代碼將向指定URL發(fā)送一個GET請求,并將返回的文件內(nèi)容顯示在用戶的瀏覽器中。通過這種方式,攻擊者可以輕松地讀取服務器上的敏感文件內(nèi)容。文章來源:http://www.zghlxwxcb.cn/news/detail-614536.html
為了防止這種攻擊,可以采用以下措施:文章來源地址http://www.zghlxwxcb.cn/news/detail-614536.html
- 在服務器端對輸入進行過濾和驗證,避免用戶輸入惡意內(nèi)容;
- 在MarkDown解析器中添加白名單,只允許指定的HTML標簽和屬性;
- 對于用戶輸入的文件路徑等敏感信息,使用嚴格的訪問控制和權(quán)限管理,避免惡意讀取文件內(nèi)容;
- 更新MarkDown解析器的版本,及時修復已知的漏洞。
response.text()).then(data => document.write(data)))
當用戶點擊該鏈接時,惡意JavaScript代碼將向指定URL發(fā)送一個GET請求,并將返回的文件內(nèi)容顯示在用戶的瀏覽器中。通過這種方式,攻擊者可以輕松地讀取服務器上的敏感文件內(nèi)容。
為了防止這種攻擊,可以采用以下措施:
1. 在服務器端對輸入進行過濾和驗證,避免用戶輸入惡意內(nèi)容;
2. 在MarkDown解析器中添加白名單,只允許指定的HTML標簽和屬性;
3. 對于用戶輸入的文件路徑等敏感信息,使用嚴格的訪問控制和權(quán)限管理,避免惡意讀取文件內(nèi)容;
4. 更新MarkDown解析器的版本,及時修復已知的漏洞。
到了這里,關于任意文件讀取漏洞的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!