熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> SQL Server >> 正文

繞過程序限制和利用系統表注入SQL Server

2013-11-15 14:34:41  來源: SQL Server 

  第一節利用系統表注入SQLServer數據庫
  SQLServer是一個功能強大的數據庫系統與操作系統也有緊密的聯系這給開發者帶來了很大的方便但另一方面也為注入者提供了一個跳板我們先來看看幾個具體的例子
  
  ① ?id=;exec masterxp_cmdshell net user name password /add
  
  分號;在SQLServer中表示隔開前後兩句語句表示後面的語句為注釋所以這句語句在SQLServer中將被分成兩句執行先是Select出ID=的記錄然後執行存儲過程xp_cmdshell這個存儲過程用於調用系統命令於是用net命令新建了用戶名為name密碼為password的windows的帳號接著
  
  ② ?id=;exec masterxp_cmdshell net localgroup name administrators /add
  
  將新建的帳號name加入管理員組不用兩分鐘你已經拿到了系統最高權限!當然這種方法只適用於用sa連接數據庫的情況否則是沒有權限調用xp_cmdshell的
  
  ③ ?id= ;;and db_name()>
  
  前面有個類似的例子and user>作用是獲取連接用戶名db_name()是另一個系統變量返回的是連接的數據庫名
  
  ④ ?id=;backup database 數據庫名 to disk=c:\inetpub\wwwroot\db;
  
  這是相當狠的一招從③拿到的數據庫名加上某些IIS出錯暴露出的絕對路徑將數據庫備份到Web目錄下面再用HTTP把整個數據庫就完完整整的下載回來所有的管理員及用戶密碼都一覽無遺!在不知道絕對路徑的時候還可以備份到網絡地址的方法(如\\xxxx\Share\db)但成功率不高
  
  ⑤ ?id= ;;and (Select Top name from sysobjects where xtype=U and status>)>
  
  前面說過sysobjects是SQLServer的系統表存儲著所有的表名視圖約束及其它對象xtype=U and status>表示用戶建立的表名上面的語句將第一個表名取出比較大小讓報錯信息把表名暴露出來第二第三個表名怎麼獲取?還是留給我們聰明的讀者思考吧
  
  ⑥ ?id= ;;and (Select Top col_name(object_id(表名)) from sysobjects)>
  
  從⑤拿到表名後用object_id(表名)獲取表名對應的內部IDcol_name(表名ID)代表該表的第個字段名換成就可以逐個獲取所猜解表裡面的字段名
  
  以上點是我研究SQLServer注入半年多以來的心血結晶可以看出對SQLServer的了解程度直接影響著成功率及猜解速度在我研究SQLServer注入之後我在開發方面的水平也得到很大的提高呵呵也許安全與開發本來就是相輔相成的吧
  
  第二節繞過程序限制繼續注入
  在入門篇提到有很多人喜歡用號測試注入漏洞所以也有很多人用過濾號的方法來防止注入漏洞這也許能擋住一些入門者的攻擊但對SQL注入比較熟悉的人還是可以利用相關的函數達到繞過程序限制的目的
  
  在SQL注入的一般步驟一節中我所用的語句都是經過我優化讓其不包含有單引號的利用系統表注入SQLServer數據庫有些語句包含有我們舉個例子來看看怎麼改造這些語句
  
  簡單的如where xtype=U字符U對應的ASCII碼是所以可以用where xtype=char()代替如果字符是中文的比如where name=用戶可以用where name=nchar()+nchar()代替
  
  第三節經驗小結
  有些人會過濾SelectUpdateDelete這些關鍵字但偏偏忘記區分大小寫所以大家可以用selecT這樣嘗試一下
  
  在猜不到字段名時不妨看看網站上的登錄表單一般為了方便起見字段名都與表單的輸入框取相同的名字
  
  特別注意地址欄的+號傳入程序後解釋為空格%B解釋為+號%解釋為%號具體可以參考URLEncode的相關介紹
  
  用Get方法注入時IIS會記錄你所有的提交字符串對Post方法做則不記錄所以能用Post的網址盡量不用Get
  
   猜解Access時只能用Ascii逐字解碼法SQLServer也可以用這種方法只需要兩者之間的區別即可但是如果能用SQLServer的報錯信息把值暴露出來那效率和准確率會有極大的提高
  
  防 范 方 法
  SQL注入漏洞可謂是千裡之堤潰於蟻穴這種漏洞在網上極為普遍通常是由於程序員對注入不了解或者程序過濾不嚴格或者某個參數忘記檢查導致
From:http://tw.wingwit.com/Article/program/SQLServer/201311/22006.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.