SQL注入漏洞全接觸--進階篇

  第一節、SQL注入的通常步驟數據庫

  首先,判斷環境,尋找注入點,判斷數據庫類型,這在入門篇已經講過了。函數

  其次,根據注入參數類型,在腦海中重構SQL語句的原貌,按參數類型主要分爲下面三種:測試

  (A) ID=49 這類注入的參數是數字型,SQL語句原貌大體以下:編碼

  Select * from 表名 where 字段=49code

  注入的參數爲ID=49 And [查詢條件],便是生成語句:ci

  Select * from 表名 where 字段=49 And [查詢條件]unicode

  (B) Class=連續劇 這類注入的參數是字符型,SQL語句原貌大體概以下:字符串

  Select * from 表名 where 字段=’連續劇’string

  注入的參數爲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字段,首先,咱們取第一條記錄,測試長度:

  http://www.19cn.com/showdetail.asp?id=49 and (select top 1 len(username) from Admin)>0

  先說明原理:若是top 1的username長度大於0,則條件成立;接着就是>一、>二、>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之間,能夠用折半法加速猜解,若是寫成程序測試,效率會有極大的提升。

  第二節、SQL注入經常使用函數

  有SQL語言基礎的人,在SQL注入的時候成功率比不熟悉的人高不少。咱們有必要提升一下本身的SQL水平,特別是一些經常使用的函數及命令。

  Access:asc(字符) SQLServer:unicode(字符)

  做用:返回某字符的ASCII碼

  Access:chr(數字) SQLServer:nchar(數字)

  做用:與asc相反,根據ASCII碼返回字符

  Access:mid(字符串,N,L) SQLServer:substring(字符串,N,L)

  做用:返回字符串從N個字符起長度爲L的子字符串,即N到N+L之間的字符串

  Access:abc(數字) SQLServer:abc (數字)

  做用:返回數字的絕對值(在猜解漢字的時候會用到)

  Access:A between B And C SQLServer:A between B And C

  做用:判斷A是否界於B與C之間

  第三節、中文處理方法

  在注入中碰到中文字符是常有的事,有些人一碰到中文字符就想打退堂鼓了。其實只要對中文的編碼有所瞭解,「中文恐懼症」很快能夠克服。

  先說一點常識:

  Access中,中文的ASCII碼可能會出現負數,取出該負數後用abs()取絕對值,漢字字符不變。

  SQLServer中,中文的ASCII爲正數,但因爲是UNICODE的雙位編碼,不能用函數ascii()取得ASCII碼,必須用函數unicode ()返回unicode值,再用nchar函數取得對應的中文字符。

相關文章
相關標籤/搜索