近期 SQL Injection、JS/HTML 腳本攻擊愈演愈烈,眾多站點深受其擾。異於主機漏洞可立即修補,Web 攻擊給防範與修復帶來極大不便。站長最大痛苦:密碼再強仍被攻破。真正安全三要素:密碼與生活無關、超級管理員密碼僅自己知、徹底完善網站程式。本文聚焦第三點。
<script>alert()</script>、</table>,因過濾不嚴達到搗亂目的。?id=999 and 1=1?id=999 and 1=2?id=999 and 0<>(select count(*) from admin)?id=999'; declare @a sysname set @a='xp_' 'cmdshell' exec @a 'dir c:\'---&aid=9核心:Server.HTMLEncode(Str) 一鍵搞定。但全站修改 <%=uid%> 太累。高效做法:僅過濾關鍵字元。
<%
function CHK(fqyString)
fqyString = replace(fqyString, ">", ">")
fqyString = replace(fqyString, "<", "<")
fqyString = replace(fqyString, "&", "&")
fqyString = Replace(fqyString, CHR(32), " ")
fqyString = Replace(fqyString, CHR(9), " ")
fqyString = Replace(fqyString, CHR(34), """)
fqyString = Replace(fqyString, CHR(39), "'")
fqyString = Replace(fqyString, CHR(13), "")
fqyString = Replace(fqyString, CHR(10) & CHR(10), "</P><P> ")
fqyString = Replace(fqyString, CHR(10), " ")
CHK = fqyString
end function
%>
應用範例:<%=CHK(Username)%>、Username=CHK(replace(request("username"),"'"",""))。用 Include 放公共頁面效率最高。
註冊/修改資料頁常缺少過濾或僅單邊過濾。檢測非法字元:
If Instr(request("username"),"=")>0 or Instr(request("username"),"%")>0 or ... Then
response.write "朋友,你的提交用戶名含有非法字符..."
response.end
end if
dim Bword(18)
Bword(0)="?" : Bword(1)=";" : Bword(2)=">" : Bword(3)="<" : Bword(4)="-"
Bword(5)="'" : Bword(6)="""" : Bword(7)="&" : Bword(8)="%" : Bword(9)="$"
Bword(10)="'" : Bword(11)=":" : Bword(12)=" " : Bword(13)="(" : Bword(14)=")"
Bword(15)="--" : Bword(16)=" chr(9)" : Bword(17)=" chr(34)" : Bword(18)=" chr(32)"
errc=false
for i=0 to ubound(Bword)
if instr(FQYs,Bword(i))<>0 then errc=true
next
if errc then
response.write "<script language=""javascript"">alert('很抱歉!您的操作違法了);history.back();</script>"
response.end
end if
如 [img]img/0001.gif' onerror=javascript:alert() alt=''[/img],前單引號中和左引號,後單引號中和右引號,輸出 <img src='img/0001.gif' onerror=javascript:alert() alt=''>,圖片不存在觸發 onerror 執行腳本。過濾單引號者用雙引號同理;過濾 javascript 者用 alert() 即可繞過。過濾必須徹底,不留絲毫機會。
面對多樣化 SQL Injection,該過濾哪些危險字元?
' 資料庫欄位判別封閉-- 某些資料庫註解標誌# 某些資料庫註解標誌" 可能導致程式出錯\ 跨越目錄3221143836nicode 編碼特徵字元$ 可能用於變量標註/ 和 \ 同義NULL 小心「空」錄入危險,可能導致錯誤構造溢位空格 與 ' 結合構造注入? = & 二次參數傳遞可能改寫 querystring提交:用戶名 'or''=',密碼 'or''='。程式執行:
Sql="SELECT * FROM lUsers WHERE Username=''or''='' and Password = ''or''=''"
SQL Server 返回 lUsers 所有記錄,ASP 誤判攻擊者符合第一條記錄而允許登入。防範代碼(程式體 4):
strUsername = Replace(Request("username"), "'", "''")
strPassword = Replace(Request("password"), "'", "''")
(後續內容省略)