什么是文件上傳漏洞
????????文件上傳漏洞是指用戶上傳了一個可執行的腳本文件,并通過此腳本文件獲得了執行服務器端命令的能力。“文件上傳” 本身沒有問題,有問題的是文件上傳后,服務器怎么處理、解釋文件。如果服務器的處理邏輯做的不夠安全,則會導致嚴重的后果。
這種攻擊方式是最為直接和有效的,所以我們需要思考的是如何繞過檢測和過濾。
漏洞危害
上傳文件是web腳本語言,服務器的web容器解釋并執行了用戶上傳的腳本,導致代碼執行。
上傳文件是病毒或者木馬時,主要用于誘騙用戶或者管理員下載執行或者直接 自勱運行
上傳文件是Flash的策略文件 crossdomain.xml,黑客用以控制Flash在該域 下的行為(其他通過類似方式控制策略文件的情況類似);
上傳文件是病毒、木馬文件,黑客用以誘騙用戶或者管理員下載執行;
上傳文件是釣魚圖片或為包含了腳本的圖片,在某些版本的瀏覽器中會被作為腳本執行,被用于釣魚和欺詐。
除此之外,還有一些不常見的利用方法,比如將上傳文件作為一個入口,溢 出服務器的后臺處理程序,如圖片解析模塊;或者上傳一個合法的文本文件,其內容包含了PHP腳本,再通過"本地文件包含漏洞(Local File Include)"執行此腳本。
要求條件?
上傳的后門文件,需要能被腳本語言解析執行。
說明一:對方服務器運行的PHP環境,你不能上傳一個JAVA的后門代碼。
說明二:你上傳文件的目錄可以被腳本語言解析執行,如果你上傳的目錄沒有執行權限也不行
說明三:一般文件上傳后會返回你一個地址,如果無妨鏈接到也不能構成文件上傳漏洞。
還有例外情況,非腳本文件也能被成功解析。比如:上傳了一個圖片🐎,如果對方中間件上存在一些漏洞的話,配合這些漏洞可以實現圖片文件按照腳本文件解析。
方法(以upload-labs為例)
在ctf比賽中,一般都是圍繞一句話木馬實現文件上傳漏洞的
那什么是一句話木馬?
通常,一句話木馬后綴為.php,因為文件上傳漏洞通常用于web中,而php是web能夠識別的語言(主要是能被對方服務器識別的語言后綴)
其內容是
<?php eval($_POST['cmd']);?>
????????現在來解釋一下這個一句話木馬,這里的<?php和末尾的?>是php語言的標志,用來聲明這是個php語言,而括起來的內容就是php代碼。
? ? ? ? eval是php中的一個內置函數里面的內容會被當成命令執行。
? ? ? ? 而$_POST['cmd']是通過post傳參的方式獲取一個名為cmd的參數。
所以如果這個上傳的文件被解析,那我們就可以訪問這個文件的位置,并通過post傳參執行命令。(就像web的命令執行一樣),從而訪問,修改服務器中的目錄文件。
1,Less-1 前端驗證
我們直接上傳一個一句話木馬試一下
這里直接跳出一個彈窗,并顯示只能上傳的文件類型。
那這大概率是前端驗證,因為web中的彈窗通常是通過JavaScript實現
通過看查源代碼我們也可以證實
?不過這種檢查通常都是本地上傳時檢查,而在上傳過程和后端不會檢查,所以這種其實沒什么用。
我們有兩種方法繞過這種驗證
1,直接禁用JavaScript
禁用JavaScript后,這串代碼就不能生效了
打開開發者工具臺,直接禁用
然后再上傳文件,會發現上傳成功,然后就可以用蟻劍連接進入后臺了?2,抓包
先上傳一個滿足后綴的名字通過JavaScript檢查,然后抓包修改后綴
?
2,Less-2 MIME檢查
MIME(Multipurpose Internet Mail Extensions)多用途互聯網郵件擴展類型。是設定某種擴展名的文件用一種應用程序來打開的方式類型,當該擴展名文件被訪問的時候,瀏覽器會自動使用指定應用程序來打開。
就是會檢查文件類型,單純的后綴繞過不行了?
直接上傳php
我們抓包,將文件類型改為符合的格式?然后就上傳成功了
?3,Less-3 后綴繞過
看源碼,可以看到對文件后綴名的操作
同時這里是用黑名單的形式進行過濾,所以我們可以用黑名單以外的方法繞過
又因為這里會將文件后綴統一轉換為小寫,所以大小寫繞過不合適了
但我們任然可以用phtml
.phtml
?是一種常見的文件擴展名,通常用于表示包含 PHP 代碼的 HTML 文件。它是 PHP 和 HTML 結合的產物,通常用于在網頁中嵌入動態內容。
還可以用php加上對應的php版本,比如php5,php6,php7進行繞過
將后綴改為phtml就可以上傳了
?然后再用蟻劍連接就可以了
4,Less-4 .htaccess
先看黑名單內容
可以看到過濾了php的大小寫繞過,版本繞過,和JavaScript等
但是我們可以用.htaccess強制將某種類型的文件作為php文件識別
問ai可以知道這是用于配置apache服務器的配置文件,將其內容設置為
AddType application/x-httpd-php .png
.htaccess的文件寫法有很多,如果這個不能成功可以網上搜其他的能運行的
?
這里我沒用apache服務器,看能不能識別為php文件
這里先上傳了.htaccess配置文件,在上傳一個圖片馬,發現并沒有被解析
?換成apache服務器后重復上面的操作,訪問對應的png文件
這樣就能證明上傳成功,且被當作了php文件解析
5,Less-5 .user.ini?
這關過濾了.htaccess,可以用.user.ini
?其中.user.ini的文件內容是
這樣當我們執行同目錄的其他php腳本就會包含a.jpg中的內容,而文件提示upload中有一個readme.php,我們嘗試訪問
可以看到我們的一句話代碼被包含?但這樣是沒有包含上的,我們修改一句話木馬,再次訪問
像這樣,沒有顯示出我們寫入的一句話木馬才是被成功解析?
6,pass-6? 大小寫繞過后綴名
可以看到,在處理后綴名時沒有進行大小寫的轉換,導致漏洞產生
為什么大寫PHP也能被解析?
所以我們上傳一句話木馬,改名為1.phP
成功上傳
?
7,Less-7 后綴名+空格
先看對后綴名的處理
?發現與之前少了刪除后綴名中空格的操作,而黑名單操作是將后綴名與里面的字符串整個比較,所以多加一個空格就會被認為是不同的字符串
但這只適用于Windows系統,linux系統在解析文件時不會自帶去掉末尾的空格
上傳文件用bp抓包,在后綴名末尾增添空格
上傳會出現錯誤
?從源碼分析應該是成功上傳的,但可能因為路徑的問題導致上傳錯誤
嘗試將php版本降低,成功上傳
?8,Less-8 后綴名+點繞過
先看對后綴名進行了什么樣的操作
可以看到少了去后綴名中的點操作,這樣我們就可以在后綴名后加點構成假后綴名,因為截取后綴名是截取最后一個點后的字符串
?而我們嘗試在Windows系統中在后綴中加點
會發現無法命名,并自動去掉最后一個點
而如果在最后在加上正常后綴名,就會將前面的當作文件名?所以,只要加上一個點就能成功繞過后綴名檢查,并上傳能執行的一句話木馬
牢樣子,bp抓包,在后綴名中做點修改
windows會自動將這個點刪掉,雖然我們訪問的1.php.,但任然可以連接,且后臺也是1.php
9,Less-9 附加數據流繞過
看查源碼對后綴名的操作,發現少了去除::$DATA?
?所以即使不知道::$DATA是什么,但只要知道他能幫助繞過黑名單就行了
bp抓包后,在后綴名里面加上::$DATA就可以了
剛剛傳上去就被火絨gank了?