突破上傳之檔案包含漏洞以及修復方案

帽子不夠白發表於2016-10-11

1.檔案包含功能概述

對一個簡單的 PHP 小程式來說,在不同的 PHP 指令碼之間剪下或複製某一函式不是大問題, 但是當進入專案開發時,函式的數量將會變得相當龐大,並且函式具有較強的複雜性,這時你就會把它們儲存到一個便於隨時呼叫的函式庫中,以便於該函式在整個專案中可以隨時被呼叫。通常情況下這個函式庫是一個檔案,我們稱為程式碼庫。當為特定領域的功能編寫函式時,希望通過把自定義的這些函式組織到一起,並存放到 單獨的程式碼檔案中。當團隊開發專案時,如果有統一的通用函式檔案,則將大幅縮短專案的開發週期,並使 得專案的層次結構分明。

2.常見包含語句

include() 只有程式碼執行到include()語句時才將檔案包含進來,發生錯誤時只給出一個警告,向下執行

require() 程式一執行立即呼叫檔案,如果發生錯誤,語句會輸出錯誤資訊,並終止指令碼的執行。

include_once() 當重複呼叫同一檔案時,程式只能呼叫一次。

require_once()同上

3.本地和遠端包含

waf能夠攔截我們上傳的帶有危險函式的php檔案,所以我們需要將其改為其他格式上傳,比如txt,jpg

txt的小馬

php的包含檔案

一個可以建立新小馬的.txt

通過包含檔案的名字將txt檔案執行為php

菜刀可連

將自動建立木馬php的txt檔案以php執行

多出來的小馬php

在攻擊端的伺服器內放入txt的小馬

遠端包含txt檔案,192.168.1.153是攻擊機

菜刀可連

通過協議漏洞直接新建小馬檔案



2.關於修復方案

相對於直接關閉遠端包含引數開關,徹底切斷這個業務相比較。

目前業內最好的修復方案即是設定類似白名單的方法,通過篩選固定檔名方法,一方面不必切斷這個業務,另一方面又不會被輕易繞過

程式碼如下:

<?php
2. $file = $_GET['file'];
3.
4. //Whitelisting possible values
5. switch ($file) {
6. case 'main':
7. case 'foo':
8. case 'bar':
9. include '/home/wwwroot/default/' .$file .'.php';//已知的敏感檔案路徑
10. break;
11.
12. default:
13. include '/home/wwwroot/default/index.php';
14.}
15.?>

不滿足已知的檔案的名字就不能夠執行遠端包含

相關文章