grass0916 發表於 2013-9-11 16:17:47

SQL 資料隱碼攻擊防範

本帖最後由 grass0916 於 2014-9-12 03:51 PM 編輯

今天談談防範 SQL資料隱碼攻擊( SQL injection ), 中國大陸稱作 SQL注入攻擊,

是在給使用者輸入字串資料中夾帶著資料庫指令, 這樣會使系統誤判並使伺服器允許執行。


有幾項是我們必須檢查 使用者輸入的字串中, 是否有以下字元 : (這裡適用 mySQL)


含有字元 SQL 中其意義

;
分號
查詢分隔符號
'
單引號
字元資料字串分隔符號
#(空格)
井字號後面再接 space 註解分隔符號 (其後字元無效)
--(空格)
雙減號後面再接 space 註解分隔符號 (其後字元無效)
/* ... */
斜線米字 註解分隔符號 ( /* 和 */ 期間字元無效 )


初階的腳本撰寫者學習到了 SQL 相關指令時, 會忽略到這了一部分,

我們直接看以下例子 :
set $@DB_Main$, "`pasture_story`" ;
input $@partner$ ;
query_sql "UPDATE " + $@DB_Main$ + ".`story_chapter` SET `partner` = '" + $@partner$ + "' WHERE `char_id` = " + getcharid(0) ;
http://i206.photobucket.com/albums/bb170/grasshouse/SQL_zpsea9b94e1.png%7Eoriginal

使用了 腳本指令 input, 且變數為字串型別, 使用者角度會看到以下視窗。

http://i206.photobucket.com/albums/bb170/grasshouse/SQL2_zpsbdcd210e.png

正常情況下, 這時資料庫的資訊會變成以下。

http://i206.photobucket.com/albums/bb170/grasshouse/SQL3_zpsed35963e.png

http://i206.photobucket.com/albums/bb170/grasshouse/SQL4_zps4a3a0ae6.png

但是如果輸入的字串為以下內容。
'-- (注意, 雙減號後面還有一個空格)

這樣我們來看看實際執行指令。

query_sql "UPDATE `pasture_story`.`story_chapter` SET `partner` = ''-- ' WHERE `char_id` = 150019" ;
雙減號後面被註解, 亦即無效果, 執行語法亦同於。
query_sql "UPDATE `pasture_story`.`story_chapter` SET `partner` = ''" ;
少了 WHERE 的條件判斷, 我們看看結果。

http://i206.photobucket.com/albums/bb170/grasshouse/SQL6_zpsf59a2d0c.png

媽阿 ~~ 我被人家黑了。

所以了, 字串不做檢查直接執行 SQL 指令我們用精闢的兩個字來作結論。

找死

在外面的系統如果輸入以下內容, 後果是什麼可想而知, 資料庫直接 Say byebye。
' ; DROP TABLE `pasture_story` --
不過 rA, 設計成使用 query_sql 一次只會判斷一個指令, 兩個以上會出現錯誤, 這倒是可以放心。


解決方法有兩種 :

搭配右手邊連結 點我 一同使用。

兩種函數其實可以合併, 特意分開想讓大家看其中不同之處。

1. 完全杜絕 (只要不合法就不允許執行)
**** Hidden Message *****

2. 改變形式 (將不合法的字元以跳脫字元 '\' 使其無效化)
**** Hidden Message *****

rgrg1234 發表於 2013-9-11 16:49:49

本帖最後由 rgrg1234 於 2013-9-11 05:00 PM 編輯

啊這丟出來就不好玩了啊
-
**** Hidden Message *****


Karas鴉 發表於 2013-9-11 17:51:10

本帖最後由 Karas鴉 於 2013-9-11 05:54 PM 編輯

伺服器內防範算簡單的
註冊頁上就不只 sql injection 了...
---------------
不過 rA, 設計成使用 query_sql 一次只會判斷一個指令, 兩個以上會出現錯誤, 這倒是可以放心。
這個倒是第一次知道...

IDUN-2 發表於 2013-9-11 18:52:23

本帖最後由 IDUN-2 於 2013-9-11 07:11 PM 編輯

我來看第二方法的

把使用者GRANT關閉不能避免?

你可以考慮發一個修改query_sql避免被利用的原碼

zxc79212 發表於 2013-9-11 19:15:34

第二個方法我比較好奇怎樣才能改變形式
使用SQL開機有好處也有壞處阿.....
TXT 不錯但是很多SQL的腳本無法使用 ....

武西郎 發表於 2013-9-11 22:16:21

原來input 腳本指令
搭配SQL語法
可以做出這麼可怕的事
先來防範一下好了

美少男 發表於 2013-9-25 20:14:17

之前试过这样被黑,从此都不敢INPUT了。

p899223 發表於 2013-9-25 20:45:33

ㄚ聯 發表於 2013-9-29 04:51:57

這時忽然會覺得用TXT開機的話
也許就不用擔心這個攻擊了XD"

grass0916 發表於 2013-9-29 05:28:16

ㄚ聯 發表於 2013-9-29 04:51 AM static/image/common/back.gif
這時忽然會覺得用TXT開機的話
也許就不用擔心這個攻擊了XD"

TXT 連SQL指令都不能用

不知道你要高興什麼 =_=

ㄚ聯 發表於 2013-9-29 18:07:14

grass0916 發表於 2013-9-29 05:28 AM static/image/common/back.gif
TXT 連SQL指令都不能用

不知道你要高興什麼 =_=

你是不是誤會的我意思?
還是你解讀錯誤了?
我純粹只是想說
若用TXT架設的話
就不用腳本被放隱碼攻擊了!!!
(你的口氣根本有點......)

grass0916 發表於 2013-9-29 20:33:10

ㄚ聯 發表於 2013-9-29 06:07 PM static/image/common/back.gif
你是不是誤會的我意思?
還是你解讀錯誤了?
我純粹只是想說


別懷疑我口氣就是有點 XXX,

因為 TXT 是被時代淘汰的產物,

你拿了一個漏洞更多更好入侵的系統跟

更早出生且為一個完整公司做開發的第三方 SQL 做比較味,

個人覺得你的論點已率先站不住腳,

如有不適 I'm so sorry.

我很喜歡甲骨文這個公司,

你的表態讓我覺得你在低估他,

這一切不過是第二階端開發者的失誤罷了。

welin8154 發表於 2013-11-2 11:03:55

sql injection...
好專業阿XDD

小弟初碰資安領域,也只看得懂一點
不知是否所有的人都能懂......

c80916219 發表於 2013-11-2 19:44:03

這是個嚴重的問題...來看看如何防範

acppt85643 發表於 2014-2-17 19:20:08

最近在學習如何架設伺服器,看到這篇文章的提醒非常感謝你的分享
先回復來看如何完全杜絕了,謝謝你
頁: [1] 2 3 4 5
查看完整版本: SQL 資料隱碼攻擊防範