今天做bugku的基礎題遇見的……很神奇,真心漲姿勢(好吧其實我現在每做一道題都是漲知識)
題目:flag在index裏
鏈接:呼哈哈
題解:可以看到題目打開的界面裏
注意這裏:?file=show.php;可以聯想到文件包含漏洞,然後我們就可以用php://filter協議來查看源文件內容;
構造:php://filter/read=convert.base64-encode/recource=index.php;
這句話的意思是我們用base64編碼的方式來讀文件index.php;這時頁面會顯示出源文件index.php經過base64編碼後的內容,然後經過base64解碼就可以看到flag;
我是分割線哇
php://filter簡單理解:php://filter 是php中獨有的一個協議,可以作為一個中間流來處理其他流,可以進行任意文件的讀取;根據名字,filter,可以很容易想到這個協議可以用來過濾一些東西;
使用不同的參數可以達到不同的目的和效果:
名稱 | 描述 | 備注 |
---|
resource=<要過濾的數據流> | 指定了你要篩選過濾的數據流。 | 必選 |
read=<讀鏈的篩選列表> | 可以設定一個或多個過濾器名稱,以管道符(|)分隔。 | 可選 |
write=<寫鏈的篩選列表> | 可以設定一個或多個過濾器名稱,以管道符(|)分隔。 | 可選 |
<;兩個鏈的篩選列表> | 任何沒有以 read= 或 write= 作前綴 的篩選器列表會視情況應用於讀或寫鏈。 | |
另外用read的解釋:
上例中我們應用了read參數和resource參數,當然還可以用write參數,這時我們可以通過指定寫的方式來對文件進行一些改變;
例如我們想對一些php的內容進行編碼的轉換(目的一般是為了各種繞過):
下面來自:這裏
看下面一段代碼:
<?php
$content = '<?php exit; ?>';
$content .= $_POST['txt'];
file_put_contents($_POST['filename'], $content);
這裏的$content在開頭增加了exit,使得我們即使可以成功寫入一句話,也無法執行。 我們通過php://filter巧妙繞過這裏的限制 1.對我們想要寫入的一句話進行base64encode 2.php://filter/read=convert.base64-decode進行解碼 那麼<?php exit;?>這一部分在經過解碼後,php不對其解析,而我們想要寫入的一句話正好被成功解碼。因此得以成功上傳webshell。
思路二
上面的題目除了base64外,還有另一種做法。 我們可以發現我們想要去除的代碼片其實是一個XML標簽,因此我們可以想到一個函數去去除它:strip_tags
如果這樣進行處理的話,我們想要寫入的一句話也會被處理。 不過,我們的php://filter是可以使用多個過濾器的,因此我們可以先對我們想要的一句話進行編碼,過濾器中先使用strip_tags函數進行處理再使用對應的解碼方法即可!(如base64,rot-13
如果使用rot-13,則該方法僅限於當short_open_tag不開啟的時候;
我是分割線哇
總之呢,php://filter協議有一下幾個應用:1、利用base64獲得源碼
2、通過讀寫編碼實行繞過操作