[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