0x00 含義&&類型
首先,PHP文件包含主要由這四個函數完成:
-
include() //包含一些html模塊文件
-
require() //包含一些數據庫,配置文件
-
include_once() //只調用一次包含文件,多次調用就會報錯
-
require_once()
當使用這4個函數包含一個新的文件時,該文件將作為PHP代碼執行,PHP內核並不會在意該被包含文件是什么類型。所以如果被包含的是txt文件、圖片文件、遠程URL,也都將作為PHP代碼執行。
include與require的區別在於:
1.include是當代碼執行到它所在的行數是,它才會開始包含文件,並且如果文件加載錯誤,依然會向下執行代碼。
2.require是只要當前程序執行它就會立刻包含文件,並且在加載文件錯誤的時候會停止運行並發出警告。
文件包含漏洞的類型分為:
1.本地文件包含(LFI)
2.遠程文件包含(RFI)
當php.ini中,設置allow_url_include=On allow_url_fopen=On,即可執行遠程代碼。
0x01 包含本地目錄文件
簡單的漏洞代碼示例
1 <?php 2 if($_GET['file']) 3 { include '$_GET['file']';} 4 else 5 include 'hello.php'; 6 ?>
正確頁面:
包含當前目錄中flag.php文件:
包含上級目錄中的某個文件:
既然這樣,我們就可以使用./(當前目錄)、../(上級目錄)對整個目錄進行遍歷,也就可以獲取敏感的文件
0x02 PHP偽協議以及其他封裝協議的利用
php各種偽協議參考:http://php.net/manual/zh/wrappers.php.php
1.php://input
php://input可以讀取沒有處理過的POST數據,不依賴於特定的php.ini指令。當enctype=”multipart/form-data” 的時候 php://input
是無效的。
簡單舉例如下:
2.php://filter
php://filter可以說是是最經常使用的一個偽協議,用它在沒有特殊情況下(我沒遇到過TnT)可以進行任意文件的讀取。
就拿最近SWPU CTF中學長出的一道題來舉例:
題目地址為:http://39.106.13.2/web2/file.php?file=index
在url中發現file=index,有此猜想可能有本地包含獲取網頁源碼,所以嘗試直接用php://filter讀取index源碼
這里用base64加密了index.php的源碼,直接解密就得到了源碼。
exp: ?key=php://filter/read=convert.base64-encode/resource=xxx.php
3.zip協議&&phar協議
zip協議:http://php.net/manual/zh/wrappers.compression.php
利用phar://協議特性可以在滲透過程中幫我們繞過一些waf檢測(此方法使用要php>5.3.0).
關於zip://
zip://test.jpg#dir/test.php
先新建一個test.php,里面寫個phpinfo,然后壓縮成.zip,然后把zip的名字改成test.jpg后把這個jpg文件上傳上去 然后使用zip協議包含.
phar利用方法與zip協議類似。
0x03 一些簡單的繞過姿勢
有些程序員為了防止本地包含漏洞,通常會編寫一些這樣的代碼:
<?php include $_GET['page'].".php"; ?>
1. 00截斷
(1) /etc/passwd%00,訪問文件
(2)%00目錄遍歷
2. 使用長目錄截斷
/etc/passwd/././././././.[…...]/./././././.
(php版本小於5.2.8(?)可以成功,linux需要文件名長於4096,windows需要長於256)
0x04 相關學習資料
1.文件包含漏洞小節
https://www.cnblogs.com/iamstudy/articles/include_file.html
2.論PHP常見的漏洞
http://www.anquan.us/static/drops/papers-4544.html
3.php偽協議
http://blog.csdn.net/Ni9htMar3/article/details/69812306?locationNum=2&fps=1
4.包含日志文件getshell
https://www.cnblogs.com/my1e3/p/5854897.html
個人的第一篇博客,希望自己在安全的路上越走越好,越走越遠