2012年3月14日 星期三

char 0 在檔案上傳時對附檔名的影響

●【資料來源】
 ┃  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
 ┃ → http://wenku.baidu.com/view/362e2fd028ea81c758f578b5.html
 ┃ → http://www.hack50.com/stu/sort091/sort0103/63093.html


 ●【WinSock Expert 工具下載】
 ┃  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
 ┃ → http://www.dxqsoft.com/we/index.htm


 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
 ◆ 簡介 ◆
 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
一般的程式語言裡, 對字串的定義是遇到 “\0”(00)時, 就代表字串結束, 在 \0 (00) 之後的符號都會被乎略(刪除), 由於上傳檔案時可以修改 client 端的檔案名稱, 加入 \0, 讓上傳的程式誤判要上傳的檔案的附檔名.


 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
 ◆ 上傳元件測試 ◆
 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
 ●【TABS.Upload】
 ┃  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
 ◎ <source code>
 ┃
response.write "<br/>(upload object) filname: " & Form.FileName & vbcrlf
response.write "<br/>(upload object) filname len: " & len(Form.FileName) & vbcrlf
response.write "<br/>(upload object) filname binary len: " & lenb(Form.FileName) & vbcrlf
response.write "<br/>(upload object) filname right 4 char: " & right(Form.FileName,4) & vbcrlf
fullfilename = Form.FileName
response.write "<br/>(asp variable) filname right 4 char: " & right(cstr(fullfilename),4) & vbcrlf
 ┃
 ◎ <執行結果>
 ┃

說明: chr(0) 攻擊無效, 程式判斷 user 上傳的檔案是 .asp


 ●【UpDownExpress.FileUpload】
 ┃  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
 ◎ <source code>
 ┃
response.write "<br/>current upload object: UpDownExpress.FileUpload" & vbcrlf
response.write "<br/>(upload object) filname: " & xup.Attachments(1).FileName & vbcrlf
response.write "<br/>(upload object) filname len: " & len(xup.Attachments(1).FileName) & vbcrlf
response.write "<br/>(upload object) filname binary len: " & lenb(xup.Attachments(1).FileName) & vbcrlf
response.write "<br/>(upload object) filname right 4 char: " & right(xup.Attachments(1).FileName,4) & vbcrlf
fullfilename = xup.Attachments(1).FileName
response.write "<br/>(asp variable) filname right 4 char: " & right(cstr(fullfilename),4) & vbcrlf
 ┃
 ◎ <執行結果>
 ┃

說明: chr(0) 攻擊無效, 程式判斷 user 上傳的檔案是 .asp


 ●【ADODB.Stream】
 ┃  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
 ◎ <source code>
 ┃
response.write "<br/>(upload object) filname: " & xup.Form(uItem).FileName & vbcrlf
response.write "<br/>(upload object) filname right 4 char: " & right(xup.Form(uItem).FileName,4) & vbcrlf
response.write "<br/>(upload object) filname: " & xup.Form(uItem).FileName & vbcrlf
response.write "<br/>(upload object) filname len: " & len(xup.Form(uItem).FileName) & vbcrlf
response.write "<br/>(upload object) filname binary len: " & lenb(xup.Form(uItem).FileName) & vbcrlf
response.write "<br/>(upload object) filname right 4 char: " & right(xup.Form(uItem).FileName,4) & vbcrlf
fullfilename = xup.Form(uItem).FileName
response.write "<br/>(asp variable) filname right 4 char: " & right(cstr(fullfilename),4) & vbcrlf
 ┃
 ◎ <執行結果>
 ┃

說明: chr(0) 攻擊有效, 程式無法判斷 user 上傳的檔案是 .asp


 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
 ◆ 結論 ◆
 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
1.透過 ADODB.Stream 自行開發的 upload component 需要針對 filename 多增加 chr(0) 的處理.
2.目前是透過 IIS 6 做測試, 比較舊的 IIS 5沒試過, 不確定測試結果是否一樣.
3.其他的程式語言, 沒試過, 不確定測試結果是否一樣.

沒有留言:

張貼留言

Facebook 留言板