SQL注入原理,值得一看!

2021-06-20 09:58:17 字數 3435 閱讀 2838

分類: sql

2013-07-25 14:16

88人閱讀收藏 

舉報sql注入原理,值得一看!

隨著b/s模式應用開發的發展,使用這種模式編寫應用程式的程式設計師也越來越多。但是由於這個行業的入門門檻不高,程式設計師的水平及經驗也參差不齊,相當大一部分程式設計師在編寫**的時候,沒有對使用者輸入資料的合法性進行判斷,使應用程式存在安全隱患。使用者可以提交一段資料庫查詢**,根據程式返回的結果,獲得某些他想得知的資料,這就是所謂的sql injection,即sql注入

sql注入是從正常的www埠訪問,而且表面看起來跟一般的web頁面訪問沒什麼區別,所以目前市面的防火牆都不會對sql注入發出警報,如果管理員沒檢視iis日誌的習慣,可能被入侵很長時間都不會發覺。

但是,sql注入的手法相當靈活,在注入的時候會碰到很多意外的情況。能不能根據具體情況進行分析,構造巧妙的sql語句,從而成功獲取想要的資料,是高手與「菜鳥」的根本區別。

根據國情,國內的**用asp+access或sqlserver的佔70%以上,php+mysq佔l20%,其他的不足10%。在本文,我們從分入門、高階至高階講解一下asp的1=1、1=2測試法了,怎麼判斷呢?看看上面三個**返回的結果就知道了:

可以注入的表現:

① 正常顯示(這是必然的,不然就是程式有錯誤了)

② 正常顯示,內容基本與①相同

③ 提示bof或eof(程式沒做任何判斷時)、或提示找不到記錄(判斷了rs.eof時)、或顯示內容為空(程式加了on error resume next)

不可以注入就比較容易判斷了,①同樣正常顯示,②和③一般都會有程式定義的錯誤提示,或提示型別轉換時出錯。

當然,這只是傳入引數是數字型的時候用的判斷方法,實際應用的時候會有字元型和搜尋型引數,我將在中級篇的「sql注入一般步驟」再做分析。

第三節、判斷資料庫型別及注入方法

不同的資料庫的函式、注入方法都是有差異的,所以在注入之前,我們還要判斷一下資料庫的型別。一般asp最常搭配的資料庫是access和sqlserver,網上超過99%的**都是其中之一。

怎麼讓程式告訴你它使用的什麼資料庫呢?來看看:

sqlserver有一些系統變數,如果伺服器iis提示沒關閉,並且sqlserver返回錯誤提示的話,那可以直接從出錯資訊獲取,方法如下:

and user>0

這句語句很簡單,但卻包含了sqlserver特有注入方法的精髓,我自己也是在一次無意的測試中發現這種效率極高的猜解方法。讓我看來看看它的含義:首先,前面的語句是正常的,重點在and user>0,我們知道,user是sqlserver的乙個內建變數,它的值是當前連線的使用者名稱,型別為nvarchar。拿乙個nvarchar的值跟int的數0比較,系統會先試圖將nvarchar的值轉成int型,當然,轉的過程中肯定會出錯,sqlserver的出錯提示是:將nvarchar值 」abc」 轉換資料型別為 int 的列時發生語法錯誤,呵呵,abc正是變數user的值,這樣,不廢吹灰之力就拿到了資料庫的使用者名稱。在以後的篇幅裡,大家會看到很多用這種方法的語句。

順便說幾句,眾所周知,sqlserver的使用者sa是個等同adminstrators許可權的角色,拿到了sa許可權,幾乎肯定可以拿到主機的administrator了。上面的方法可以很方便的測試出是否是用sa登入,要注意的是:如果是sa登入,提示是將」dbo」轉換成int的列發生錯誤,而不是」sa」。

如果伺服器iis不允許返回錯誤提示,那怎麼判斷資料庫型別呢?我們可以從access和sqlserver和區別入手,access和sqlserver都有自己的系統表,比如存放資料庫中所有物件的表,access是在系統表[msysobjects]中,但在web環境下讀該錶會提示「沒有許可權」,sqlserver是在表[sysobjects]中,在web環境下可正常讀取。

在確認可以注入的情況下,使用下面的語句:

and (select count(*) from sysobjects)>0

and (select count(*) from msysobjects)>0

如果資料庫是sqlserver,那麼第乙個**的頁面與原頁面是大致相同的;而第二個**,由於找不到表msysobjects,會提示出錯,就算程式有容錯處理,頁面也與原頁面完全不同。

如果資料庫用的是access,那麼情況就有所不同,第乙個**的頁面與原頁面完全不同;第二個**,則視乎資料庫設定是否允許讀該系統表,一般來說是不允許的,所以與原**也是完全不同。大多數情況下,用第乙個**就可以得知系統所用的資料庫型別,第二個**只作為開啟iis錯誤提示時的驗證。

(入門篇完)

說明:使用nbsi-nb聯盟sql注入分析器可以檢測出各種sql注入漏洞並進行解碼,提高猜解效率.

版權:本文是我的原創如何從資料庫中獲取想要獲得的內容,首先,我們先看看sql注入的一般步驟:

第一節、sql注入的一般步驟

首先,判斷環境,尋找注入點,判斷資料庫型別,這在入門篇已經講過了。

其次,根據注入引數型別,在腦海中重構sql語句的原貌,按引數型別主要分為下面三種:

(a) id=49 這類注入的引數是數字型,sql語句原貌大致如下:

select * from 表名 where 字段=49

注入的引數為id=49 and [查詢條件],即是生成語句:

select * from 表名 where 字段=49 and [查詢條件]

(b) class=連續劇 這類注入的引數是字元型,sql語句原貌大致概如下:

select * from 表名 where 字段=』連續劇』

注入的引數為class=連續劇』 and [查詢條件] and 『』=』 ,即是生成語句:

select * from 表名 where 字段=』連續劇』 and [查詢條件] and 『』=』』

(c) 搜尋時沒過濾引數的,如keyword=關鍵字,sql語句原貌大致如下:

select * from 表名 where 欄位like 』%關鍵字%』

注入的引數為keyword=』 and [查詢條件] and 『%25』=』, 即是生成語句:

select * from 表名 where欄位like 』%』 and [查詢條件] and 『%』=』%』

接著,將查詢條件替換成sql語句,猜解表名,例如:

id=49 and (select count(*) from admin)>=0

如果頁面就與id=49的相同,說明附加條件成立,即表admin存在,反之,即不存在(請牢記這種方法)。如此迴圈,直至猜到表名為止。

表名猜出來後,將count(*)替換成count(欄位名),用同樣的原理猜解欄位名。

有人會說:這裡有一些偶然的成分,如果表名起得很複雜沒規律的,那根本就沒得玩下去了。說得很對,這世界根本就不存在100%成功的黑客技術

SQL注入原理,值得一看!

sql注入原理,值得一看!隨著b s模式應用開發的發展,使用這種模式編寫應用程式的程式設計師也越來越多。但是由於這個行業的入門門檻不高,程式設計師的水平及經驗也參差不齊,相當大一部分程式設計師在編寫 的時候,沒有對使用者輸入資料的合法性進行判斷,使應用程式存在安全隱患。使用者可以提交一段資料庫查詢 ...

SQL注入原理,值得一看

隨著b s模式應用開發的發展,使用這種模式編寫應用程式的程式設計師也越來越多。但是由於這個行業的入門門檻不高,程式設計師的水平及經驗也參差不齊,相當大一部分程式設計師在編寫 的時候,沒有對使用者輸入資料的合法性進行判斷,使應用程式存在安全隱患。使用者可以提交一段資料庫查詢 根據程式返回的結果,獲得某...

值得一看的聊天技巧

泡妞是一門技術,可以更好的指引我們追求幸福。不提倡為了泡妞而泡妞的行為,玩弄拋棄mm是可恥的。害人有可能終害己哦,小心被死纏爛打。下面開始學習吧.mm 你幾歲?mm測試你 我 你猜?我給她乙個圈套 mm 我猜你26 mm跳進圈套 我 實際上我30 她先跳了,所以我再跳 mm 你幾歲?mm測試你 我 ...