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

SQL注入攻擊的原理及其防范措施

2013-11-13 12:41:32  來源: SQL語言 

  ASP編程門檻很低新手很容易上路在一段不長的時間裡新手往往就已經能夠編出看來比較完美的動態網站在功能上老手能做到的新手也能夠做到那麼新手與老手就沒區別了嗎?這裡面區別可就大了只不過外行人很難一眼就看出來罷了在界面的友好性運行性能以及網站的安全性方面是新手與老手之間區別的三個集中點而在安全性方面新手最容易忽略的問題就是SQL注入漏洞的問題用NBSI 對網上的一些ASP網站稍加掃描就能發現許多ASP網站存在SQL注入漏洞教育網裡高校內部機構的一些網站這種漏洞就更普遍了可能這是因為這些網站大都是一些學生做的緣故吧雖然個個都很聰明可是畢竟沒有經驗而且處於學習中難免漏洞多多了本文主要講講SQL注入的防范措施而要明白這些防范措施的用處須先詳細講解利用SQL注入漏洞入侵的過程新手們看明白啦

  相當大一部分程序員在編寫代碼的時候沒有對用戶輸入數據的合法性進行判斷使應用程序存在安全隱患如這是一個正常的網址http://localhost/lawjia/showasp?ID=將這個網址提交到服務器後服務器將進行類似Select * from 表名 where 字段=&ID的查詢(ID即客戶端提交的參數本例是即)再將查詢結果返回給客戶端如果這裡客戶端故意提交這麼一個網址

  http://localhost/lawjia/showasp?ID= and user>這時服務器運行Select * from 表名 where 字段= and user>這樣的查詢當然這個語句是運行不下去的肯定出錯錯誤信息如下

  ·錯誤類型

Microsoft OLE DB Provider for ODBC Drivers (xE)
[Microsoft][ODBC SQL Server Driver][SQL Server]將 nvarchar 值 sonybb 轉換為數據類型為 int 的列時發生語法錯誤
/lawjia/showasp

  但是別有用心的人從這個出錯信息中可以獲得以下信息該站使用MS_SQL數據庫用ODBC連接連接帳號名為sonybb所謂SQL注入(SQL Injection)就是利用程序員對用戶輸入數據的合法性檢測不嚴或不檢測的特點故意從客戶端提交特殊的代碼從而收集程序及服務器的信息從而獲取想得到的資料通常別有用心者的目標是獲取網站管理員的帳號和密碼比如當某個人知道網站管理員帳號存在表login中管理員帳號名為admin他想知道管理員密碼這裡他從客戶端接著提交這樣一個網址
http://localhost/lawjia/showasp?ID= and (Select password from login where user_name=admin)>返回的出錯信息如下

  ·錯誤類型

Microsoft OLE DB Provider for ODBC Drivers (xE)
[Microsoft][ODBC SQL Server Driver][SQL Server]將 varchar 值 !@#*&admin 轉換為數據類型為 int 的列時發生語法錯誤
/lawjia/showasp

  你知道嗎?上面標紅的部分就是管理員帳號admin的密碼!雖然很復雜讓人看幾遍也記不住的但它就這樣顯示在你面前了這時您就可以用這個帳號和密碼接管人家的網站了!這時你可能還會說如果他不是事先知道管理員帳號存在表login中而且知道管理員帳號為admin那他就不可能獲得管理員密碼你錯了只要人家願意多花時間嘗試他將可以獲得數據庫連接帳號權限內所能獲得的所有信息!具體過程請參看網上的這篇文章SQL注入天書之ASP注入漏洞全接觸

  當然這個過程是很煩瑣的而且要花費很多的時間如果只能以這種手動方式進行SQL注入入侵的話那麼許多存在SQL注入漏洞的ASP網站會安全很多了不是漏洞不存在了而是利用這個漏洞入侵的成本太高了但是如果利用專門的黑客工具來入侵的話那情況就大大不同了手動方式進行SQL注入入侵至少需要半天或一天乃至很多天的時間而利用專門的工具來入侵就只需要幾分鐘時間了(視網速快慢決定)再利用獲得的管理帳號和密碼上傳一個從網上下載的ASP後門程序就輕易獲得整個網站的管理權限了甚至整個服務器的管理權限最有名的一種SQL注入入侵工具是NBSI 現在已經出到版本了不過人家正式名稱不叫SQL注入入侵工具而叫做網站安全漏洞檢測工具有了這個所謂的檢測工具使得入侵存在SQL注入漏洞的ASP網站成了小兒科的游戲那些既不懂ASP又不懂SQL年紀小小的男性青年常常得以在一天之內入侵十多個ASP網站他們以此獲得內心的極大滿足他們似乎也非常講究職業道德往往並不破壞網站數據和系統常見的破壞方式大都僅僅是改換掉網站的主頁留下善意的警告你的網站存在SQL注入漏洞請管理員做好防范措施!並聲明我沒有破壞數據和系統有的還要借機發布一下他的倡導國內網站大家不要入侵有本事入侵小日本的!最後簽上他的鼎鼎大名是必不可少的程序

  如此大的成就多數情況下僅需動動鼠標就做到了打開最新版的NBSI 如圖所示輸入地址到A區注意網址必須是帶傳遞參數的那種點擊右邊的檢測按鈕即出來B區信息顯示當前用戶為sonybb的權限為PUBLIC當前庫為lawjia有點可惜啊如果是SA權限的話就可以跨庫注入了不過這個權限也足夠獲取該網站管理員帳號和密碼了點C區下的自動猜解按鈕即出來當前庫lawjia中的各種表login表中一定是存管理員帳號和密碼的吧?選中它吧接著點擊D區下的自動猜解按鈕立即出來login表裡的列名稱果然是存放用戶名和密碼的啊太棒了!趕快打上勾迫不急待的點擊E區下的自動猜解按鈕激動人心的時刻就要到來啦只見唰唰地幾下帳號與密碼全部出來了剩下的事就是辨別哪一個帳號是管理員了


(圖中的示例網站在作者本地電腦上運行)

  不知那些沒注意過SQL注入漏洞的ASP程序員們看了上圖的例子要作何感想呢?是不是覺得這個所謂的網站安全漏洞檢測工具SBSI 簡直就是MS_SQL的企業管理器呢?只不過人家不需要帳號和密碼就可以查看您數據庫裡的所有信息了如果您的網站就這樣被人不費吹灰之力入侵了您是不是要吐幾升血了呢?也許您已經為系統安全費盡心思了裝補丁安防火牆裝殺毒軟件巧妙配置IIS及數據庫用戶權限但您就是沒有注意到SQL注入漏洞於是千裡之堤潰於蟻穴防火牆與殺毒軟件對SQL注入是沒辦法防范的因為SQL注入入侵跟普通的WEB頁面訪問沒什麼區別所以往往是防不甚防而且一個服務器上放置的網站往往是有很多個的服務器管理員不可能挨個網站挨個頁面的審查其是否存在SQL注入漏洞那麼應該如何防范SQL注入入侵呢?作為服務器管理員或網站程序員應該分別怎麼做呢?服務器管理員要做的事主要是配置IIS和數據庫用戶權限而網站程序員主要是要在程序代碼編寫上防范SQL注入入侵下面詳細敘述

  對了服務器管理員既然你不可能挨個檢查每個網站是否存在SQL注入漏洞那麼就來個一個絕招這個絕招能有效防止SQL注入入侵而且省心又省力效果真好!SQL注入入侵是根據IIS給出的ASP錯誤提示信息來入侵的如果你把IIS設置成不管出什麼樣的ASP錯誤只給出一種錯誤提示信息即http 錯誤那麼人家就沒辦法入侵了具體設置請參看圖主要把:這個錯誤的默認提示頁面 C:\WINDOWS\Help\iisHelp\common\asp改成
C:\WINDOWS\Help\iisHelp\common\htm即可這時無論ASP運行中出什麼錯服務器都只提示HTTP 錯誤


IIS出錯信息設置

  但是這樣設置一個不好的地方是程序員編寫的代碼出錯時服務器不給出詳細的錯誤提示信息會給程序員帶來很大的不便不過服務器畢竟不是測試代碼的地方應堅持安全穩定第一這樣設置也是無可厚非的事實上許多服務器的出錯信息都是如此設置

  服務器管理員還應在IIS中為每個網站設置好執行權限可千萬別給人家靜態網站以腳本和可執行權限一般情況下給個純腳本權限就夠了對於那些通過網站後台管理中心上傳的文件存放的目錄就更吝啬一點吧執行權限設為好了這樣做是為了防止人家上傳ASP木馬執行權限設為人家上傳ASP木馬也運行不了一般情況下SQL注入漏洞僅是涉及一個網站安全的事如果人家通過這個漏洞上傳了ASP木馬並運行起來那整個服務器都失陷了所以有遠見的有責任心的服務器管理員應該十分吝啬的配置IIS的執行權限

  同樣的吝啬態度應適用於數據庫用戶的權限配置上當然這裡數據庫是指MS_SQL啦ACCESS都沒有用戶權限配置這一步驟如果PUBLIC權限足夠使用的絕不給再高的權限可千萬別把SA級別的權限隨隨便便地給人家啊那個所謂的網站安全漏洞檢測工具NBSI 可有跨庫進行SQL注入的功能啊如果你把SA權限給了存在SQL注入漏洞的庫那其它庫就不保啦!城門失火殃及池魚呀而人家還可以通過調用xp_cmdshell命令得到系統的最高權限具體步驟還是請參看上面提到的那篇《SQL注入天書之ASP注入漏洞全接觸》這篇文章吧

  接下來要講講程序員的防范措施了程序主要要做兩件事最重要的一件事當然是對客戶端提交的變量參數進行仔細地檢測啦對客戶端提交的變量進行檢查以防止SQL注入有各種方法到http://communitycsdnnet/上搜索一下你能獲得許多有益信息這裡介紹一種現成的方法別人已經寫好了檢測代碼拿來用一下不用自己辛苦啦那就是楓葉SQL通用防注入V ASP版這是一段對用戶通過網址提交過來的變量參數進行檢查的代碼發現客戶端提交的參數中有execinsertselectdeletefromupdatecountuserxp_cmdshelladdnetAsc等用於SQL注入的常用字符時立即停止執行ASP並給出警告信息或轉向出錯頁面大家可以到網上搜索一下下載這段代碼存為一個ASP頁面如checkSQLasp把這個頁面include到每個需要帶參數查詢SQL數據庫ASP頁面中記住只要加一行這樣的<!#include file=checkSQLasp>代碼就行了

  程序員要做的第二件事是給用戶密碼加密啦比如用MD加密MD是沒有反向算法不能解密的人家即使知道經加密後存在數據庫裡的像亂碼一樣的密碼他也沒辦法知道原始密碼了不過人家可以用UPDATE方法用他的密碼代替你的密碼但這個操作還是有點麻煩人家可能會怕麻煩而放棄而那個所謂的網站安全漏洞檢測工具NBSI 是沒有提供UPDATE操作功能的所以用MD加密後人家僅用NBSI 而不輔以手動操作的話就不可能獲得網站管理員帳號的密碼這將擋住許多菜鳥級的攻擊者至少那些既不懂ASP又不懂SQL年紀小小的男性青年是沒有辦法啦!

  文章寫到這已經夠長了本來還想對那些所謂的網站安全漏洞檢測工具如NBSI之流的黑客工具進行一番理性的探討的看來還是放棄好了為了增強網站安全了解攻擊手段是必須的但是利用漏洞開發專門的黑客工具使那些其實並不具備必要的網絡技術和網絡安全知識的人(就是文中提到的既不懂ASP又不懂SQL年紀小小的男性青年)輕而易舉地侵入一家網站這除了為許多網絡管理員制造麻煩外是否還具有加強網絡安全意識提高網絡安全水平的功效呢?


From:http://tw.wingwit.com/Article/program/SQL/201311/16397.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.