學資料庫不得不了解的概念 SQL注入

2021-09-01 16:52:44 字數 4081 閱讀 9443

學資料庫不得不了解的概念:sql注入 

說明:使用nbsi-nb聯盟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%成功的黑客技術,蒼蠅不叮無縫的蛋,無論多技術多高深的黑客,都是因為別人的程式寫得不嚴密或使用者保密意識不夠,才有得下手。

有點跑題了,話說回來,對於sqlserver的庫,還是有辦法讓程式告訴我們表名及欄位名的,我們在高階篇中會做介紹。

最後,在表名和列名猜解成功後,再使用sql語句,得出欄位的值,下面介紹一種最常用的方法-ascii逐字解碼法,雖然這種方法速度很慢,但肯定是可行的方法。

我們舉個例子,已知表admin中存在username欄位,首先,我們取第一條記錄,測試長度:

;;and (select top 1 len(username) from admin)>0

先說明原理:如果top 1的username長度大於0,則條件成立;接著就是》1、>2、>3這樣測試下去,一直到條件不成立為止,比如》7成立,>8不成立,就是len(username)=8

當然沒人會笨得從0,1,2,3乙個個測試,怎麼樣才比較快就看各自發揮了。在得到username的長度後,用mid(username,n,1)擷取第n位字元,再asc(mid(username,n,1))得到ascii碼,比如:

id=49 and (select top 1 asc(mid(username,1,1)) from admin)>0

同樣也是用逐步縮小範圍的方法得到第1位字元的ascii碼,注意的是英文和數字的ascii碼在1-128之間,可以用折半法加速猜解,如果寫成程式測試,效率會有極大的提高。

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

據程式返回的結果,獲得某些他想得知的資料,這就是所謂的sql injection,即sql注入。

sql注入是從正常的www埠訪問,而且表面看起來跟一般的web頁面訪問沒什麼區別,所以目前市面的防火牆都不會對sql注入發出警報,如果管理員沒檢視iis日誌的習慣,可能被入侵很長時間都不會發覺。但是,sql注入的手法相當靈活,在注入的時候會碰到很多意外的情況。能不能根據具體情況進行分析,構造巧妙的sql語句,從而成功獲取想要的資料。

據統計,**用asp+access或sqlserver的佔70%以上,php+mysq佔l20%,其他的不足10%。在本文,以sql-server+asp例說明sql注入的原理、方法與過程。(php注入的文章由nb聯盟的另一位朋友zwell撰寫的有關文章)

sql注入攻擊的總體思路是:

發現sql注入位置;

判斷後台資料庫型別;

確定xp_cmdshell可執**況

發現web虛擬目錄

上傳asp木馬;

得到管理員許可權;

說明:使用nbsi-nb聯盟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%成功的黑客技術,蒼蠅不叮無縫的蛋,無論多技術多高深的黑客,都是因為別人的程式寫得不嚴密或使用者保密意識不夠,才有得下手。

有點跑題了,話說回來,對於sqlserver的庫,還是有辦法讓程式告訴我們表名及欄位名的,我們在高階篇中會做介紹。

最後,在表名和列名猜解成功後,再使用sql語句,得出欄位的值,下面介紹一種最常用的方法-ascii逐字解碼法,雖然這種方法速度很慢,但肯定是可行的方法。

我們舉個例子,已知表admin中存在username欄位,首先,我們取第一條記錄,測試長度:

;;and (select top 1 len(username) from admin)>0

先說明原理:如果top 1的username長度大於0,則條件成立;接著就是》1、>2、>3這樣測試下去,一直到條件不成立為止,比如》7成立,>8不成立,就是len(username)=8

當然沒人會笨得從0,1,2,3乙個個測試,怎麼樣才比較快就看各自發揮了。在得到username的長度後,用mid(username,n,1)擷取第n位字元,再asc(mid(username,n,1))得到ascii碼,比如:

id=49 and (select top 1 asc(mid(username,1,1)) from admin)>0

同樣也是用逐步縮小範圍的方法得到第1位字元的ascii碼,注意的是英文和數字的ascii碼在1-128之間,可以用折半法加速猜解,如果寫成程式測試,效率會有極大的提高。

不得不了解的優質幣

林奇簡介 歡迎加入linkey lky 林奇幣目前在bcex的eth交易區進行交易。從私募價0.68元,現在已到達1.6多元左右。未來值得期待!基本資訊 1.linkey基於區塊鏈底層技術支援下的金融一站式服務平台!落地應用正在逐步推進中!2.linkey總量1.95億,前期流通量5000萬,剩下的...

C 之不得不了解的 類模板

與函式模板基本一致 template classt1,class t2 class person include include using namespace std template class t1 string,classt2 int 看這裡 class person int main 請主...

Redis高階不得不了解的記憶體優化細節

宣告 本文內容來自 redis開發與運維 一書第八章。redis所有的資料都在記憶體中,而記憶體又是非常寶貴的資源。對於如何優化記憶體使用一直是redis使用者非常關注的問題。本文讓我們深入到redis細節中,學習記憶體優化的技巧。分為如下幾個部分 一.redisobject物件 二.縮減鍵值物件 ...