第一百二十五回:隱碼入侵與編碼保護
回到家後,天玄既興奮又期待的說:「來吧!來吧!」
宇成說:「先不要急,雲飛,過來幫忙吧!」
雲飛走過來問:「你想要學些什麼?」
天玄說:「其實,小紅很崇拜電腦強的人,所以我想要竊取她的資料來證明。另外,她還問我什麼叫作加密編碼,如果我答不出來我就太遜了!」
雲飛說:「這些都可以教你!那,你想要從那裡取得她的資料?」
天玄打開一個網站說:「就是這個遊戲網站,我們就是在這認識的,她叫iccred。」
雲飛看了看說:「這看起來滿像轟炸超人的...你很強嗎?」
天玄拍胸脯保證:「當然強囉!每次本天玄大爺出馬,一堆人就過來圍觀呢!」
雲飛一邊試著輸入 SQL 隱碼一邊說:「哼,他們是來看你怎麼輸的吧!」
天玄怒道:「喂,你這什麼意思?你看,我一上線就一堆人搶著要跟我連線。」
雲飛進入資料庫畫面並回道:「是因為找你洗勝率很方便吧。」
天玄憤怒的說:「喂,你這小子,不要太過份了!」
此時雲飛已經抓好資料了,指著螢幕,讓天玄只得『氣得向他道謝』。
宇成看著螢幕問:「雲飛,這就是所謂的 SQL 隱碼攻擊?」
雲飛點頭說:「是的,沒有錯!所謂的 SQL 隱碼便是利用程式寫作和語法上的漏洞造成的意外結果。通常利用這種辦法,可以創造出意想不到的效果!我以前和你說過,利用網頁的參數傳入非預期的值不算什麼,而再上去,則是要懂得將對方主機的資料給取出來。」
宇成點頭說:「嗯、嗯、我記得!前者的手法就像天玄一樣,而後者的手法則和明昂一樣厲害!」
天玄聽了氣得問:「喂!這是什麼意思?為什麼要把我和那混蛋扯在一起?」
雲飛不理會天玄的憤怒繼續說:「而 SQL 隱碼則是利用前者達到後者的技術!」
宇成聽了問:「這又是非正規技術嗎?」
雲飛點頭說:「沒有錯!因為是在正常手法之外的方式,所以是非正規技術!」
天玄大喊一聲:「啊!!!!!」
宇成嚇了一跳摀住耳朵罵道:「天玄,你沒事喊那麼大聲做什麼?」
天玄生氣的說:「你們在那裡講些什麼啦!我完全不懂啊!」
雲飛用輕蔑的語氣說:「小子,你不是想要學習技術嗎?那就給我仔細的聽啊!」
天玄暫時平息怒氣道:「好吧!那你說,什麼利用前者達到後者的是啥意思。」
雲飛指著螢幕說:「你們看,我在帳號密碼的框框裡輸入的不是正確的資料吧!」
宇成和天玄轉頭看著螢幕說:「嗯,這看起來很像是邏輯判斷式嘛!」
雲飛又打開一個網頁說:「再看這個!這是一個網頁利用表單元件將輸入的資料傳送到後端主機處理的範例,他會收集這兩個 input type 為 text 的輸入項,然後透過 form action 指定的路徑傳遞參數。」
宇成點頭表示明白這些,但天玄卻仍不是很懂,這對他而言還是有點困難的。
雲飛切換頁面,換到傳遞參數到該路徑的處理頁面檢視原始碼說:「你們看,在這裡有一些 if 判斷式,它會判斷這個帳號與密碼是否符合管理者要素!其中一個變數 rootid[result1] 是利用迴圈從資料庫中讀取每一筆帳號資料出來判斷,當判斷通過後再進入第二個判斷式迴圈讀取資料庫中的密碼判斷是否正確。」
天玄舉手說:「等一等!如果是這樣的話,輸入那些邏輯判斷怎麼會通過?」
雲飛問:「你看看 or 1 = 1 的結果應該是 true 或 false?」
天玄說:「喂,太瞧不起我了吧?誰都知道 1 = 1 啊!這結果當然是 true!」
雲飛點頭說:「看來你還有點救!接下來,在判斷式中假設帳號為 paul 而密碼為 qq 則判斷式的成立應該是當 if帳號 == 'paul' 以及 if 密碼 == 'qq' 對吧?因為在 SQL 語法中單引號內括字元字串。」
天玄開始了解而說:「這樣講我當然明白!可是和 or 1=1 又有何關聯?」
雲飛便說:「你看!假如我們輸入 if 帳號 == 'paul' 這裡改成 if 帳號 == 'xxx' 本來應該是錯誤的,因為沒有 xxx 這個帳號在!可是若輸入 ' or 1=1' 變成if 帳號 == 'xxx' or 1 = 1''時,因為有一個『或』運算 or 在,就算沒有帳號,但判斷到『或1=1』時卻會通過!我們知道 AND 要兩者都成立,而 or 只要其中一個成立,所以在某些情況下會通過檢查。而若反過來輸入資料被放在 == 之前則可以輸入 1=1 or來變成 if 1=1 or 'xxx' == 'paul',同樣判斷到1=1就會通過了。」
天玄拍手恍然大悟道:「天呀!真是高招!我終於開竅了!」
宇成也了解道:「原來如此,這就是所謂的 SQL 隱碼啊!果然很危險!」
雲飛卻搖搖頭說:「不然,這並非是絕對的好方法!這次之所以能成功,是因為寫這個網頁的人疏忽漏掉很多東西,比如過濾掉單引號!如果對方的程式寫了過濾單引號的程式加以檢查,這方法就不會成功了。而且,剛剛所講的只是基本的理論,實際使用上要視不同網頁程式寫法,嘗試各種 SQL 語法。」
天玄拼命點頭說:「是!是!好,這樣我就知道要怎麼跟小紅說了!」
雲飛轉頭看著宇成說:「怎麼樣?你還是對這些東西很有興趣,對吧?」
宇成不願正面回答,便說:「我只是想到『資訊安全』的重要性罷了!畢竟,如果這麼簡單就可以攻擊的話,那我們的資料存在網路上一點也不安全!」
天玄被激勵而說:「宇成,你在胡說什麼啊?網路本來就是一個公開的地方,既然有心要把資料放在上面,當然就沒有絕對的安全啊!所以被入侵,是自己的防護不夠周全的關係。你想想,不鎖好門而被偷東西,該怪誰?」
宇成心中突然又閃過一道光,心想:「是這樣子嗎?沒有鎖好門的人也有錯嗎?」
雲飛喝了口水說:「那麼,接下來是編碼的問題吧?」
天玄又拼命點頭的說:「對,拜託你了,雲飛大大,不,超級大大大!」
雲飛說:「你聽好了,所謂的編碼就是將資料編輯成一連串的二進位碼,而加密則是不以直接的方式解碼,必需要用特殊的規則或演算法去解出來。」
天玄點點頭說:「喔~是這樣子啊?不過我還是不懂,可以說得更俱體一點嗎?」
雲飛便在螢幕上打了幾個字:B746、A741、A6D1、A5C0。
天玄疑惑的問:「這個...這個是什麼意思啊?」
雲飛邪笑著說:「你用『內碼輸入法』在姓名欄輸入那四組字碼就知道了,哼!」
天玄好奇的打上去,卻發現是一句不勘入目的話,甚是生氣的說:「太過份啦!」
宇成捧腹大笑道:「哈哈哈!天玄..噗..被擺了一道喔!」
雲飛轉身打字說:「好了,沒時間讓你當小丑了,得快點讓你明白才可以。」
天玄氣憤的罵道:「喂!這到底是誰造成的啊?」
雲飛說:「你看,以B746這個字碼為例,解析成二進位後會變什麼?」
天玄拿出筆算後說:「是 1011 0111 0100 0110 啊!」
雲飛便說:「假如我們把它的編碼往左移兩位,就成了 1101 1101 0001 1010 對吧?最左邊的兩位 10 因為左移所以會跑到最右邊去。此時再組合回十六進位就會變成 DD1A 這個碼,和原先的 B746 不同了對吧?但只要右移又恢復了!」
天玄點頭說:「我懂了,我懂了!只要事先制定一套規則演算法,就可以讓字碼在網路上傳遞時屬於被修改過的方式,保護資料傳遞中的安全性。而收到的人如果不懂得演算規則,他就沒有辦法還原回原來的資料了!」
雲飛又說:「但是只有簡單的位移,還是容易被看出來。所以,演算的方式往往要依賴一些公式去計算!B746二進位碼中有1的位元是15,13,12,10,9,8,6,2,1。」(二進位碼的位元位置編號為15,14,13,12,11,10,9,8,7,6,5,4,3,2,1,0)
雲飛換個畫面接著說:「假如不在乎文件大小,可以編碼成9FDCA98621,其中前面的9代表讀取下面幾組位元,而FDCA98621代表第幾個位元為1。因為是9,所以會讀取九組二進碼,從F一直讀到1為止,在1的後面一個碼則是代表下一個字由幾組碼構成。當然,因為開頭的9可以知道後面九個碼都代表同一個字碼的第幾個位元為1,所以就算不按順序,亂數排成9C89A6DF12也無所謂,還原計算回來後都一樣代表15,13,12,10,9,8,6,2,1位元為1,更能保障安全。」
雲飛又說:「利用演算的方式,也可以抽出 BIG-5 碼的四個十六進位數字單獨做加減,比如 B746 用 B+1、7-1、4+2、6-2的方式編碼成C664,等到要解碼時再重新加減回去變C-1、6+1、6-2、4+2還原回B746。」
天玄又問:「如果這樣做的話,那恰好被猜出幾個字來,不就可以全部解出來了?」
雲飛冷笑道:「你以為編碼的人會這麼笨嗎?多重編碼方式,每個字可以用不同的編碼規則,然後以文件檔頭的隱藏位元做運算式。配合不同的排列規則,往往直接解是解不出什麼東西來的。不過這些還算是下乘的東西,真正上乘的....」
此時,雲飛的電腦上閃起新郵件訊息,雲飛便先打開看。附加檔是一個加密演算過後的文字檔,是明昂傳給他的私密訊息,便邪笑道:「編碼的活教材進來了!」
不知道這封訊息裡面是什麼?...待續 |