第二節、繞過程序限制繼續注入
在入門篇提到,有很多人喜歡用’號測試注入漏洞,所以也有很多人用過濾’號的方法來“防止”注入漏洞,這也許能擋住一些入門者的攻擊,但對SQL注入比較熟悉的人,還是可以利用相關的函數,達到繞過程序限制的目的。
在“SQL注入的一般步驟”一節中,我所用的語句,都是經過我優化,讓其不包含有單引號的;在“利用系統表注入SQLServer數據庫”中,有些語句包含有’號,我們舉個例子來看看怎麼改造這些語句:
簡單的如where xtype=’U’,字符U對應的ASCII碼是85,所以可以用where xtype=char(85)代替;如果字符是中文的,比如where name=’用戶’,可以用where name=nchar(29992)+nchar(25143)代替。
第三節、經驗小結
1.有些人會過濾Select、Update、Delete這些關鍵字,但偏偏忘記區分大小寫,所以大家可以用selecT這樣嘗試一下。
2.在猜不到字段名時,不妨看看網站上的登錄表單,一般為了方便起見,字段名都與表單的輸入框取相同的名字。
3.特別注意:地址欄的+號傳入程序後解釋為空格,%2B解釋為+號,%25解釋為%號,具體可以參考URLEncode的相關介紹。
4.用Get方法注入時,IIS會記錄你所有的提交字符串,對Post方法做則不記錄,所以能用Post的網址盡量不用Get。
5. 猜解Access時只能用Ascii逐字解碼法,SQLServer也可以用這種方法,只需要兩者之間的區別即可,但是如果能用SQLServer的報錯信息把值暴露出來,那效率和准確率會有極大的提高。
防 范 方 法
SQL注入漏洞可謂是“千裡之堤,潰於蟻穴”,這種漏洞在網上極為普遍,通常是由於程序員對注入不了解,或者程序過濾不嚴格,或者某個參數忘記檢查導致。在這裡,我給大家一個函數,代替ASP中的Request函數,可以對一切的SQL注入Say NO,函數如下:
Function SafeRequest(ParaName,ParaType)
'--- 傳入參數 ---
'ParaName:參數名稱-字符型
'ParaType:參數類型-數字型(1表示以上參數是數字,0表示以上參數為字符)
Dim ParaValue
ParaValue=Request(ParaName)
If ParaType=1 then
If not isNumeric(ParaValue) then
Response.write "參數" & ParaName & "必須為數字型!"
Response.end
End if
Else
ParaValue=replace(ParaValue,"'","''")
End if
SafeRequest=ParaValue
End function
文章到這裡就結束了,不管你是安全人員、技術愛好者還是程序員,我都希望本文能對你有所幫助。