[PHP] file_put_contents寫入文件繞過內容黑名單
2018, Dec 05
在開發者使用file_put_contents
寫入文件的時候,有的情況下會用字符串匹配的方式攔截如"<"
、">"
、"?"
等字符,導致我們無法寫入webshell。
file_put_contents
函數第二個參數支持傳入陣列,用戶傳入的陣列將被拼接成一個字符串寫入文件。陣列因為類型不同導致無法使用字符串匹配來檢測,進而利用這種方式繞過了黑名單。
file_put_contents特性
查看PHP文檔可以發現:
其第二個參數允許傳入一個陣列 ,如果是陣列的話,將被連接成字符串再進行寫入。
file_put_contents($filename, $array);
可以等同於如下程式碼
file_put_contents($filename, implode('', $array))
特性利用
在開發者使用file_put_contents
寫入文件的時候,有的情況下會用字符串匹配的方式攔截如"<"
、">"
、"?"
等字符,導致我們無法寫入webshell:
<?php
$text = $_GET['text'];
if(preg_match('[<>?]', $text)) {
die('error!');
}
file_put_contents('config.php', $text);
因為使用preg_match
的方式來匹配字符串,我們如果傳入的$text是一個陣列,將導致preg_match
拋出warning
,返回null
,也就繞過了if
語句。
之後利用file_put_contents
的特性,成功寫入webshell。
資料來源 https://tricking.io/card/6/content
參考資料: http://php.net/manual/en/function.file-put-contents.php https://www.leavesongs.com/PENETRATION/pwnhub-first-shalon-ctf-web-writeup.html