国产一级一区二区_segui88久久综合9999_97久久夜色精品国产_欧美色网一区二区

掃一掃
關注微信公眾號

SQL概述及在網絡安全中的應用
2006-12-13   

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來代替加號(+)等等。


3.2.5 LIKE語句查詢

另一個大的災難是陷入一個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關健字的意義可能改變.壬能的過濾象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 Server

Sysobjects

syscolumns

5.2. MS Access Server

MSysACEs

MSysObjects

MSysQueries

MSysRelationships

5.3. Oracle

SYS.USER_OBJECTS

SYS.TAB SYS.USER_TABLES

SYS.USER_VIEWS SYS.ALL_TABLE

S SYS.USER_TAB_COLUMNS

SYS.USER_CONSTRAINTS SYS.USER_TRIGGERS

SYS.USER_CATALOG


熱詞搜索:

上一篇:Oracle8的不安全因素及幾點說明
下一篇:關于SQL SERVER的一些安全問題

分享到: 收藏
国产一级一区二区_segui88久久综合9999_97久久夜色精品国产_欧美色网一区二区
久久精品免费在线观看| zzijzzij亚洲日本少妇熟睡| 亚洲精品视频自拍| 中文字幕亚洲一区二区va在线| 日韩欧美一级二级三级| 在线成人午夜影院| 欧美一区二区三区白人| 欧美乱熟臀69xxxxxx| 欧美日韩视频一区二区| 欧美午夜在线一二页| 欧美日本国产一区| 日韩一区二区三| 久久色中文字幕| 国产精品色一区二区三区| 国产精品成人在线观看| 亚洲激情第一区| 日韩精品视频网| 韩国理伦片一区二区三区在线播放| 国产在线精品不卡| 99视频在线精品| 欧美日韩美少妇| 久久色在线视频| 亚洲日本在线a| 日产精品久久久久久久性色| 国产精品一区在线观看你懂的| www.日韩av| 欧美一区三区四区| 国产精品少妇自拍| 午夜免费久久看| 成人午夜免费视频| 欧美日韩精品综合在线| 久久久久久久久久久电影| 中文字幕日韩一区| 美女视频免费一区| 99久久99久久久精品齐齐| 91麻豆精品91久久久久同性| 国产亚洲精品中文字幕| 一区二区三区久久| 国产精品66部| 欧美另类videos死尸| 国产欧美日本一区视频| 亚洲高清免费视频| 成人午夜碰碰视频| 久久综合久久久久88| 亚洲午夜一区二区三区| 国产精品白丝av| 欧美一区欧美二区| 亚洲国产精品久久人人爱蜜臀| 成人综合婷婷国产精品久久蜜臀| 在线不卡a资源高清| 一色屋精品亚洲香蕉网站| 久久国内精品自在自线400部| 色综合久久综合| 国产欧美日韩卡一| 久久国产精品一区二区| 欧美日韩aaa| 亚洲va韩国va欧美va精品| www.亚洲精品| 国产精品对白交换视频 | 国产亚洲一本大道中文在线| 亚洲五月六月丁香激情| 99热精品国产| 中文在线资源观看网站视频免费不卡| 水蜜桃久久夜色精品一区的特点| 91首页免费视频| 国产精品网站导航| 国产suv精品一区二区6| 日韩精品一区二区三区视频播放 | 99久久久精品免费观看国产蜜| 欧美一级日韩不卡播放免费| 亚洲v日本v欧美v久久精品| 99re视频这里只有精品| 中文字幕日韩一区| 91在线观看美女| √…a在线天堂一区| 91在线观看高清| 一区二区三区国产| 欧美色涩在线第一页| 亚洲第四色夜色| 欧美日韩一级二级三级| 午夜av一区二区| 91麻豆精品国产91久久久使用方法| 午夜国产不卡在线观看视频| 日韩一区二区在线观看视频 | 一本到不卡免费一区二区| 成人免费小视频| 日本乱码高清不卡字幕| 亚洲不卡在线观看| 欧美videos中文字幕| 国产一区二区伦理片| 国产精品久久久久影院色老大 | 51精品国自产在线| 麻豆精品一区二区三区| 国产欧美视频在线观看| 91一区二区在线观看| 亚洲日本青草视频在线怡红院 | 国产偷国产偷亚洲高清人白洁| 国产乱妇无码大片在线观看| 中文一区二区在线观看 | 日韩成人一级大片| 久久久久久久综合日本| 99久久99久久久精品齐齐| 五月天激情小说综合| 精品久久一区二区三区| 99精品视频在线观看| 亚洲成人自拍偷拍| 久久久综合精品| 色婷婷一区二区三区四区| 日韩电影在线一区二区三区| 精品国产凹凸成av人网站| 99精品久久只有精品| 丝袜美腿成人在线| 国产精品午夜在线| 欧美伦理电影网| caoporn国产精品| 蜜桃精品视频在线观看| 亚洲日本韩国一区| xfplay精品久久| 在线看一区二区| 成人在线综合网| 美国精品在线观看| 亚洲精品欧美激情| 久久久久久一级片| 91精品国产综合久久婷婷香蕉 | 欧美唯美清纯偷拍| 成人夜色视频网站在线观看| 天堂久久久久va久久久久| 国产精品毛片大码女人| 日韩精品在线一区| 精品视频在线看| 91亚洲精品一区二区乱码| 国产麻豆精品一区二区| 蜜桃91丨九色丨蝌蚪91桃色| 一区二区三区在线免费视频| 久久精品在这里| 精品久久久影院| 欧美一区二区三区在线视频| 欧美伊人久久久久久久久影院| 高清不卡一二三区| 国产风韵犹存在线视精品| 另类小说色综合网站| 婷婷开心激情综合| 亚洲777理论| 婷婷丁香久久五月婷婷| 亚洲二区在线视频| 一区二区三区日韩精品| 亚洲美女视频在线观看| 亚洲日本一区二区| 亚洲一区在线观看免费观看电影高清 | 7777精品伊人久久久大香线蕉经典版下载| 成人黄动漫网站免费app| 国产成人在线影院| 国产成人午夜高潮毛片| 国产一区二区三区黄视频 | 亚洲欧洲日韩在线| 国产精品素人一区二区| 久久网站热最新地址| 久久久久久久电影| 久久久精品tv| 中文字幕第一区综合| 亚洲三级在线看| 亚洲精品乱码久久久久久日本蜜臀| 亚洲欧美综合网| 一区二区三区在线观看国产| 一区二区三区中文字幕| 亚洲国产一区二区a毛片| 午夜精品久久久久久久99水蜜桃| 午夜精品在线看| 寂寞少妇一区二区三区| 国产在线精品一区二区不卡了| 国产精品69毛片高清亚洲| 不卡电影一区二区三区| 色天天综合久久久久综合片| 欧美日韩亚洲综合| 日韩欧美国产一区二区在线播放| 久久综合色婷婷| 国产精品久久毛片a| 亚洲1区2区3区4区| 国产精品一区二区无线| 91美女蜜桃在线| 国产精品免费aⅴ片在线观看| 中文字幕日本乱码精品影院| 亚洲成av人综合在线观看| 狠狠色综合日日| 色伊人久久综合中文字幕| 欧美丰满一区二区免费视频| 久久精品一区四区| 天天免费综合色| 大尺度一区二区| 91精品麻豆日日躁夜夜躁| 亚洲国产成人午夜在线一区| 亚洲一区二区三区中文字幕| 国内精品伊人久久久久影院对白| 色综合中文字幕| 精品成人在线观看| 亚洲国产一区视频| av中文一区二区三区| 欧美白人最猛性xxxxx69交| 一区二区三区在线影院| 国产精品自拍一区|