熱點推薦:
您现在的位置: 電腦知識網 >> 網絡技術 >> 正文

如何防范暴庫攻擊

2013-09-12 15:53:47  來源: 網絡技術 

  最近,一個沙特阿拉伯的少年黑客成功侵入微軟英國網站,貼上一幅兒童搖沙特阿拉伯國旗的照片,覆蓋了原來的內容。看到這裡,你是不是為自己的網站安全感到擔憂呢?黑客在入侵網站過程中一般會測試能否進行SQL注入,我們應該如何防范呢?
  上期我們介紹了Access(MSSQL)數據庫的防范SQL注入的方法,該注入方法主要針對的是個人網站以及小型企業,但對電子商務網站、大中型企事業網站和大中型商業網站的管理員們來說就不適用了,因為這些網站很多都采用SQL Server作為數據庫的。
  所以,本期小編將教大家如何防范針對SQL Server數據庫的暴庫。所謂暴庫,就是利用各種方法得到數據庫文件或是數據庫文件的查看/修改權限,這樣直接就有了站點的前台或者後台的權限。
ASP+SQL Server暴庫技巧
1.暴出SQL Server表名和列名
  基本方法:查找並確認一個ASP+SQL Server注入點,在注入點後提交“'having 1=1--”,得到返回信息為英文,在這段英文中即可看到一個表名和一個列名。提交“group by 暴出的表名列名having 1=1--”,可得到另一個列名;繼續提交“group by 暴了的表名列名,暴出的表名.第2個列名 having 1=1--”,可再得到一個列名。用同樣的方法提交,直到頁面不再返回錯誤信息,就可以得到所有的列名。Tw.WINgwIT.coM
  小知識:暴表名與列名是SQL語句“having 1=1—”與GROUP BY結合使用,進行條件判斷的。由於語句不完整,因此數據庫返回錯誤信息,並顯示一個表名和一個列名。
  基本方法只能暴出數據庫中的當前表。如果某個表中包含的列名非常多,用上述基本方法就非常困難了。比較有效的方法是,利用“0<>(select count(*) from master.dbo.sysdatabases where name>1 and dbid=[N])”語句,暴出數據庫中任意表名和列名,其中“[N]”表示數據庫中的第N個表。
  第一步:在注入點後提交如下語句:“0<>(select count(*) from master.dbo.sysdatabases where name>1 and dbid=12)”,因為 dbid 的值從1到5,是系統使用的,所以用戶自己建的一定是從6開始的,並且我們提交了 name>1,name字段是一個字符型的字段,和數字比較就會出錯。
  因此在提交後,IE會返回如下的信息:“Microsoft OLE DB Provider for ODBC Drivers 錯誤'80040e07'[Microsoft][ODBC SQL Server Driver][SQL Server]將 nvarchar 值'Northwind'轉換為數據類型為 int 的列時發生語法錯誤。”(圖1),這樣就把name字段的值暴出來了,也就是我們得到了一個庫名“Northwind”。改變“dbid”的值可以得出所有的庫名。

  第二步:得到了庫名後,現在要得到庫中所有的表名,提交如下語句:“and 0<>(select top 1 name from master.dbo.sysobjects where xtype='U') ”,這裡要暴的是master這個庫中的表名,查詢的SQL語句返回的是name的值,然後和數字0比較,這樣就會暴露出name的值。提交後一個表名“spt_mon ito”就被暴出來了(圖2)。

  第三步:再接著暴其他的表,繼續提交如下語句:“and 0<>(select top 1 name from master.dbo.sysobjects where xtype='U' and name not in('spt_monito'))”提交後,又暴出一個表名為“cd512”(圖3)。依次提交 “and name not in('spt_monito','cd512',..)”就可以查出所有的表名。

2.讀取SQL Server數據庫中的任意數據
  知道了數據庫的表名、列名後,可以利用“查詢語句”讀取數據庫中的任意信息。例如要讀取某個表中某列中的第N個數據,可提交語句:“and (Select Top 1 列名 FROM 表名 where id=[N])>1”( [N]代表列中的第N條數據),從IE返回信息中即可得知想要的數據。這裡以注入點http://online.idggame.com.cn/tiantang/shownews.asp?id=227為例進行講解:
  首先,在注入點後提交“'having 1=1--”,從返回信息中得到表名為news,列名為id。接著用上面介紹的方法得到另外的列名如c_id、s_id、username、topic等。
  然後,將“查詢語句”中的[N]改為221,並提交,如“and (Select Top 1 topic FROM news where id=221)>1”,該句的意思表示從“news”表中讀出“id=221”的新聞標題“topic”,提交後返回頁信息中包含“視頻MM大賽初賽告捷 綠色6月揭開火爆半決賽”這段內容(圖4),這就說明“news”表中“topic”列的第一個值為“視頻MM大賽初賽告捷 綠色6月揭開火爆半決賽”。

  由於這是一個文章系統,因此其在網頁中代表的真實含義為:ID為221的文章其標題為“視頻MM大賽初賽告捷 綠色6月揭開火爆半決賽”。
  小提示:上面的例子中讀取的只是一篇文章的標題,在實際的應用中,可以讀取包含用戶名和密碼表中的數據,可以獲得任意用戶名的密碼。這種方法比使用ASCII碼一個一個地猜解快得多。
3.修改數據庫,插入數據
  當成功地獲得了表名,列名後,就可以在數據庫裡修改甚至插入新的數據。例如可以將上面的新聞標題進行修改,提交如下命令:“ ;update news set topic='我不是黑客,我喜歡MM,哈哈!' WHERE id='221'”。
  命令運行後正常顯示,在IE地址欄中輸入鏈接“http://online.idggame.com.cn/tiantang/shownews.asp?id=221”,可以看到ID為221的文章其標題已經變成了更改的內容:“我不是黑客,我喜歡MM,哈哈!”(圖5)。

  如果要在數據庫中插入一條新的數據,可提交如下語句:“;insert into news(id,topic) values('228','您的網站有安全漏洞,請注意防護')--”提交語句後返回正常頁面,說明語句正常執行了。然後打開鏈接“http://online.idggame.com.cn/tiantang/shownews.asp?id=228”時,可以看到新添加的文章。
ASP+SQL如何防范暴庫
  服務器上放置的網站比較多,管理員不可能針對所有網站的每個頁面來審查是否存在SQL注入漏洞。因為SQL注入入侵是根據IIS給出的ASP錯誤提示信息來入侵的,所以只要管理員把IIS設置成不管出什麼樣的ASP錯誤,只給出一種錯誤提示信息,即HTTP 500錯誤,那麼黑客就沒辦法進行入侵了。具體設置如下:
  單擊“開始”菜單,選擇“設置→控制面板”命令,然後進入“控制面板”的“管理工具”中,雙擊打開“Internet信息服務”,在“默認網站”上單擊右鍵,在彈出的快捷菜單中選擇“屬性”命令。
  然後在打開的“默認網站屬性”對話框中選擇“自定義錯誤”標簽,把500:100這個錯誤的默認提示頁面 C:\WINDOWS\Help\iisHelp\common\500-100.asp改成C:\WINDOWS\Help\iisHelp\common\500.htm(圖6),這樣無論ASP運行中出什麼錯,服務器都只提示HTTP 500錯誤,杜絕了黑客利用錯誤提示信息暴出數據庫。

攻防博弈
  攻 黑客:我們除了對ASP+SQL Server類的網站進行注入攻擊外,還可以對PHP+MYSQL類的網站進行注入。相對而言,ASP+SQL Server的注入攻擊比較普及,防御方法也比較單一,而知道這麼防御PHP+MYSQL注入攻擊的人就比較少,且防御很困難,我們還是可以繼續為所欲為。
  防 編輯:對客戶端提交的變量參數進行仔細檢測、相關的賬戶信息加密、對IIS上進行安全設置都可以進一步杜絕ASP類型網站的SQL注入入侵攻擊,但是針對PHP+MYSQL類型的網站來說,這些安全防御工作還是不夠的。我們還應在IIS中為每個網站設置好執行權限,不能輕易地給靜態網站以“腳本和可執行”權限。對於那些通過網站後台管理中心上傳文件存放的目錄,直接將執行權限設為“無”即可。

 
From:http://tw.wingwit.com/Article/Network/201309/411.html
  • 上一篇文章:

  • 下一篇文章:
  • 推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.