www国产黄色_天堂一区二区三区_亚洲图片一区二区_欧美日本不卡

首頁 > 網站 > 安全策略 > 正文

SQL 注入技術詳解

2020-04-09 20:02:04
字體:
來源:轉載
供稿:網友

1.1概述

1.2背景

1.3字符編碼

2.1綜合測試

2.2測試過程

2.3分析結果

3.1繞過驗證

3.2 SELECT

3.2.1 直接利用 號3.2.2 基于UNION3.2.3 利用結構錯誤查詢表單3.2.4 插入語句(圓擴號)3.2.5 利用LIKE語句查詢3.2.6 "死胡同"3.2.7 列的數目不匹配問題3.2.8 附加的WHERE引號表和域的枚舉3.2.10 單括號

3.3插入

3.4SQL服務器存儲過程利用

4.1數據處理

4.2安全的SQL網頁應用程序編寫

5.1MS SQL Server

5.2MS Access Server

5.3 Oracle關于 SPI Dynamics,INc.

一 概述和介紹

1.網絡應用和SQL注射

1.1概述

有些網絡數據庫沒有過濾客戶提供的數據中可能有害的字符,SQL注射就是利用插入有害字符進行攻擊的技術。盡管非常容易防范,但因特網上仍然有驚人數量的存儲系統容易受到這種攻擊。這篇文章的目的是指導專業安全組織了解這種技術,并告訴他們正確的,用來防范SQL注射的辦法,以及處理各種常見的,由于非法輸入引起的問題.

1.2背景

在讀這篇文章之前,你應該對數據庫如何工作,以及SQL如何被用來訪問數據庫有一些基礎的了解。我建議您閱讀eXtropia.com的文章“Introduction to Databases for WebDevelopers”。(網址:http://www.extropia.com/tutorials/sql/toc.html)

1.3字符編碼

在大多數的網絡瀏覽器中,標點符號和許多其它符號在用于一個網絡請求前需要把URL編碼,以便被適當地編譯(interpret)。在本文中的例子和截圖中我使用了固定的ASCII字符以保證最大的可讀性。然而,在實際應用中,你需要在HTTP請求中用%25來代替百分號(%),用%2B來代替加號(+)等等。。。

2.易損性的測試(Testing for vulnerability)

2.1綜合測試

徹底地檢測一個網絡請求是否容易被SQL注射比一個可能的猜測(might guess)需要耗費更多的精力。當你把一個單引號放進一個腳本的第一個參數值時,服務器返回一個空白的網頁,上面除了ODBC錯誤以外什么都沒有.顯然這種情況直接反映出web程序存在漏洞,但通常都不是這樣的,如果你沒有注意細節的話,很容易忽略掉一個看上去完美,其實很脆弱的腳本。服務器上每一個腳本中的每一個參數都應該被檢測。開發者和開發組織之間可能很不一致。設計腳本A的程序員也許和腳本B的開發毫無關系,所以,其中一個也許對SQL注射免疫,而另外一個可能不會。事實上,設計腳本A里的函數A的程序員也許和腳本A里的函數B的開發毫無關系,所以腳本A里的一個參數也許對SQL注射是脆弱的,而另外一個參數卻不一定,即使整個網絡請求是由一個程序員來構想,設計,編寫及測試的,在成千上萬的腳本中的參數中,由于某種原因,設計者忘了檢驗某個地方的數據,所以仍有可能存在一個脆弱的參數,而且那個地方是唯一的,你永遠都不能確定是哪里,所以必須測試所有的東西。

2.2測試過程

用一個單引號和一個SQL關鍵字(比如“WHERE”)替代每一個參數的值(argument),每個參數都應該被單獨地測試,不止那樣,當你測試一個參數的時候,應該保持其它的參數不變,并用有效的數據填充它們的值(argument),It can be tempting to just delete all of the stuff that youre not working with in order to make things look simpler, particularly with applications that have parameter lines that go into many thousands of characters.當你測試一個參數是否能被SQL注射的時候,如果忽略了其它參數或者給他們一個錯誤的值(argument),網絡請求就有可能由于其它原因而出錯,這阻礙了你判斷SQL注射是否可行。比如,讓我們假設以下是一個有效的,純粹的(unaltered)參數行:

ContactName=Maria%20Anders&CompanyName=Alfreds%20Futterkiste

并且它返回一個ODBC錯誤:ContactName=Maria%20Anders&CompanyName=%20OR

如果我們這樣檢測:CompanyName=

可能只會給你一個錯誤告訴你需要指定一個ContactName值。這行:ContactName=BadContactName&CompanyName=

可能返回同樣的頁面,因為請求根本沒有指定ContactName。或者,它可能返回你站點默認的主頁。或者,可能它找不到指定的ContactName,或者web程序認為沒有必要看CompanyName,所以它甚至根本不把這個參數值認為是一個SQL聲明,或者,它可能給你一些完全不同的東西,所以,當檢測SQL注射的時候,記得總是用完整的參數行,并且除了你正在檢測的那個參數外,還要給其它所有的參數一個合法的值。

2.3分析結果

如果你得到一個數據庫服務器返回的某些錯誤信息,那么SQL注射顯然是存在的.然而,數據庫錯誤信息不一定總是明顯的(有時候編寫程序的人可能做一些奇怪的事情),所以,你應該順便看看每個可能的地方來確認注射是否成功,首先你應該從返回的頁面上的所有資源中找尋像"ODBC", "SQL Server", "Syntax"等的短語,更多的信息可能含在HTTP的頭部,隱藏的輸入...。我曾見過某些存儲系統上的網絡請求返回的錯誤信息中,在HTTP回復的body中完全沒有任何信息,但在頭部中卻有數據庫錯誤信息。為了調試和QA的目的,很多網絡請求都內嵌了這種特征,然而到最后發表前卻忘了把它們去處掉或使之無效。你不只要注意即時返回的頁面,同樣鏈接頁面也要看,在最近的一次pen-test中,我看到一個網絡請求被SQL注射攻擊后,返回了一個類錯誤信息頁面,點擊錯誤旁邊的停止標志圖片,鏈接到了另外一個滿是SQL服務器錯誤信息的頁面。另一個應該密切注意的是302頁面重定向,在你有機會注意到它之前,你可能就無奈的離開了一個含有數據庫錯誤信息的頁面.請注意即使你真的得到了一個ODBC錯誤信息回復,SQL注射仍有可能成功,很多時候(Lots of the time)你得到一個properly formatted, seemingly類錯誤消息頁面,告訴你"an internal server error" 或者 "problem processing your request."有些網絡請求被設計成一旦出現任何的錯誤,客戶都返回到站點的主頁面。如果你得到一個500錯誤頁面,很有可能注射就出現了,很多站點都有一個默認的500服務器內部錯誤頁面來說明服務器正在維護中,或禮貌的讓用戶把他們的請求email給站點的維護人員。這就有可能用procedure techniques來利用這些站點,這將在后面討論。

3.攻擊

3.1繞過驗證

最簡單的SQL注射技術是繞過基于表單的登陸.讓我們假設某個網絡請求的代碼如下:SQLQuery = "SELECT Username FROM Users WHERE Username = " & strUsername & " AND Password = " & strPassword & "" strAuthCheck = GetQueryResult(SQLQuery) If strAuthCheck = "" ThenboolAuthenticated = False Else boolAuthenticated = True End If當一個用戶提交了一個用戶名和密碼后,查詢(query)將搜索Users表單來看是否其中有一行中所包含的用戶名和密碼與用戶提供的相同,如果找到了那么一行,則用戶名被儲存到變量strAuthCheck中,同時說明該用戶應該被鑒定,如果沒有找到那么一行,則strAuthCheck變量保持為空,同時該用戶不被鑒定。如果strUsername和strPassword變量可以包含任何你要的字符,你可以修改當前的SQL查詢結構,那樣即使你不知道有效的用戶名和密碼,你仍何以得到一個有效的name,它是如何實現的呢?讓我們假設用戶像下面那樣填充了一個登陸表單:Login: OR = Password: OR =這將給SQLQuery以下值:SELECT Username FROM Users WHERE Username = OR = AND Password = OR =請求并不把用戶提交的數據與現存的Users表單做比較,而是直接比較和,顯然它總是返回true,(注意nothing和null是有區別的)由于WHERE語句中的所有驗證條件都符合了,用戶名將使用表單中搜索到的第一行中的那個,接著用戶名將被傳遞給變量strAuthCheck,這樣我們的效力就得以保證。使用single result cycling技術,也有可能使用另外一行的數據,這將在以后討論。

3.2 SELECT對于另一些情況而言,你必須根據查詢那些有缺陷的web程序返回的結果,來判斷和調整你提交的SQL查詢字符串,以便搞定服務器.

3.2.1 直接利用單引號你將面臨的第一個錯誤是語句結構錯誤.一個結構錯誤表明SQL查詢的語句結構存在缺陷.首先你應該明白,在沒有編碼引號的情況下, 插入腳本攻擊是否可以成功.

直接SQL注射的時候,無論你提交什么語句都會被不加任何改變地應用于SQL查詢中.試著提交參數的時候,先輸入合法的值,然后在其后添加一個空格和一個OR,如果服務器產生了錯誤,那么直接SQL注射是可能的.提交的值可以是任何WHERE子句中用到的值,例如:SQLString = "SELECT FirstName, LastName, Title FROM Employees WHERE Employee = " & intEmployeeID或者是緊跟于一個SQL關鍵字,例如表名或者表里的欄目名,比如SQLString = "SELECT FirstName, LastName, Title FROM Employees ORDER BY " & strColumn所有其他的例子都是引號注射,在一個存在引號插入漏洞的程序里面, 任何一個你提交的參數,系統都會在前面和后面添加一個引號,就像這樣:SQLString = "SELECT FirstName, LastName, Title FROM Employees WHERE EmployeeID = " & strCity & ""為了能(break out)打破這引號,并偽造一個正確的查詢,在你的SQL注射字符串中的SQL關鍵字之前必須包含一個單引號,而且在WHERE子句的后面也需要加上一個單引號.現在我們來談談"欺騙"的問題.是的,SQL SERVER會忽視在";--"后面的任何東西,但是只有MS的SQL SERVER會這樣做.我們最好學習如何處理這個問題,這樣我們在面對Oracle,DB/2,MySQL 和他種類的數據庫服務器的時候就知道怎么做了.<<<<<<<<<<<<<<圖1>>>>>>>>><<<<<<<<<<圖2>>>>>>>>>>>>>>>>>>>>>>>>>>

SELECT查詢被用于從數據庫中獲取信息.大多數的web應用程序通過SELECT向數據庫獲取信息候再動態地在頁面上顯示出來.通常,數據庫查詢這部分你可以自己偽造,他將成為WHERE子句的一部分.我們可以通過插入UNION SELECT來繞過web程序允許我們查詢的數據,從而得到其它的數據.聯合查詢(指UNION SELECT)允許在一條語句中使用多個SELECT查詢,看上去就像這樣:SELECT CompanyName FROM Shippers WHERE 1 = 1 UNION ALL SELECT CompanyName FROM Customers WHERE 1 = 1它返回的結果中包含了第一個查詢和第二個查詢的結果,"ALL SELECT"這里的ALL是必須的,這樣可以逃過SELECT DISTINCT語句的限制并且不會妨礙別的(??),所以最好是使用它.你必須確認第一個查詢,即web應用程序編寫者希望執行的那個被執行,不返回任何記錄.這并不難.舉個例子,有這么一個表達式:SQLString = "SELECT FirstName, LastName, Title FROM Employees WHERE City = " & strCity & ""我們構造如下的插入串: UNION ALL SELECT OtherField FROM OtherTable WHERE =這將導致如下的SQL查詢語句被提交給SQL SERVER:SELECT FirstName, LastName, Title FROM Employees WHERE City = UNION ALL SELECT OtherField FROM OtherTable WHERE =讓我們看看會發生什么:數據庫搜索Employees表,查找City被設置為NULL的那一行,由于它找不到哪一行city是NULL,所以它不會返回任何記錄,只有我們inject的查詢才會返回記錄.在一些情況下,使用NULL不能成功,因為表里的卻存在有NULL的項.在這種情況下,你要做的就是構造一個表中不存在的值,你只要輸入一些不普通的值...最好是對照那些正常的值,當數據庫需要一個自然數時,0或者負數都工作得很好,對于一個文本參數,簡單的用"NoSuchRecord","NotInTable"或更常見的"sjdajdhajsh",只要它不返回記錄就好.如果所有的web應用程序使用的SQL查詢都像上面這些那么簡單就好了,可惜這不可能: ].按照各個編程者習慣和查詢表達式編寫方式的不同,你SQL注射時可能會遇到各種困難.

3.2.3 利用結構錯誤查詢表單一些數據庫服務器返回的錯誤信息中包含了一部分格式錯誤消息,你可以通過分析這些片斷來構造你提交的INJECTION語句,有些你提交的字符串會返回有用的信息,有的卻不會,這主要是以來于web應用程序中SQL查詢語句是如何設計的.下面這些是我推薦你嘗試的字符串:BadValueBadValue OR OR;9,9,9通常這些字符串中的一些會返回相同的信息,或者根本不返回信息.但是有例子告訴我們,可能有的信息只有用他們中的一個才能得到,所以你最好提交字符串的時候,把他們都試一遍.<<<<<<圖3.2.4>>>>>>(2張圖)

3.2.4 圓擴弧如果有缺陷的查詢語句中包含圓擴弧( (就像下面將會舉的例子那樣),或者返回的錯誤信息里顯式地提醒你缺了(號(Oracle這么做),那么你應該在你提交的SQL注射字符串中加入(號.通常在WHERE子句后面加一個括號,但是在一些情況下,你需要加2個或者更多的括號.下面是parenthesis.asp的源碼:mySQL="SELECT LastName, FirstName, Title, Notes, Extension FROM Employees WHERE (City = " & strCity & ")"我們插入如下的值:") UNION SELECT OtherField FROM OtherTable WHERE (="那么傳送給SQL SERVER的語句就變成了這樣:SELECT LastName, FirstName, Title, Notes, Extension FROM Employees WHERE (City = ) UNION SELECT OtherField From OtherTable WHERE (=)

3.2.5 LIKE語句查詢<<<<<<<<<圖2張>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>另一個大的災難是陷入一個LIKE子句的陷阱.(Seeing the LIKE keyword or percent signs cited in an error message are indications of this situation.)大多數的web搜索程序使用LIKE子句來查詢數據庫,比如下面這個:SQLString = "SELECT FirstName, LastName, Title FROM Employees WHERE LastName LIKE %" & strLastNameSearch & "%"這里面的%是通配符,在這個例子里,WHERE子句會返回TRUE,只要LASTNAME里有字符串含有strLastNameSearch.為了阻止SQL SERVER返回預計中的記錄,你構造的SQL語句里必須含有LASTNAME里沒有的字符串.web搜索程序搜索的字符串來自于用戶的輸入.通常有一個和一個%在輸入的字符串之前,因此我們構造字符串時,需要在WHERE子句中匹配它們.如果你提交了NULL作為搜索字符串,那么LIKE的參數會變成"%%",這是一個全匹配,會返回所有的記錄.

3.2.6 “死胡同”大部分的時候sql injection都要伴隨著大量失敗的實踐,如果你發現你無論如何都不能插入相關的語句,并且無論你怎么做都不對,這個時候你就要判斷自己是否掉進了一個死胡同,很多時候遇到這種情況你很可能是在一個多重嵌套的WHERE和SELECT子句的語句中,或者一些更加復雜的多重嵌套,連使用“;--”都沒有用,所以自己要小心和避免在這種地方停留。

3.2.7 列的數目不匹配問題如圖所示,我們可以從幾次錯誤中得到很多有用的信息,并且加以調整自己的請求語句,這種信息多了,那就意味著我們離成功不遠了。在猜列名時,如圖所示,我們提交語句后會碰到以下錯誤“在UNION語句中的所有查詢都必須在目標列表中具有相同數目的表達式”,這就是說你需要找出或者說是探測出在合法的請求中有多少個列。這里我解釋一下,UNION 語句是用來將兩個不同的查詢結果集相加得到一個結果集,UNION使用的唯一要求是兩個查詢的信息(你的查詢語句)必須有相同的列數和相同的數據類型

我舉個例子,web程序中有如下語句:SQLstring= "SELECT FirstName,LastName,EmployeeID FROM Employees WHERE City ="&strCity""合法的SELECT語句和我們注入的UNION SELECT語句在WHERE子句中都要有相同的列。就上面的語句來說,如果我要加入UNION 語句的話,前后兩者都要有3個列。并且他們列的數據類型也要相互匹配才可以。(見圖)如果FirstName這個值是字符串類型的,那么在你注入的語句中所對應的值也應該是字符串類型的。一些數據庫,如ORACLE,是對類型檢查非常嚴格的。其他的數據庫相對要好一些,允許你輸入任何數據類型并且它會自動的把你輸入錯誤的數據類型轉換成正確的。比如SQL數據庫中,你在varchar類型的地方輸入數值類型的數據(如int)是不會報錯的,因為在這里數值類型會被自動轉為字符串類型。但是如果在smallint列處輸入text類型則被認為是非法的,因為text類型不能被轉換成int類型。把數值類型的數據轉換成字符串型是被允許的,而反之則不行,所以默認都是使用數值類型的數據。

要想知道我們要注入的目標語句中有多少個列,你就要試探性的往UNION SELECT子句中添加相應的值,直到它不報“在UNION語句中的所有查詢都必須在目標列表中具有相同數目的表達式”這樣的錯為止。如圖所示,如果你遇到的是數據類型不匹配的錯誤,那么你要去改變列的數據類型。如果返回消息只是一個轉換數據類型失敗的錯誤,那就說明你已經猜對了列的數目,只是其中有個別的列的數據類型不對。那么接下來要做的就是判斷是哪個列的數據類型的不正確導致的錯誤。然后將他改過來就可以了。如果一切順利,那么祝賀你,你會得到一個和上面格式類似的而且是合法的頁面;)無論動態頁面在哪里出現,你都可以構造自己的語句應對自如。

3.2.8.WHERE關鍵字如圖所示,報錯為“無效的列名EmployeeID”,這個問題可能是由我們注入的語句結尾的WHERE關鍵字引起的,舉例說明:SQLString="SELECT FirstName,LastName,Title FROM Employees WHERE City="&strcity&"AND Country =USA"如果我們注入的語句是UNION ALL SELECT OtherField FROM OtherTable WHERE 1=1 那么會得到如下的提交語句:SELECT FirstName, LastName, Title FROM Employees WHERE City = NoSuchCity UNION ALL SELECT OtherField FROM OtherTable WHERE 1=1 AND Country = USA這樣就會報錯:[Microsoft][ODBC SQL Server Driver][SQL Server]無效的列名 Country。其實問題就是因為你注入的語句后,系統沒有在從數據庫的表中找到一個叫Country的列名。我們這里可以簡單的用“;--”注釋符號將其注釋掉(如果我們是SQL Server)。或者干脆繼續猜其他的列名,然后構造合法請求就如我們上一節講到的一樣。表名的枚舉我們已經開始掌握如何來使用注入進行攻擊,但是我們還要確定要從哪個表得到信息,換句話說就是我們要的到關鍵的表名才能獲得我們想要的有用信息。如何獲得表名呢?在SQL Server中,你可以很容易得從數據庫中得到全部的表名和列名。但是在Oracle和Access中,你就不一定能如此輕易的得到了,這要看WEB程序對數據庫的訪問權限了。關鍵在于是否能得到系統建立時自動生成的表中包含的表名和列名。如在SQL Server中,它們分別為sysobjects和syscolumns,(在本文最后我們將給出其他數據庫系統自建表和相應的列名)我們用以下的句子可以在這些表中列出數據庫的所有列名和表名,(根據情況自行修改):SELECT name FROM sysobjects WHERE xtype = U這句話會返回數據庫中用戶定義的所有表(如圖所示),如果我們看到我們感興趣的或者是想要看的表,那么我們就把他打開,這里以Orders為例構造語句:SELECT name FROM syscolumns WHERE id = (SELECT id FROM sysobjects WHERE name = Orders)得到結果如圖。3.2.10.單一紀錄上面我們構造的語句返回了大量的信息,如果你只想顯示一條數據紀錄也是可以的。你完全可以構造你的注入語句來得到你想要的唯一的信息。我們只要在WHERE子句中添加關鍵字來避免某些行的關鍵字被選中就可以了。我來舉個列子: UNION ALL SELECT name, FieldTwo, FieldThree FROM TableOne WHERE =我們這樣就可以得到FieldOne,FieldTwo和FieldThree的第一個值,假設我們的到的分別是"Alpha", "Beta"和"Delta"。注意,更有意思的來了,我們要得到第2行的值,怎么構造下面的語句呢?這樣來: UNION ALL SELECT FieldOne, FieldTwo, FieldThree FROM TableOne WHERE FieldOne NOT IN (Alpha) AND FieldTwo NOT IN (Beta) AND FieldThree NOT IN (Delta) AND =這里有一個子句“NOT IN VALUES”,它的作用是不再返回我們已經得到的信息,即不是alpha,不是beta,不是delta.既然都不是,數據庫就會傻乎乎的告訴我們第二行的值。我們再假設我們得到第二行的值為"AlphaAlpha", "BetaBeta"和"DeltaDelta"。我們來獲得第三行的值,構造語句如下: UNION ALL SELECT FieldOne, FieldTwo, FieldThree FROM TableOne WHERE FieldOne NOT IN (Alpha, AlphaAlpha) AND FieldTwo NOT IN (Beta, BetaBeta) AND FieldThree NOT IN (Delta, DeltaDelta) AND =這樣就避免了得到第一次和第二次我們已經得到的值,我們就這樣試下去會得到數據庫中所有的值。這看起來好像確實比較麻煩,但在這里卻是最有效的,不是么?

3.3 插入3.3.1 插入基礎關鍵字INSERT 被用于向數據庫添加信息,通常使用INSERT主要在包括用戶注冊,論壇,添加商品到購物車,等等。檢查INSERT使用的弱點和檢查WHERE一樣。你可能不想使用INSERT,如何避免被利用弱點是一個重要的考慮問題。INSERT注入嘗試常常會讓數據庫以行形式返回結果導致泛濫的單獨的引用和SQL關健字的意義可能改變.取決于管理員的注意和信息對數據庫的操作,這個是要引起注意的,剛剛說過的那些,INSERT注入和SELECT注入的不同。我們在一個允許用戶進行各種注冊,這就提供了一個你輸入你的名字,地址,電話等等的表單。在你提交了這個表單之后,為了得到進一步的INSERT的弱點,你必須能夠看到你提交的信息。它在那里不要緊。可能當你登陸根據在數據庫里存儲的名字的給予你權利的時候,可能在發送你的spam郵件的。。,誰知道,尋找一個途徑至少可以看到你輸入的信息。3.3.2一個插入的請求看起來象這樣:INSERT INTO TableName VALUES (Vaule One,Value Two,Value Three) 你想可能利用一個在參數VALUES中的子句來看到其他的數據。我們可以使用這種辦法,sql的代碼象這樣:SQLString ="INSERT INTO TableName VALUES (" & strValueOne & ", " & strValueTwo & ", " & strValueThree & ")"我們象這樣填寫表單:Name: + (SELECT TOP 1 FieldName FROM TableName) + Email: blah@blah.com Phone: 333-333-3333 使SQL的聲明象這樣 : INSERT INTO TableName VALUES ( + (SELECT TOP 1 FieldName FROM TableName) + , blah@blah.com, 333-333-3333)當你到了個人設置頁面查看你的使用信息,你將看到的第一個字段這個通常是用戶名r如果你使不在你的subselect中使用TOP 1,你將得到一個錯誤信息說你的subselect返回了太多記錄,你能查看表中所有的行,使用NOT IN()同樣的方法你可以得到單獨的記錄。3.4. SQL服務器存儲過程利用3.4.1 存儲過程基礎4. 一個完整安裝的MSSQL服務器有上千的存儲過程。如果你能在一個后臺使用mssql的網頁應用程序得到SQL注入,你能使用這些存儲過程完成一些非凡的成果。我將討論很少的特殊的過程。取決于網頁程序使用數據庫的用戶,只有一些可以工作,并不是所有的用戶都可以利用。第一件事你應該知道存儲過程注入不能通過存儲過程的返回值來確定你的注入是否成功.取決于你想完成什么,你可能不需要得到數據。你可以找到返回給你的數據的其他意義。存儲過程注入比一般的查詢注入要容易些,存儲過程的注入的弱點利用看起來象這樣。simplequoted.asp?city=seattle;EXEC master.dbo.xp_cmdshell cmd.exe dir c:注意,Notice how a valid argument is supplied at the beginning and followed by a quote and the final argument to the stored procedure has no closing quote. This will satisfy the syntax requirements inherent in most quoted vulnerabilities. You may also have to deal with parentheses, additional WHERE statements, etc.但是在這以后將不需要擔心列和數據的類型的匹配。這個可能弱點的輸出象程序無法返回錯誤信息一樣。我最喜歡存儲過程。5. 3.4.2. xp_cmdshellxp_cmdshell [, no_output]master.dbo.xp_cmdshell是存儲過程的圣杯,它帶來了一個問題,能夠調用命令行的數據庫用戶的和他的運行權限,這個并不可用除非這個網頁程序使用的數據庫用戶是SA. 運行級別為6sp_makewebtask [@outputfile =] outputfile, [@query =] query 6. 另外一個好的調用對象是master.dbo.sp_makewebtask,象你所看的,它是一個本地的輸出文件和一個SQL statement。sp_makewebtask可以查詢并建立一個包含輸出的網頁。注意你可以象使用一個UNC路徑名一樣使用一個本地輸出。這個意思就是這個輸出文件可以放有在任何一臺連在Inte.net并且有個可寫的SMB共享(SMB請求不需要任何的身份驗證)。如果有一個防火墻限制了服務器對Internet,試著把輸出文件放在網頁目錄下(你要知道或者猜測網頁的目錄)。同樣值得注意的是引用查詢可能是 包括執行其他的存儲過程。Making "EXEC xp_cmdshell dir c:" 這個查詢將在網頁中給出"dir c:"的輸出。當你進行嵌套引用的時候,記得單獨的引用和雙引號。4. 解決 4.1數據處理所有的客戶端數據可以被惡意的提交的字符或字符串清除。這些可能在所有的應用程序做到,不僅僅是使用SQL查詢的。Stripping quotes or putting backslashes in front of them is nowhere near enough.最好的過濾數據的方式是不用規則的表達方式,使它只包括你所想要的字符類型。舉個例子,下邊的regxp將只能返回字母和數字,盡可能的過濾象s/[^0-9a-zA-Z]//g 這樣的特殊字符。可能的時候盡量使用數字,在這以后只使用數字和字母。如果你需要包括各種各樣的標志或標點。確信完全的把它們轉換成html標記,像“"e;" or ">”。例如,一個用戶提交了一個email地址只允許使用數字和字母還有"@", "_", "." 和"-"。僅僅只有這些字符可以轉換成html標記。4.2. 編寫安全的web程序這里同樣有很少的特殊的sql注入規則。First, prepend and append a quote to all user input。盡管數據使數字。其次,限制網頁應用程序的數據庫用戶在數據庫里的權限。不要給這個用戶訪問所有的存儲過程的權利如果這個用戶只需要訪問一些預定義的。這部分包括了所有在sql注入中有用的系統表,你可以在google上搜索到每一個的表的列的定義

5.1. MS SQL ServerSysobjectssyscolumns

5.2. MS Access Server MSysACEsMSysObjects MSysQueriesMSysRelationships

5.3. Oracle SYS.USER_OBJECTSSYS.TAB SYS.USER_TABLESSYS.USER_VIEWS SYS.ALL_TABLES SYS.USER_TAB_COLUMNS SYS.USER_CONSTRAINTS SYS.USER_TRIGGERS SYS.USER_CATALOG

 

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
www国产黄色_天堂一区二区三区_亚洲图片一区二区_欧美日本不卡
中文字幕精品av| 亚洲女同一区二区| 国产精品无码乱伦| 国产一区高清在线| 亚洲欧美综合一区| 99免费精品在线观看| 99热这里只有精品7| 成人午夜短视频| 国产日韩欧美大片| 国产女人aaa级久久久级| 无码粉嫩虎白一线天在线观看| 日本一区二区综合亚洲| 可以在线看的黄色网址| 一区二区三区影院| 精品伦一区二区三区| 欧美日韩中文另类| 日韩欧美国产成人精品免费| 中文字幕av一区中文字幕天堂| 成人h动漫精品一区二区器材| 日日骚av一区| 久久人人88| 成人黄色av播放免费| 日韩精品91亚洲二区在线观看| 欧美激情第一页在线观看| 粉嫩aⅴ一区二区三区四区五区| 日韩精品久久一区二区| 综合av第一页| 久草免费资源站| 日韩美女一区二区三区| 成人永久在线| 91精品国产色综合久久不卡98| 你懂的网址国产 欧美| av一本久道久久波多野结衣| 国产成人亚洲综合a∨婷婷| 久久人人爽人人爽人人av| 亚洲第一久久影院| 日本猛少妇色xxxxx免费网站| 中文字幕少妇一区二区三区| re久久精品视频| 国产传媒一区| 国产女人aaa级久久久级| 波多野结衣免费观看| 亚洲电影免费观看高清完整版在线| 中文字幕日韩高清在线| 国产成人精品在线观看| 激情综合网天天干| 日韩av在线综合| 69精品人人人人| 极品一区美女高清| 91精品久久久久久久久久久久久久 | 国产自偷自偷免费一区| 欧美午夜片在线观看| 96视频在线观看欧美| 青青久久aⅴ北条麻妃| 国产综合久久久久久久久久久久| 国产资源在线视频| 欧美色网站导航| 久9re热视频这里只有精品| 国产日韩欧美日韩| 99久免费精品视频在线观看| 苍井空张开腿实干12次| 中文字幕亚洲天堂| 99精品国产一区二区青青牛奶| 三级网在线观看| 色嗨嗨av一区二区三区| av自拍一区| yy111111少妇影院日韩夜片| 国产精品污网站| 国产精品av久久久久久无| 97精品视频在线观看| 国产一区日韩二区欧美三区| 潘金莲激情呻吟欲求不满视频| 日韩av在线免播放器| 欧美视频久久| 男人的天堂狠狠干| 日韩视频免费直播| 亚洲xxx拳头交| 四虎精品欧美一区二区免费| 7777精品伊人久久久大香线蕉最新版 | 秋霞一区二区三区| 91久久久一线二线三线品牌| 中文字幕字幕中文在线中不卡视频| 18精品爽国产三级网站| 国产精品久久久久9999| 欧美激情一区二区三区| 2025国产精品自拍| 91在线免费看片| 亚洲二区在线视频| 日韩av字幕| 亚洲一区三区视频在线观看 | 国产亚洲精品久久飘花| 香蕉成人伊视频在线观看| 成人精品毛片| 日韩精品伦理第一区| 91久久国产综合久久| 精品国产一区二区三区噜噜噜 | 婷婷激情四射五月天| 日韩在线www| 国产寡妇亲子伦一区二区| 国产又黄又粗又猛又爽的视频| 7777kkkk成人观看| 国产日韩欧美高清| 日韩精品久久久久久久软件91| 国产专区一区二区三区| 欧洲激情一区二区| 欧美人成在线| jizz18女人| 午夜精品美女自拍福到在线| 欧美激情一区二区三区| www.丝袜精品| 黄色一级视频播放| 亚洲天堂av电影| 成人午夜私人影院| 一区二区三区日本视频| 日韩美女一区| 日韩av在线高清| 国产一区二区在线观看视频| 国产黄a三级三级| 欧美高清视频一区| 欧美一区二区精品久久911| 免费在线亚洲欧美| 女同毛片一区二区三区| 91成人伦理在线电影| 色婷婷国产精品久久包臀| 国内自拍视频一区二区三区| 亚洲丝袜在线观看| 国产日本欧美一区二区三区在线| 午夜av一区二区| 欧美三区视频| 一级国产黄色片| 国产精品一区二区a| 91精品久久久久久久99蜜桃| 麻豆精品视频在线观看| 制服丨自拍丨欧美丨动漫丨| 台湾成人av| 色老头一区二区三区在线观看| 国产日韩欧美电影| 精品日韩欧美一区| 亚洲精品性视频| 成人亚洲激情网| 欧美一级在线视频| 国产精品77777| 国产精品巨作av| 91人人澡人人爽人人精品| 国产精品一区二区三区免费视频 | 人人爽人人爽av| 91在线视频成人| 日韩精品专区在线影院观看| 国产99精品在线观看| 另类在线视频| 亚洲免费黄色录像| 国产精华一区| 亚洲老板91色精品久久| 国产精品午夜久久| 欧美喷水视频| 久久99久久99精品免费看小说| 亚洲欧美日韩不卡| 97在线视频一区| 欧美日韩精品免费| 国产成人av自拍| 欧美三级美国一级| 女性生殖扒开酷刑vk| 快播亚洲色图| 欧美大成色www永久网站婷| 午夜成人免费视频| 精品亚洲国产成人av制服丝袜| 欧洲精品99毛片免费高清观看| 日韩一级片播放| 18成人免费观看网站下载| 亚洲精品丝袜日韩| 亚洲精品国产高清久久伦理二区| 国产视频一区三区| 国产剧情一区二区在线观看| aaa毛片在线观看| 懂色中文一区二区三区在线视频| 亚洲精选中文字幕| 午夜伊人狠狠久久| 国产一区在线精品| 欧美oldwomenvideos| 91视频免费观看网站| 91免费国产精品| 成人久久久久久久| 中文日韩在线视频| 欧美日韩一二三四五区| 成人18视频日本| 欧美高清视频手机在在线| 强伦人妻一区二区三区| 日本在线xxx| 99在线国产| 欧美激情视频免费观看| 日韩一级片网址| 亚洲欧美一区二区不卡| 精品亚洲免费视频| 美女亚洲一区| 女性裸体视频网站| 男人午夜视频在线观看| 黄瓜视频免费观看在线观看www | 国产艳妇疯狂做爰视频| 国产日韩第一页| 91精品国产自产在线观看永久| 亚洲最新视频在线| 欧美性猛交xxxx黑人交| 中文在线一区二区| 精品一区二区免费视频| 久久久9色精品国产一区二区三区| 午夜剧场免费在线观看| 91亚洲一线产区二线产区| 欧美精品一区三区| 在线观看中文字幕不卡| 国产三级精品在线| 久久99国产精品久久| 久久久久久久久国产一区| 极品魔鬼身材女神啪啪精品| 制服丝袜av在线| 欧美精品色婷婷五月综合| 久久一区二区精品| 国产欧美欧洲在线观看| 欧美精品videossex88| 亚洲国产精品热久久| 91精品办公室少妇高潮对白| 国产精品理伦片| 国产成人精品亚洲午夜麻豆| 久久只有精品| 午夜精品视频一区二区三区在线看| 香蕉免费一区二区三区在线观看 | 国产性生活免费视频| 国产原创精品| 国产情人节一区| 欧美一级片免费在线| 久久视频在线视频| 日韩精品一二三四区| 日韩欧美的一区| 在线亚洲欧美专区二区| 亚洲一区二区高清| 中文字幕中文字幕在线一区| av高清久久久| 国产成人午夜电影网| 麻豆freexxxx性91精品| 免费在线播放第一区高清av| 亚洲一区二区日韩| 色琪琪久久se色| 视频一区中文| 色综合久久中文| 丁香婷婷成人| 第一区第二区在线| 涩爱av色老久久精品偷偷鲁 | 精品视频免费| 特黄特色欧美大片| 好吊妞视频这里有精品| www.神马久久| 一区二区三区自拍视频| 四虎国产精品成人免费影视| 中文字幕在线观看2018| 超碰人人干人人| 少妇一级黄色片| 自拍偷拍你懂的| 91大神福利视频| 手机av在线看| 96视频在线观看欧美| 国产麻豆精品| 99国产精品免费网站| 91欧美极品| 久久夜色精品国产噜噜av小说| 国产精品一区二区三区www| 在线观看欧美| 亚洲超碰在线观看| 天天做夜夜做人人爱精品| 免费黄色成人| 国产大片一区| 亚洲区第一页| 蜜桃av一区| 韩国毛片一区二区三区| 成人午夜在线播放| 久久夜色精品国产欧美乱极品| 国产日韩欧美a| 一区二区视频免费在线观看| 婷婷亚洲久悠悠色悠在线播放| 色先锋久久av资源部| 3atv一区二区三区| 日韩成人在线视频观看| 中文字幕av一区二区| 欧美肥臀大乳一区二区免费视频| 97色伦亚洲国产| 国产有码一区二区| 精品一区二区三区自拍图片区| 日韩精品欧美在线| 丰满人妻一区二区三区53号| 国产xxxxx视频| 欧美成人精品一区二区综合免费| 亚洲天堂视频一区| 国产精品高清一区二区| 一本色道久久综合狠狠躁的番外| 国产精品7m凸凹视频分类| 亚洲美女少妇无套啪啪呻吟| 久久99国产乱子伦精品免费| 久久午夜免费电影| 亚洲高清视频在线| 欧美日高清视频| 亚洲天堂免费视频| 91极品视频在线| 99久热re在线精品996热视频| 日韩精品成人一区二区在线观看| 国产精品专区在线| 日韩欧美色视频| 日韩激情小视频| 国内精品久久久久久久久电影网| 亚洲天堂成人| 成人福利在线看| 亚洲一二三区不卡| 亚洲精品在线网站| 欧美成人免费va影院高清| 国产日韩欧美综合| 亚洲第一综合| 一级黄色录像在线观看| 精品人体无码一区二区三区| 美女视频亚洲色图| 久久高清免费观看| 久久综合久久综合久久| 欧美日韩国产精品一区二区三区四区 | 99九九视频| 国产a级黄色大片| 日本五十肥熟交尾| 91成人福利| 99精品热6080yy久久| 久久中文字幕电影| 欧日韩精品视频| 久久不射电影网| 国产精品伊人日日| 无码人妻丰满熟妇区毛片18| 中文字幕 自拍| 成人在线免费观看91| 国产一区二区三区蝌蚪| 亚洲精品高清在线观看| 亚洲黄色av女优在线观看| 国产精品va在线播放我和闺蜜| 在线视频不卡国产| 久久免费精品国产| 日韩深夜福利| 国产精品一区二区在线观看不卡| 亚洲香肠在线观看| 亚洲欧美福利视频| 亚洲iv一区二区三区| heyzo国产| 精品人妻伦九区久久aaa片| 中文在线播放一区二区 | 亚洲女厕所小便bbb| 亚洲精品大尺度| 国产一区香蕉久久| 香港三级韩国三级日本三级| 日本视频在线免费| 日韩视频三区| 亚洲欧美另类小说视频| 亚洲性线免费观看视频成熟| 国产高清精品一区二区| 午夜久久福利视频| 美女一区2区| 成人在线视频一区二区| 欧美体内she精视频| 97成人超碰免| 东北少妇不带套对白| 青青青在线免费观看| 欧美亚洲一级| 婷婷国产在线综合| 久久久久久这里只有精品| 中文字幕av日韩精品| 色欲AV无码精品一区二区久久| 女生裸体视频一区二区三区| 欧美激情中文字幕一区二区| 亚洲欧美国产精品专区久久| 久久精品五月婷婷| 亚洲综合自拍网| 在线欧美一区| 亚洲成人av一区二区三区| 久久免费精品视频| 欧美网站免费观看| 澳门久久精品| 99久久伊人精品| 亚洲美女视频网站| 少妇免费毛片久久久久久久久| 亚洲精品国产一区黑色丝袜| 久久国产毛片| 欧美日免费三级在线| 国产在线不卡精品| 特黄特黄一级片| 欧美午夜一区| 欧美日韩亚洲视频| 日韩av黄色在线观看| 一个色综合久久| 国产精品久久观看| 亚洲一区成人在线| 欧美一区第一页| 日日干日日操日日射| 欧美69视频| 一本大道久久a久久综合| 国产精品美女呻吟| 国产精品久久久久久久av福利| 中文字幕一区二区三区乱码图片| 午夜视频在线观看一区二区 | 小说区视频区图片区| 精品久久国产字幕高潮|