應用於ASP文件上傳漏洞的0×00截斷***

應用於ASP文件上傳漏洞的0×00截斷***
kingbase

2011/8/1

中國人的簡單敘述
這篇文章翻譯自:0×00 vs ASP file uploads,原作者是:Brett Moore,Security-Assessment.com公司的,本文寫於04年,原文在這裏:http:// www.security-assessment.com/Whitepapers/0×00_vs_ASP_File_Uploads.pdf,我之所以翻譯它是因爲一直以來我對這個0×00有疑惑,感覺有時能用有時又不能用,看了這篇文章,有點明白了。

說白了一句話:只有form post時有用,而且只針對文件名變量,作用於asp的CreateTextFile等方法。
簡介
Poison NULL byte技術還沒有在ASP中廣泛應用,but as with other languages the NULL byte can cause problems when ASP passes data to objects.

用ASP寫的上傳,有個共性的問題:空字節可以被插入到文件名,這樣文件名可以被添加任意擴展名,而寫入文件的時候,空字節以後的部分都會被忽略掉。

這樣,我們就可以繞過一些針對擴展名的檢查,even if one is appended by the application.

這很類似於Perl/PHP,不同在於這個空字節是怎麼發到ASP程序的。

這種情況發生於:數據在沒有檢查空字節的情況下,比較、驗證後,又直接被傳入FileSystemObject時。

本文將討論Poison空字節***如何作用於ASP的上傳腳本。

Scope
本文是基於以下兩點研究:upload時的POST(multipart/form-data)、Scripting.FileSystemObject對象。

本文中,我們集中關注於CreateTextFile方法,它被用於對文件寫入。可能其他的object function也有這樣的漏洞。

%00或者空字節在URL或者通常的form post中發不出去,因爲服務器雖然會認爲這是字符串的結果但是並不會在文件名變量中存儲它的值。

而當文件名通過multipart/form-data的形式發送時,空字節將會保存在文件名變量中,這會影響對FileSystemObject的調用。

文件上傳
文件上傳通常是用輸入對象類型file和編碼類型multipart/form-data。

content type application/x-www-form-urlencoded不太適合發送大量的二進制數據或者非ASCII字符,multipart/form-data則比較適合。

一個multipart/form-data消息包含了好幾個部分,The parts are sent to the processing agent in the same order the corresponding controls appear in the document stream.

<form method=post enctype=”multipart/form-data” action=upload.asp>

        Your Picture:<BR><input><BR><BR>

        <input value=”Upload”>

</form>

當form submit時,數據會被安排成multipart/form-data格式,這會把post的數據進行編碼,這些數據中當然也包含空字節。

文件保存
上傳成功後,文件會保存在一個地方,下面的代碼就是通常的文件上傳處理代碼:

Sub Save() Sub Save(filename)

        Dim objFSO, objFSOFile

        path=server.MapPath(“/uploads/”)

        Set objFSO = Server.CreateObject(“Scripting.FileSystemObject”)

        Set objFSOFile = objFSO.CreateTextFile(path + “\” + filename)

        objFSOFile.Write <file contents>

        objFSOFile.Close

End Sub

當文件名參數傳到CreateTextFile函數,文件名中可能會包含空字節。這會使得創建的文件名被截斷,空字節後被忽略。

Set objFSOFile = objFSO.CreateTextFile(path + “\” + filename)

空字節
空字節的插入,可以使用手工,也可以使用16進制編輯器或者web代理程序,它的插入需要修改multipart post數據。

Multipart Form Post

POST /upload.asp HTTP/1.0

Content-Type: multipart/form-data; boundary=—————————

7d4cb161b009c

Host: localhost

Content-Length: 359

Pragma: no-cache

Cookie: ASPSESSIONIDSAADRCRS=LAKNNAKAGMIBJCOOLBIFEHIK

—————————–7d4cb161b009c

Content-Disposition: form-data;; filename=”c:\nc.exe .bmp”

Content-Type: text/plain

Proof Of Upload Test File

[email protected]

—————————–7d4cb161b009c

Content-Disposition: form-data;

Upload

—————————–7d4cb161b009c

注意,上面的文件名參數已經被更改了:

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章