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

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.?>

不滿足已知的文件的名字就不能夠執行遠程包含
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章