官术网_书友最值得收藏!

2.2 欺騙是如何進行的

簡單說來,SQL注入(SQL Injection)攻擊,就是攻擊者通過往SQL的query中插入一系列的SQL語句,來操作數據寫入到應用程序中去,從而達到非法操作數據庫或網站程序的目的。但是攻擊者是如何提交自己的SQL欺騙語句的呢?

2.2.1 一個無名小站與一條典型SQL語句

對于一個普通的網站,用戶可以提交數據的地方很多,比如頁面登錄框、搜索框、文章發布、留言板、投票等,甚至一個簡單的網頁鏈接,都可能是用戶數據提交的途徑。而這些數據提交途徑,往往也會成為攻擊者提交自己欺騙性語句的入口點。這里,我們先來看看攻擊者是如何提交欺騙性的SQL攻擊語句的。

在Internet網上一個不知名小站,很不幸被攻擊者所選中,作為攻擊目標。在這個網站上,有一個小鎮的簡介文章,單擊打開這個文章的鏈接,可以看到小鎮的介紹信息(見圖2)。

這是一個很普通的網頁文章,但是卻會成為攻擊者提交欺騙性SQL語句的入口。看看文章的鏈接是這樣的:

            http://www.***.cn/gkml1/dwgk.asp? name=永寧鎮

表面上看來,這只是一個鏈接地址而已,而事實上,這是一個典型的用戶向數據庫提交數據的例子。這個鏈接對應的SQL操作指令,可以猜測其語句格式如下:

            Select name, article, address from gkml where name=’永寧鎮’

這是一條典型的SQL語句,表示從名為“gkml”的數據庫中,查詢“name”字段為“永寧鎮”的記錄,并顯示該記錄中的“name”、“article”及“address”等數據。正是這些查詢顯示的數據信息,構成了最終顯示的頁面結果。

圖2 小鎮信息介紹

這樣一條經典的語句,是如何被攻擊者所利用的呢?在上面的語句中,“永寧鎮”就是用戶提交的數據,而攻擊者時時可以通過修改這個數據進行攻擊,在這個查詢中注入一些SQL語句或字符,從而改變原來的整條SQL語句。例如,攻擊者可能會修改文章的鏈接為:

            http://www.***.cn/gkml1/dwgk.asp? name=永寧’鎮

那么,攻擊者就完成了一次修改后的數據提交,提交的數據是“永寧’鎮”,這個數據被作為“name”字段的值,進入原來的SQL語句中,從而改變了原來的SQL語句,變成如下:

            Select name, article, address from gkml where name=’永寧’鎮’

當數據庫試圖去執行這個查詢時,它將返回類似如下的錯誤(見圖3):

            Microsoft OLE DB Provider for SQL Server 錯誤 '80040e14'
            第 1 行: ’鎮’ 附近有語法錯誤。
            /gkml1/dwgk.asp,行 42

造成這種結果的原因是插入了單引號“' ”,作為定界符的單引號,改變了SQL語句的構成。數據庫管理系統嘗試去執行如下語句:

            Select name, article, address from gkml where name=’永寧’鎮’

圖3 修改提交數據出錯

由于其中有一個不閉合的單引號,這是不符合SQL語句規范的,因此執行失敗,返回了錯誤信息。

如果攻擊者再提交特別的參數,例如:“永寧鎮’; drop table authors-”,那么原來的SQL語句,就變成了如下形式:

            Select name, article, address from gkml where name=’永寧鎮’ ; dro
            p table authors--

可以看到,原來的一條SQL語句,現在經過攻擊者精心提交的數據,被修改成了兩條SQL語句。數據庫會在執行了正常的查詢之后,又執行攻擊者添加的另一條語句:

            drop table authors--

這條SQL語句執行的結果是,將數據庫中名為“authors”的表刪除。造成這種結果的原因,我們后面會詳細進行講解。此外,攻擊者還可以猜解數據庫中的用戶名和密碼等。

從上面的小例子可以看出,SQL注入式攻擊主要就是通過非法修改提交SQL查詢語句,達到猜解或破壞數據庫的目的。而網站給攻擊者所利用的數據提交入口,也是非常多的。

2.2.2 創建SQL注入檢測的數據庫平臺

當然,并非任意一個網站,都可以被攻擊者成功地進行入侵破壞,這往往取決于網站是否存在著SQL注入漏洞。在上面的例子中,也許攻擊所產生的效果并不是那么直觀,那么下面我們就來自己打造一個SQL注入攻擊的簡單實例。相信這個例子,可以讓讀者更加清楚地看到SQL注入攻擊的危害。

首先,需要搭建一個SQL注入攻擊的目標——數據庫。這里我們簡單地打造一個MS SQL數據庫作為攻擊目標。

常見的數據庫非常多,在本書后面的章節中,讀者將會經常碰到幾種最常見的數據庫,如Access數據庫、MS SQL、MySQL數據庫等。對于這幾種數據庫的創建及安裝與配置,都是必須了解熟悉的,可以為后面進行網站數據庫入侵檢測打下基礎。由于本書不是專門的數據庫著作,因此沒有將數據庫的安裝、創建及配置等作為獨立的章節列出,而是融合到相關的入侵章節中進行介紹。在介紹到相關的數據庫知識時,也希望讀者們用心學習。

MS SQL數據庫管理系統目前最新版本為MS SQL 2005,不過,目前應用最廣泛的還是SQL 2000版本。在Windows 2000中安裝SQL 2000版本是比較簡單的,但是在Windows XP系統中安裝SQL 2000企業版本時,會提示版本類型檢測不正確,要求安裝Windows Server版本。這里主要講一下如何在Windows XP系統中安裝SQL 2000企業版本。

首先,在SQL 2000服務器安裝光盤中,打開MSDE目錄,雙擊“setup.exe”程序,即可進行服務器商的安裝(圖4)。安裝過程很簡單,按照安裝向導,直接單擊【下一步】按鈕即可。如果在安裝過程中,出現“指定的實例名稱無效”的錯誤提示(圖5),則可刪除“C:\Program Files\Microsoft SQL Server”目錄下的所有文件,重新運行安裝程序即可。

重啟系統后,就可以看到SQL服務的圖標出現了。再通過SQL服務器版的安裝光盤,雙擊光盤根目錄下的“autorun.exe”工具,直接安裝客戶端工具。根據提示安裝,在自檢過程中會提示系統不是Server版,只安裝客戶端工具。

然后要求選擇安裝路徑,選擇“本地計算機”(圖6),單擊【下一步】按鈕,選擇“創建新的SQL Sever實例,或安裝‘客戶端工具’”(圖7)單選按鈕。然后設置姓名及單位,并選擇接受協議,再選擇“僅客戶端工具”單選按鈕(圖8)。

圖4 直接安裝服務端程序

圖5 安裝出錯信息

圖6 選擇安裝路徑

圖7 創建新的SQL Sever實例

圖8 安裝客戶端工具

然后要求選擇安裝組件(圖9),單擊【下一步】按鈕后完成文件的安裝復制。完成文件安裝復制后,在“運行”中輸入“regedit”命令,打開注冊表編輯器。找到[HKEY_LOCAL_MACHINE\SOFTWARE\MICROSOFT\MSSQLServer\MSSQLServer],這個項里面有一個鍵值LoginMode,默認值是1,現在將值改為2,重啟計算機。然后重啟系統即可(圖10)。

圖9 選擇安裝組件

圖10 修改注冊表驗證值

重啟系統后,單擊【開始】→【所有程序】→【Microsoft SQL Server】→【企業管理器】菜單命令,打開企業管理器工具。依次單擊左側欄中的“Microsoft SQL Servers”→“SQL Server組”,雙擊右邊窗口中的“Local”服務器,即可連接SQL Server了(圖11)。

圖11 使用企業管理器連接SQL Server

對于SQL Server配置,最重要的是連接的用戶密碼的修改。默認安裝的SA用戶為空密碼,需要手工進行修改設置。在“SQL Server企業管理器”下展開“安全性”→“登錄”,雙擊右邊窗口中的“sa”用戶(圖12),打開用戶設置對話框。在“密碼”框中,輸入新密碼,單擊【確定】按鈕,即可配置新密碼(圖13)。在“服務器角色”和“數據庫訪問”選項頁中,還可以設置數據庫訪問權限及其他詳細用戶設置。

圖12 設置sa用戶

圖13 修改sa密碼

MS SQL數據庫服務器建立成功后,已經內置默認了幾個數據庫及表。SQL Server 2000服務器安裝完畢后,默認會建立6個數據庫:master、model、msdb、tempdb、pubs和Northwind。MS SQL數據庫及表的建立主要通過SQL語句執行操作,這里使用MS SQL內置的“SQL查詢分析器”來執行SQL語句。

在默認的幾個數據庫中,pubs和Northwind數據庫為用戶數據庫,存儲的是實例數據,供DBA和開發人員練習使用。其余的4個數據庫為系統數據庫,用于SQL Server 2000服務器的系統管理使用。

master數據庫是SQL Server 2000中最重要的數據庫,存儲的是SQL Server 2000的系統信息,包括磁盤空間、文件分配和使用、系統級的配置參數、所有的登錄賬戶信息、初始化信息和其他數據庫的信息等。由于master數據庫對SQL Server 2000十分重要,所以禁止用戶的直接訪問,并確保在修改之前有完整的備份。這幾個默認的數據庫,我們在以后的入侵中會經常使用到,尤其是默認的master庫。

單擊【開始】→【所有程序】→【Microsoft SQL Server】→【查詢分析器】菜單命令,打開“SQL查詢分析器”。首先,輸入服務器連接賬號及密碼(圖14),單擊【確定】按鈕后連接上SQL Server。在中間窗口上方,就可以輸入SQL語句,單擊工具欄上的【執行】按鈕,即可執行SQL語句(圖15)。

圖14 SQL查詢分析器登錄

圖15 SQL語句執行窗口

在SQL查詢分析器窗口中,依次執行如下語句(圖16):

        Create database users
        use users
        CREATE TABLE USERS(USERNAME VARCHAR(20), PASSWORD VARCHAR(20))
        Insert into users values(' admin' ,123456)

圖16 執行SQL語句

執行后可建立一個名為“users”的數據庫,并在此數據庫中建立名為“users”的表。“users”表包含兩個字段,一個是“username”,另一個是“password”。并在“users”表中插入了一條數據:“username=admin, password=123456”,也就是說,用戶名為“admin”,登錄密碼為“123456”。

2.2.3 搭建一個SQL注入漏洞站點

下面,我們來通過一個簡單的ASP登錄頁面實例,分析SQL注入攻擊的原理。此ASP頁面功能用于提交用戶輸入的用戶名及密碼,并查詢數據庫中的用戶名與密碼,如果相符,則顯示登錄成功的提示;否則,提示登錄失敗。

我們已經建立了一個用于用戶登錄的數據庫及表、字段和值,該數據庫名為“users”,用戶名為“admin”,登錄密碼為“123456”。用記事本編寫一個提交表單頁的代碼,讓用戶輸入用戶名和密碼,代碼如下(源代碼見隨書光盤\Sample\ch2\1.2.3 SQL注入簡單實例.rar):

            <HTML>
            <HEAD>
            <TITLE>Login Page</TITLE>
            </HEAD>
            <BODY bgcolor='000000' text=' cccccc' >
            <FONT Face=' tahoma' color=' cccccc' >
            <CENTER><H1>Login</H1>
            <FORM action=' login.asp' method=post>
            <TABLE>
            <TR><TD>用戶名:</TD><TD><INPUT type=text name=username size=6
            2 width=50></TD></TR>
            <TR><TD>密   碼:</TD><TD><INPUT type=password name=password s
            ize=70 withd=50></TD></TR>
            </TABLE>
            <INPUT type=submit value=’登錄’><INPUT type=reset value=’重新
            登錄’>
            </FORM>
            </Font>
            </BODY>
            </HTML>

將上面的代碼保存為“login.html”。下面是“login.asp”的代碼,它是用來控制登錄的:

    <HTML>
    <BODY bgcolor='000000' text=' ffffff' >
    <FONT Face=' tahoma' color=' ffffff' >
    <STYLE>
    p { font-size=20pt ! important}
    font { font-size=20pt ! important}
    h1 { font-size=64pt ! important}
    </STYLE>
    <%@LANGUAGE = JScript %>
    <%
    function trace(str) {
    if(Request.form("debug") == "true")
    Response.write(str);
    }
    function Login(cn) {
    var username;
    var password;
    username = Request.form("username");
    password = Request.form("password");
    var rso = Server.CreateObject("ADODB.Recordset");
    var sql = "select * from users where username = ' " + username
    + "' and password = ' " + password + "' "; trace("query: " + sql
     );
    rso.open(sql, cn);
    if (rso.EOF) {
    rso.close();
    %>
    <FONT Face=' tahoma' color=' cc0000' >
    <H1> <BR>
    <CENTER>登錄失敗</CENTER>
    </H1>
    </BODY>
    </HTML>
    <% Response.end()
    return;
    }
    else {
    Session("username") = "" + rso("username");
    %>
            <FONT Face=' tahoma' color='00cc00' >
            <H1> <CENTER>登錄成功<BR>
            歡迎,<% Response.write(rso("Username")); Response.write( "</B
            ODY></HTML>" ); Response.end()
            return;
            }
            }
            function Main() {
            var username
            var cn = Server.createobject( "ADODB.Connection" );
            cn.connectiontimeout = 20;
            connstr = "Driver={SQL Server}; Server=(local); Database=user
            s; UID=sa; PWD=";
            cn.open(connstr);
            username = new String(Request.form("username"));
            if(username.length > 0) {
            Login(cn);
            }
            cn.close();
            }
            Main();
            %>

建立ASP服務器,在瀏覽器中打開“login.html”登錄頁面,要求輸入用戶名和密碼(圖17)。如果輸入正確的用戶名“admin”和密碼“123456”,那么會顯示“登錄成功,歡迎admin”的信息(圖18)。如果用戶名和密碼輸入錯誤,那么則會顯示“登錄失敗”的提示信息(圖19)。

圖17 登錄頁面

圖18 登錄成功

圖19 登錄失敗

2.2.4 第一次SQL注入攻擊測試

上面的這個網頁,表面上看起來沒有任何問題,可以正常地執行,輸入正確密碼就可以登錄,密碼錯誤則登錄失敗。但實際上,此網頁代碼中存在著嚴重的SQL注入漏洞。存在漏洞的代碼,是出現于“lgin.asp”中產生查詢語句的部分,代碼內容如下:

            Var sql="select * from users where username=' "+username+"' an
            d password=' "+password+"' ";

上面的這個SQL查詢語句沒有問題,但是其中的“username”和“password”參數值是由用戶提交的。程序沒有對用戶提交的值進行限制,因此攻擊者可以任意修改構造提交的參數值。假如用戶輸入的信息如下(圖20):

            Username:
            Password:' ; ' drop table users-

圖20 用戶名處輸入SQL注入語句

提交數據后,提示登錄失敗,但結果不僅如此,而是數據庫中表users將被刪除,此時再次輸入正確用戶名和密碼后,將提示如下信息(圖21):

圖21 數據庫中的表被刪除

            Microsoft OLE DB Provider for ODBC Drivers '80040e37'
            [Microsoft][ODBC SQL Server Driver][SQL Server]對象名 ' users'
            無效。
            \www\asp\login.asp, line 22

也就是說,此時用戶表被刪除后,將拒絕任何用戶登錄。這是因為在上面攻擊提交的數據中,“; ”符號表示一個查詢的結束和另一個查詢的開始;“--”連結符號,在Transact-SQL中表示忽略“--”之后的語句。通過“--”字符,就可使這個用戶名查詢終止,并且不返回錯誤。也就是說,經過用戶精心提交的參數,原來的SQL查詢語句就被修改為如下:

            Var sql="select * from users where username=' ; drop table users-

原來后面的“psssword”驗證部分直接被忽略掉了,而執行了“drop table users-”語句,雖然此時用戶無法進行登錄,但是導致數據庫中的users表被刪除掉。

另外,攻擊者可以只需提交一個已知的用戶名,就可以用任何用戶身份登錄。例如,攻擊者提交如下參數:

            Username:admin
            Password: 'or'1' ='1

即可直接以admin的身份登錄成功。造成這樣的結果,也是由于SQL注入攻擊漏洞引起的,這里僅是做一個演示,而具體原理將在后面的章節中進行詳細的解釋。

主站蜘蛛池模板: 葫芦岛市| 南皮县| 河北省| 临武县| 林口县| 和田县| 简阳市| 樟树市| 泾川县| 南康市| 工布江达县| 凤山县| 汾西县| 余姚市| 绵竹市| 乌什县| 白城市| 怀安县| 镇康县| 贵德县| 北京市| 涟源市| 汉源县| 渝北区| 息烽县| 遂宁市| 吴堡县| 浦县| 江口县| 隆回县| 佛山市| 竹山县| 同仁县| 连城县| 枞阳县| 张家口市| 三门县| 伊通| 西乌| 广元市| 上犹县|