• <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-8-04 10:37 | 作者: 網絡轉載 | 來源: 測試時代采編 | 查看: 154次 | 進入軟件測試論壇討論

    領測軟件測試網

    隨著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注入攻擊的總體思路是:
    l 發現SQL注入位置;
    l 判斷后臺數據庫類型;
    l 確定XP_CMDSHELL可執行情況
    l 發現WEB虛擬目錄
    l 上傳ASP木馬;
    l 得到管理員權限;
    一、SQL注入漏洞的判斷
    一般來說,SQL注入一般存在于形如:HTTP://xxx.xxx.xxx/abc.asp?id=XX等帶有參數的ASP動態網頁中,有時一個動態網頁中可能只有一個參數,有時可能有N個參數,有時是整型參數,有時是字符串型參數,不能一概而論?傊灰菐в袇档膭討B網頁且此網頁訪問了數據庫,那么就有可能存在SQL注入。如果ASP程序員沒有安全意識,不進行必要的字符過濾,存在SQL注入的可能性就非常大。
    為了全面了解動態網頁回答的信息,首選請調整IE的配置。把IE菜單-工具-Inte.net選項-高級-顯示友好HTTP錯誤信息前面的勾去掉。
    為了把問題說明清楚,以下以HTTP://xxx.xxx.xxx/abc.asp?p=YY為例進行分析,YY可能是整型,也有可能是字符串。
    1、整型參數的判斷
    當輸入的參數YY為整型時,通常abc.asp中SQL語句原貌大致如下:
    select * from 表名 where 字段=YY,所以可以用以下步驟測試SQL注入是否存在。
    ①HTTP://xxx.xxx.xxx/abc.asp?p=YY’(附加一個單引號),此時abc.ASP中的SQL語句變成了
    select * from 表名 where 字段=YY’,abc.asp運行異常;
    ②HTTP://xxx.xxx.xxx/abc.asp?p=YY and 1=1, abc.asp運行正常,而且與HTTP://xxx.xxx.xxx/abc.asp?p=YY運行結果相同;
    ③HTTP://xxx.xxx.xxx/abc.asp?p=YY and 1=2, abc.asp運行異常;
    如果以上三步全面滿足,abc.asp中一定存在SQL注入漏洞。
    2、字符串型參數的判斷
    當輸入的參數YY為字符串時,通常abc.asp中SQL語句原貌大致如下:
    select * from 表名 where 字段='YY',所以可以用以下步驟測試SQL注入是否存在。
    ①HTTP://xxx.xxx.xxx/abc.asp?p=YY’(附加一個單引號),此時abc.ASP中的SQL語句變成了
    select * from 表名 where 字段=YY’,abc.asp運行異常;
    ②HTTP://xxx.xxx.xxx/abc.asp?p=YY&nb ... 39;1'='1', abc.asp運行正常,而且與HTTP://xxx.xxx.xxx/abc.asp?p=YY運行結果相同;
    ③HTTP://xxx.xxx.xxx/abc.asp?p=YY&nb ... 39;1'='2', abc.asp運行異常;
    如果以上三步全面滿足,abc.asp中一定存在SQL注入漏洞。
    3、特殊情況的處理
    有時ASP程序員會在程序員過濾掉單引號等字符,以防止SQL注入。此時可以用以下幾種方法試一試。
    ①大小定混合法:由于VBS并不區分大小寫,而程序員在過濾時通常要么全部過濾大寫字符串,要么全部過濾小寫字符串,而大小寫混合往往會被忽視。如用SelecT代替select,SELECT等;
    ②UNICODE法:在IIS中,以UNICODE字符集實現國際化,我們完全可以IE中輸入的字符串化成UNICODE字符串進行輸入。如+ =%2B,空格=%20 等;URLEncode信息參見附件一;
    ③ASCII碼法:可以把輸入的部分或全部字符全部用ASCII碼代替,如U=chr(85),a=chr(97)等,ASCII信息參見附件二;

    二、區分數據庫服務器類型
    一般來說,ACCESS與SQL-SERVER是最常用的數據庫服務器,盡管它們都支持T-SQL標準,但還有不同之處,而且不同的數據庫有不同的攻擊方法,必須要區別對待。
    1、 利用數據庫服務器的系統變量進行區分
    SQL-SERVER有user,db_name()等系統變量,利用這些系統值不僅可以判斷SQL-SERVER,而且還可以得到大量有用信息。如:
    ① HTTP://xxx.xxx.xxx/abc.asp?p=YY and user>0 不僅可以判斷是否是SQL-SERVER,而還可以得到當前連接到數據庫的用戶名
    ②HTTP://xxx.xxx.xxx/abc.asp?p=YY&n ... db_name()>0 不僅可以判斷是否是SQL-SERVER,而還可以得到當前正在使用的數據庫名;
    2、利用系統表
    ACCESS的系統表是msysobjects,且在WEB環境下沒有訪問權限,而SQL-SERVER的系統表是sysobjects,在WEB環境下有訪問權限。對于以下兩條語句:
    ①HTTP://xxx.xxx.xxx/abc.asp?p=YY and (select count(*) from sysobjects)>0
    ②HTTP://xxx.xxx.xxx/abc.asp?p=YY and (select count(*) from msysobjects)>0
    若數據庫是SQL-SERVE,則第一條,abc.asp一定運行正常,第二條則異常;若是ACCESS則兩條都會異常。

    3、 MSSQL三個關鍵系統表
    sysdatabases系統表:Microsoft SQL Server 上的每個數據庫在表中占一行。最初安裝 SQL Server 時,sysdatabases 包含 master、model、msdb、mssqlweb 和 tempdb 數據庫的項。該表只存儲在 master 數據庫中。 這個表保存在master數據庫中,這個表中保存的是什么信息呢?這個非常重要。他是 保存了所有的庫名,以及庫的ID和一些相關信息。
    這里我把對于我們有用的字段名稱和相關說明給大家列出來。name //表示庫的名字。
    dbid //表示庫的ID,dbid從1到5是系統的。分別是:master、model、msdb、mssqlweb、tempdb 這五個庫。用select * from master.dbo.sysdatabases 就可以查詢出所有的庫名。

    Sysobjects:SQL-SERVER的每個數據庫內都有此系統表,它存放該數據庫內創建的所有對象,如約束、默認值、日志、規則、存儲過程等,每個對象在表中占一行。以下是此系統表的字段名稱和相關說明。
    Name,id,xtype,uid,status:分別是對象名,對象ID,對象類型,所有者對象的用戶ID,對象狀態。
    對象類型(xtype)?梢允窍铝袑ο箢愋椭械囊环N:
    C = CHECK 約束
    D = 默認值或 DEFAULT 約束
    F = FOREIGN KEY 約束
    L = 日志
    FN = 標量函數
    IF = 內嵌表函數
    P = 存儲過程
    PK = PRIMARY KEY 約束(類型是 K)
    RF = 復制篩選存儲過程
    S = 系統表
    TF = 表函數
    TR = 觸發器
    U = 用戶表
    UQ = UNIQUE 約束(類型是 K)
    V = 視圖
    X = 擴展存儲過程
    當xtype='U' and status>0代表是用戶建立的表,對象名就是表名,對象ID就是表的ID值。
    用: select * from ChouYFD.dbo.sysobjects where xtype='U' and status>0 就可以列出庫ChouYFD中所有的用戶建立的表名。

    syscolumns :每個表和視圖中的每列在表中占一行,存儲過程中的每個參數在表中也占一行。該表位于每個數據庫中。主要字段有:
    name ,id, colid :分別是字段名稱,表ID號,字段ID號,其中的 ID 是 剛上我們用sysobjects得到的表的ID號。
    用: select * from ChouYFD.dbo.syscolumns where id=123456789 得到ChouYFD這個庫中,表的ID是123456789中的所有字段列表。

    延伸閱讀

    文章來源于領測軟件測試網 http://www.kjueaiud.com/

    TAG: sql SQL Sql 攻擊

    21/212>

    關于領測軟件測試網 | 領測軟件測試網合作伙伴 | 廣告服務 | 投稿指南 | 聯系我們 | 網站地圖 | 友情鏈接
    版權所有(C) 2003-2010 TestAge(領測軟件測試網)|領測國際科技(北京)有限公司|軟件測試工程師培訓網 All Rights Reserved
    北京市海淀區中關村南大街9號北京理工科技大廈1402室 京ICP備10010545號-5
    技術支持和業務聯系:info@testage.com.cn 電話:010-51297073

    軟件測試 | 領測國際ISTQBISTQB官網TMMiTMMi認證國際軟件測試工程師認證領測軟件測試網

    老湿亚洲永久精品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>