萬盛學電腦網

您现在的位置: 萬盛學電腦網 >> 電腦基礎知識 >  >> 健康知識

網頁腳本攻擊防範全攻略:XSS、SQL注入與遠程注入防禦代碼實戰

近期 SQL Injection、JS/HTML 腳本攻擊愈演愈烈,眾多站點深受其擾。異於主機漏洞可立即修補,Web 攻擊給防範與修復帶來極大不便。站長最大痛苦:密碼再強仍被攻破。真正安全三要素:密碼與生活無關、超級管理員密碼僅自己知、徹底完善網站程式。本文聚焦第三點。

攻擊途徑分類

  1. 簡單腳本攻擊:無聊搗亂,如 <script>alert()</script>、</table>,因過濾不嚴達到搗亂目的。
  2. 危險腳本攻擊:竊取管理員/用戶資訊,如 Cookie 竊取、腳本本地寫入操作。
  3. SQL Injection 漏洞攻擊:源自動網論壇、BBSXP。利用 SQL 特殊字元過濾不嚴,跨表查詢。例:
    ?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
    獲取管理員密碼即控制全站,為拿主機權限鋪路。手法多樣,完整過濾需下苦功。
  4. 遠程注入攻擊:僅在提交頁做簡單 JS 過濾,對預謀攻擊無效。POST 攻擊即一例,遠程提交非法資訊達到攻擊目的。

防範 JS/HTML 腳本攻擊

核心:Server.HTMLEncode(Str) 一鍵搞定。但全站修改 <%=uid%> 太累。高效做法:僅過濾關鍵字元。

程式體(1)通用過濾函數

<%
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 放公共頁面效率最高。

程式體(2)用戶提交數據檢測過濾

註冊/修改資料頁常缺少過濾或僅單邊過濾。檢測非法字元:

If Instr(request("username"),"=")>0 or Instr(request("username"),"%")>0 or ... Then
    response.write "朋友,你的提交用戶名含有非法字符..."
    response.end
end if

程式體(3)程式化過濾提升效率

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

UBB 表情轉換隱蔽漏洞

如 [img]img/0001.gif' onerror=javascript:alert() alt=''[/img],前單引號中和左引號,後單引號中和右引號,輸出 <img src='img/0001.gif' onerror=javascript:alert() alt=''>,圖片不存在觸發 onerror 執行腳本。過濾單引號者用雙引號同理;過濾 javascript 者用 alert() 即可繞過。過濾必須徹底,不留絲毫機會。

防範 SQL Injection 漏洞攻擊

面對多樣化 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"), "'", "''")

(後續內容省略)

copyright © 萬盛學電腦網 all rights reserved