知識點
php://filter
php://filter是一種元封裝器,是PHP中特有的協議流,設計用于資料流打開時的篩選過濾應用,作用是作為一個“中間流”來處理其他流,
php://filter目標使用以下的引數作為它路徑的一部分,復合過濾鏈能夠在一個路徑上指定,
| 名稱 | 描述 | 備注 |
|---|---|---|
| resource=<要過濾的資料流> 指定了你要篩選過濾的資料流, | 必選 | |
| read=<讀鏈的篩選串列> | 可以設定一個或多個過濾器名稱,以管道符(|)分隔, | 可選 |
| write=<寫鏈的篩選串列> | 可以設定一個或多個過濾器名稱,以管道符(|)分隔, | 可選 |
| <;兩個鏈的篩選串列> | 任何沒有以 read= 或 write= 作前綴 的篩選器串列會視情況應用于讀或寫鏈, |
PHP file_put_contents()
file_put_contents() 函式把一個字串寫入檔案中,
file_put_contents(file,data,mode,context)
file 必需,規定要寫入資料的檔案,如果檔案不存在,則創建一個新檔案,
data 可選,規定要寫入檔案的資料,可以是字串、陣列或資料流,
實體介紹
eee.php
<?php
$content = '<?php exit; ?>';
$content .= $_POST['txt'];
file_put_contents($_POST['filename'], $content);
?>
當用戶通過POST方式提交一個資料時,會和exit拼接,從而造成提交的資料不能被執行,
txt=aPD9waHAgcGhwaW5mbygpOyA/Pg==&filename=php://filter/write=convert.base64-decode/resource=b.png
向b.png寫入,解碼后的$content拼接上txt的內容
base64編碼中只包含64個可列印字符,當PHP遇到不可解碼的字符時,會選擇性的跳過,這個時候base64就相當于以下的程序:
<?php
$_GET['txt'] = preg_replace('|[^a-z0-9A-Z+/]|s', '', $_GET['txt']);
base64_decode($_GET['txt']);
所以,當$content 包含 <?php exit; ?>時,解碼decode程序會先去除識別不了的字符,都將被去除,于是剩下的字符就只有phpexit以及我們傳入的字符了,由于base64是4個byte一組,再添加一個字符例如添加字符’a’后,將’phpexita’當做兩組base64進行解碼,也就繞過這個死亡exit了,
phpexitaPD9waHAgcGhwaW5mbygpOyA/Pg==
phpe xita aPD9 waHA ... ...
phae xita 解碼失敗

后面分組正常能繼續正常解碼

此處參考:從一題CTF學習php://filter偽協議
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/538007.html
標籤:其他
上一篇:向下遞回以及向上遞回
