php代碼審計中和文件相關的操作主要包含如下幾種:
文件包含: include/require/include_once/require_once/spl_autoload文件讀取: file_get_contents/fread/readfile/file/highlight_file/show_source`文件寫入:file_put_contents/fwrite/mkdir/fputs文件上傳:move_uploaded_file/copy/rename文件上傳漏洞通常文件上傳的流程如下:
那麼在這個流程中常見的邏輯錯誤如下:
使用原始文件名,導致存在Apache或Nginx解析漏洞等關於PHP 中$_FILES 函數
如下代碼:
<form enctype="multipart/form-data" action="upload.php" method="post">
<input type="hidden" name="MAX_FILE_SIZE" value="1000">
<input name="myFile" type="file">
<input type="submit" value="上傳文件">
</form>$_FILES數組內容如下:$_FILES['myFile']['name']客戶端文件的原名稱。$_FILES['myFile']['type']文件的 MIME 類型,需要瀏覽器提供該信息的支持,例如"image/gif"。$_FILES['myFile']['size']已上傳文件的大小,單位為字節。$_FILES['myFile']['tmp_name']文件被上傳後在服務端儲存的臨時文件名,一般是系統默認。可以在php.ini的upload_tmp_dir指定
歷史漏洞案例:
https://php.mengsec.com/bugs/wooyun-2015-0125592.htmlhttps://php.mengsec.com/bugs/wooyun-2015-0125592.htmlhttps://php.mengsec.com/bugs/wooyun-2014-048841.htmlhttps://php.mengsec.com/bugs/wooyun-2014-048760.html文件包含漏洞文件包含漏洞比較特殊,基本上可以是PHP 獨有的一種漏洞
PHP 文件包含漏洞造成的危害:
文件包含漏洞常見的位置:
對於文件包含漏洞的突破點:
可以嘗試尋找被包含文件:上傳文件,臨時文件,Session文件,日誌文件後綴無法控制的情況:\0 截斷(php5.3.4之後不可用), 協議利用歷史漏洞案例:
https://php.mengsec.com/bugs/wooyun-2014-056641.htmlhttps://php.mengsec.com/bugs/wooyun-2014-057567.html文件刪除漏洞Discuz!X ≤3.4 任意文件刪除漏洞: https://paper.seebug.org/411/
文件刪除漏洞危害也是非常大的: