熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> SQL Server >> 正文

SQL注入步驟和常用函數以及中文處理方法

2013-11-15 14:35:55  來源: SQL Server 

  第一節SQL注入的一般步驟
  首先判斷環境尋找注入點判斷數據庫類型這在入門篇已經講過了
  
  其次根據注入參數類型在腦海中重構SQL語句的原貌按參數類型主要分為下面三種
  
  (A) ID= 這類注入的參數是數字型SQL語句原貌大致如下
  Select * from 表名 where 字段=
  注入的參數為ID= And [查詢條件]即是生成語句
  Select * from 表名 where 字段= 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 %= 即是生成語句
  Select * from 表名 where字段like % and [查詢條件] and %=%
  
  接著將查詢條件替換成SQL語句猜解表名例如
  
  ID= And (Select Count(*) from Admin)>=
  
  如果頁面就與ID=的相同說明附加條件成立即表Admin存在反之即不存在(請牢記這種方法)如此循環直至猜到表名為止
  
  表名猜出來後將Count(*)替換成Count(字段名)用同樣的原理猜解字段名
  
  有人會說這裡有一些偶然的成分如果表名起得很復雜沒規律的那根本就沒得玩下去了說得很對這世界根本就不存在%成功的黑客技術蒼蠅不叮無縫的蛋無論多技術多高深的黑客都是因為別人的程序寫得不嚴密或使用者保密意識不夠才有得下手
  
  有點跑題了話說回來對於SQLServer的庫還是有辦法讓程序告訴我們表名及字段名的我們在高級篇中會做介紹
  
  最後在表名和列名猜解成功後再使用SQL語句得出字段的值下面介紹一種最常用的方法-Ascii逐字解碼法雖然這種方法速度很慢但肯定是可行的方法
  
  我們舉個例子已知表Admin中存在username字段首先我們取第一條記錄測試長度
  
  ?id= and (select top len(username) from Admin)>
  
  先說明原理如果top 的username長度大於則條件成立接著就是>>>這樣測試下去一直到條件不成立為止比如>成立>不成立就是len(username)=
  
  當然沒人會笨得從一個個測試怎麼樣才比較快就看各自發揮了在得到username的長度後用mid(usernameN)截取第N位字符再asc(mid(usernameN))得到ASCII碼比如
  
  id= and (select top asc(mid(username)) from Admin)>
  
  同樣也是用逐步縮小范圍的方法得到第位字符的ASCII碼注意的是英文和數字的ASCII碼在之間可以用折半法加速猜解如果寫成程序測試效率會有極大的提高
  
  第二節SQL注入常用函數
  有SQL語言基礎的人在SQL注入的時候成功率比不熟悉的人高很多我們有必要提高一下自己的SQL水平特別是一些常用的函數及命令
  
  Accessasc(字符) SQLServerunicode(字符)
  作用返回某字符的ASCII碼
  
  Accesschr(數字) SQLServernchar(數字)
  作用與asc相反根據ASCII碼返回字符
  
  Accessmid(字符串NL) SQLServersubstring(字符串NL)
  作用返回字符串從N個字符起長度為L的子字符串即N到N+L之間的字符串
  
  Accessabc(數字) SQLServerabc (數字)
  作用返回數字的絕對值(在猜解漢字的時候會用到)
  
  AccessA between B And C SQLServerA between B And C
  作用判斷A是否界於B與C之間
  
  第三節中文處理方法
  在注入中碰到中文字符是常有的事有些人一碰到中文字符就想打退堂鼓了其實只要對中文的編碼有所了解中文恐懼症很快可以克服
  
  先說一點常識
  
  Access中中文的ASCII碼可能會出現負數取出該負數後用abs()取絕對值漢字字符不變
  
  SQLServer中中文的ASCII為正數但由於是UNICODE的雙位編碼不能用函數ascii()取得ASCII碼必須用函數unicode ()返回unicode值再用nchar函數取得對應的中文字符
  
  了解了上面的兩點後是不是覺得中文猜解其實也跟英文差不多呢?除了使用的函數要注意猜解范圍大一點外方法是沒什麼兩樣的
From:http://tw.wingwit.com/Article/program/SQLServer/201311/22039.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.