台灣最大程式設計社群網站
線上人數
1048
 
會員總數:246631
討論主題:190056
歡迎您免費加入會員
討論區列表 >> 網管 / 資安 / VM >> [安]隱碼攻擊的方法與防範
[]  
[我要回覆]
1
回應主題 加入我的關注話題 檢舉此篇討論 將提問者加入個人黑名單
[安]隱碼攻擊的方法與防範
價值 : 0 QP  點閱數:3287 回應數:8
樓主

cuculon
初學者
68 2
0 15
發送站內信

考慮再三,還是決定公佈了.雖然很多高手都知道.但還是藉此讓新人了解一下.
因為,這並不是什麼高深的學問,只是一般人都疏乎掉了.
------------------------------------------------------------------------
攻擊原理:
一般我們在做身份辦識時,大家都常用類似下面這個SQL語法吧!?
select * from [會員資料庫] where ([id] like '" & id & "') and ([password] like '" & password & "')"

攻擊者只要在帳號密碼中輸入:「%」
這樣你的SQL語法會變成什麼呢?
select * from [會員資料庫] where ([id] like '%') or ([password] like '%')"

天啊!!等於無條件通過嘛!!!!
【註:%在ASP的SQL語法中,就等於萬用字元*,可以替代任何字串】

偏偏大家又會使用 rs.eof 來判斷,是否辨識通過.
因此,這個詭計才會得逞。
----------------------------------------------------------------------------
防範方式:
1、將會造成錯誤的符號置換掉
id = request("id")
password = request("password")
rp = "';"";*;%"
rp = split(rp,";",-1,1)
for i=0 to ubound(rp)
id = replace(id, rp(i), "==")
password = replace(password, rp(i), "==")
next

Set rs = Server.CreateObject("ADODB.Recordset")
SQL = "select * from MEMBER where (ID like '" & ID & "')"
SQL = SQL & " and (Password like '" & Password & "')"
rs.Open SQL,conn,1,3,1

if rs.eof then
%>
<script language="vbscript">
alert "無法登入,請檢查帳號或密碼是否輸入錯誤!"
history.back()
</script>
<%
response.end
Else
                  '後續登入作業
             End if

2、採用較笨的資料庫比對方法
     SQL = "select * from [member]"
     set rs = conn.execute(sql)
     a=0
     do until rs.eof
         if (rs("id")=request("id")) and (rs("password")=request("password")) then a = 1
         rs.movenext
     loop
     if a = 1 then
        '退回去
     else
        '後續登入作業
     end if
--------------------------------------------------------------------------
還有很多方法可以防範,例如也可以在client用script來檢查輸入碼,確定無誤後才submit,等等....
希望新手學會後不要去入侵別人的網站.有時會偷雞不著蝕把米哦!
【例如在cuculon所製作的站中,會將這種意圖入侵的人的資料記錄下來.
若有心的話,還可以對入侵者進行反制作業....】

這不是什麼高深的東西,再次提醒新手們.
一定要把防護措施作好哦!!

本篇文章發表於2002-04-24 03:28
1樓
回應

boxchi
檢舉此回應
各媒體都提及:資料隱碼技術.
如果真是這麼簡單,這就不叫技術吧?
若真如兄台所述,以"安全性"來論,這是一大問題.
而以"技術性"來論,設計者把這項考慮列入,只需額外一點點程式判斷即可解決,實在不能算什麼問題.
雖然我還不清楚究竟資料隱碼所指為何,但我不認為有如此之簡單.
各位擔心的網友除了修正上述問題之外,我認為仍需再繼續密切此消息.

兄台的方法2改良一下就不笨了.事實上我也是都採用類似的方法.
sql = "select id, pw from table where id = " & request("id") '請記得這邊就先作篩選
set rs = conn.execute(sql)
if rs.eof then
   response.write "帳號不存在"
else
   if rs("pw") <> request("pw") then
      response.write "密碼不正確"
   end if
end if
這樣的好處,還可以讓使用者知道,他是帳號錯還是密碼錯.

反倒是方法1我不認為好.但見仁見智了.
本篇文章回覆於2002-04-24 04:59
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
2樓
回應

cuculon
檢舉此回應
老實說,在三天前 cuculon 根沒沒聽過什麼叫隱碼攻擊.
後來看了報導及刑事局公佈的資料.SQL Injection的確就是利用上述的方式
來躲過以SQL為主的登入判斷.
最容易被SQL Injection入侵的,就是方法1.的SQL語法.
若根刑事局的公告內容,國內有80%的網站,都會被入侵.
應該就代表說,有80%的網站是利用方法1來做登入判斷.

因此,cuculon才會列出方法1.感謝您提供給大家的方法2改良版.
新手們應該會大量採用您的方法吧~~.

不過,cuculon撰寫本文最大的用意是在於提醒大家,一定要做好這樣的防範措施哦!
也歡迎各位同好們,多多提供您防範的方法,供新人們學習的參考.
本篇文章回覆於2002-04-24 05:33
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
3樓
回應

Allen
捐贈 VP 給 Allen 檢舉此回應
對不起, 插個話, 
cuculon, 
姑且不論用哪個方法較好, 請問一下, 為何你會用
select * from [會員資料庫] where ([id] like '" & id & "') and ([password] like '" & password & "')"
而不用
select * from [會員資料庫] where ([id] ='" & id & "') and ([password] ='" & password & "')"
呢? 這是書中的寫法, 還是真的大家通常都用cuculon的寫法, 用 like而不用 "=" , 感覺上, 用 "="  似乎應該比用LIKE來得直覺些
本篇文章回覆於2002-04-24 08:50
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
4樓
回應

Eddie
檢舉此回應
帳號及密碼的比對只要注意到不用 like 應該就能避免這個問題.....
如果用select id,password from xxxxx where id = 'xxxxx' 這樣的話
基本上,就算輸入萬用字元也是沒用的丫...不是嗎?
本篇文章回覆於2002-04-24 08:55
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
5樓
作者回應

cuculon
檢舉此回應
呵....這兩個問題好像跟主題不太嘎
like 跟  = 的差別,據標準的SQL用法來說
(cuculon 幾年前學的,現在不曉得有沒有不一樣)
like 用在字串的比對上.
= 則用在數字及日期的比對上
那為什麼 ='XXXX' 也可以用呢?
是因為用了= 後,是將字串轉成數字格式來比對了喲!
(不要問為什麼,這是很簡單的道理)
所以 用了 = 是不會產生萬用字元的問題,但是對單、雙引號還是沒輒ㄚ
仍然有被入侵的危險,因為若忘了將IIS的錯誤回應關閉,在產生錯誤時.
IIS會將部份的程式碼輸入,對高手而言,只要短短的錯誤訊息,就會立刻知道我們的程式
大概是怎麼寫的,可以用推測的方式,嘗試出入侵的語法哦!!

例如在帳號欄輸入「 ' or [欄位] like '%」 
欄位名稱用推測的,因為一般人在寫程式時,會將<input>的名稱設成與資料庫的欄位名稱相同.(所以,將<input>的名稱,設為與資料庫欄位名稱不同,也是一種防護方式)

另外,對於有模糊查詢的需求,如:關鍵字搜尋,在SQL 中用 = 是行不通的.
不過,在ID與PASSWORD的比對上,的確是不需要用 LIKE。

承前文,因為刑事局公佈說國內有80%的網站是用這種寫法.
所以cuculon才會用 like ,來做說明.在開題的文章中,cuculon也有說,還有很多方法嘛!!

呵!真是不錯喲!感謝allen及eddie提供的意見.
也讓我又多屁了一些SQL的用法.
將文章寫的不完全,也有這些的好處,可以讓大家交流交流.
(真是對不起.開頭的文章,我好像發表的太隨便了,產生這些爭議.....)
本篇文章回覆於2002-04-24 09:34
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
6樓
作者回應

cuculon
檢舉此回應
對不起,cuculon發現上一篇有地方交待錯了.
='XXXX' 應該是將字串,改用數學運算值來比對才是.
而不是數字.
這在定義上是不同的意義.
本篇文章回覆於2002-04-24 09:36
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
7樓
回應

A-Man
檢舉此回應
ㄜ...基本上你們的方法都還沒完全濾掉...
不過...大半都濾掉了
第一種方式先過濾request是正確的
但是濾的不完全...而且就像後面的人說的...id和pass要分開驗證比較好
用like也的確比較不好的....
去國外找找SQL injection的資料有些會提到類似過濾含式
有興趣的可以去找找~
我並不是專門研究這個的...所以也沒辦法提出什麼高見
請自行到國外搜尋類似資料吧~~
本篇文章回覆於2002-04-24 09:45
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
8樓
回應

A-Man
檢舉此回應
對了看看有誰的搜尋程式可以搜尋
aa='bb"  這個字串(前面是單,後面是雙)
並且標色找出ㄋ
本篇文章回覆於2002-04-24 09:47
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
   
1

回覆
如要回應,請先登入.