2011年12月9日 星期五

單引號' 在 querystring() 裡與 %27 是不同的

有用防火牆不一定安全, 因為有些攻擊的方法, 一樣是走 80 port 進來您的系統後, 再做滲透.
使用外部的 filter 來擋 SQL Injection 的單引號, 也不一定安全, 因為 filter 可能沒寫好, 如果寫好, 可能會安全一點點.

最近在看 IIS Log, 有一支 demo-1.asp 程式裡的 id 欄位, 忘了增加前置檢查, 直接去 access databae, 結果..., 現在發現的2個小問題:
1. Site 1 傳回給 user 的 status, 居然是 302, 而不是 200.
2. Site 1 的 filter 功能沒擋成功, 把單引號丟給實際 Access Database 的程式.




架構說明:
-----------------
Site 1 的 demo-1.asp 是在與 User 的 browser 的互動, 裡面沒有寫程式, 單純的做單引號的過濾, 就去呼叫 Site 2 的 demo-2.asp



Site 1 (與User browser 互連的程式) 的 IIS log
---------------------------------
201X-XX-XX 17:03:14 GET /demo-1.asp id=-1%27%20or%20%273%27%3d%273 80 - xxx.xxx.xxx.xxx Mozilla/4.0+(compatible;+MSIE+8.0;+Windows+NT+6.0) 302 0 0


Site 2 (實際程式) 的 IIS log
---------------------------------
201X-XX-XX 17:03:14 GET /demo-2.asp id=-1%27%20or%20%273%27%3d%273&|316|80040e07|將_nvarchar_值_'-1'_or_'3'='3'_轉換成資料類型_int_時,轉換失敗。 80 - 127.0.0.1 Mozilla/4.0+(compatible;+MSIE+5.00;+Windows+98) 500 0 0



手動地開啟 chrome 在 Site 1 上做測試,
輸入單引號, 有被程式判斷到, 並導回首頁. status=200
---------------------------------
2011-12-09 02:59:41 GET /demo-1.asp id=-1'%20or%20'3'='3 80 - 10.10.x.x Chrome/17.0.963.0 200 0 0


輸入單引號 (%27), 有被程式判斷到, 並導回首頁. status=200
---------------------------------
2011-12-09 03:10:24 GET /demo-1.asp id=1%27%20or%20%273%27 80 - 10.10.x.x Chrome/17.0.963.0 200 0 0


* 附註: 有問題的地方在, 為什麼之前的 IIS 的 log , status=302 而不是 200.


接下來, 我發現 request.querystring() 裡 %27 並不等於 ' (單引號),
測試的程式如下:
if instr(request.querystring(),"'") > 0 then
response.write "querystring found ' sign!"
else
response.write "pass ' sign query string check."
end if

if instr(request.querystring(),"%27") > 0 then
response.write "querystring found %27 sign!"
else
response.write "pass %27 query string check."
end if

URL 裡輸入 id=', 可以被第1個 if 判斷到, 但無法通過第2個 if 判斷.
URL 裡輸入 id=%27, 可以被第2個 if 判斷到, 但無法通過第1個 if 判斷.

* 附註: 如果您是使用 request("id") 的話, 會取得的是 ' 而不是 %27. (合乎常理).


結論1: 關於 querystring 的部份, 建議增加一個 %27 的判斷.

結論2: 如果要在第1關的 filter 裡擋單引號的話, 用 for each 來一個個的把 form 的資料 request 出來後, 再做判斷, 可能會擋的比較確實.

結論3: 每一支程式, 的每一個 request 應該都要詳細檢查要放進去 database 處理的變數是否為乾淨的(沒有被Hacker修改).

沒有留言:

張貼留言

Facebook 留言板