不卡AV在线|网页在线观看无码高清|亚洲国产亚洲国产|国产伦精品一区二区三区免费视频

學(xué)習(xí)啦>學(xué)習(xí)電腦>網(wǎng)絡(luò)知識>無線網(wǎng)絡(luò)>

SQL在網(wǎng)絡(luò)安全中的應(yīng)用

時(shí)間: 若木635 分享

  本文是小編帶來的無線路由器配置錯(cuò)誤分析,歡迎大家閱讀借鑒,希望能幫到你。

  1.網(wǎng)絡(luò)應(yīng)用和SQL注射

  1.1概述

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

  1.2背景

  在讀這篇文章之前,你應(yīng)該對數(shù)據(jù)庫如何工作,以及SQL如何被用來訪問數(shù)據(jù)庫有一些基礎(chǔ)的了解。我建議您閱讀eXtropia.com的文章“Introduction to Databases for WebDevelopers”。

  1.3字符編碼

  在大多數(shù)的網(wǎng)絡(luò)瀏覽器中,標(biāo)點(diǎn)符號和許多其它符號在用于一個(gè)網(wǎng)絡(luò)請求前需要把URL編碼,以便被適當(dāng)?shù)鼐幾g(interpret)。在本文中的例子和截圖中我使用了固定的ASCII字符以保證最大的可讀性。然而,在實(shí)際應(yīng)用中,你需要在HTTP請求中用%25來代替百分號(%),用%2B來代替加號(+)等等。

  2.網(wǎng)絡(luò)應(yīng)用和SQL注射

  2.1概述

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

  2.2背景

  在讀這篇文章之前,你應(yīng)該對數(shù)據(jù)庫如何工作,以及SQL如何被用來訪問數(shù)據(jù)庫有一些基礎(chǔ)的了解。我建議您閱讀eXtropia.com的文章“Introduction to Databases for WebDevelopers”。

  2.3字符編碼

  在大多數(shù)的網(wǎng)絡(luò)瀏覽器中,標(biāo)點(diǎn)符號和許多其它符號在用于一個(gè)網(wǎng)絡(luò)請求前需要把URL編碼,以便被適當(dāng)?shù)鼐幾g(interpret)。在本文中的例子和截圖中我使用了固定的ASCII字符以保證最大的可讀性。然而,在實(shí)際應(yīng)用中,你需要在HTTP請求中用%25來代替百分號(%),用%2B來代替加號(+)等等。。。

  2.4. LIKE語句查詢

  另一個(gè)大的災(zāi)難是陷入一個(gè)LIKE子句的陷阱.(Seeing the LIKE keyword or percent signs cited in an error message are indications of this situation.)大多數(shù)的web搜索程序使用LIKE子句來查詢數(shù)據(jù)庫,比如下面這個(gè):

  SQLString = "SELECT FirstName, LastName, Title FROM Employees WHERE LastName LIKE '%" & strLastNameSearch & "%'"

  這里面的%是通配符,在這個(gè)例子里,WHERE子句會返回TRUE,只要LASTNAME里有字符串含有strLastNameSearch.為了阻止SQL SERVER返回預(yù)計(jì)中的記錄,你構(gòu)造的SQL語句里必須含有LASTNAME里沒有的字符串.web搜索程序搜索的字符串來自于用戶的輸入.通常有一個(gè)'和一個(gè)%在輸入的字符串之前,因此我們構(gòu)造字符串時(shí),需要在WHERE子句中匹配它們.如果你提交了NULL作為搜索字符串,那么LIKE的參數(shù)會變成"%%",這是一個(gè)全匹配,會返回所有的記錄.

  2.5 “死胡同”

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

  2.6列的數(shù)目不匹配問題

  如圖所示,我們可以從幾次錯(cuò)誤中得到很多有用的信息,并且加以調(diào)整自己的請求語句,這種信息多了,那就意味著我們離成功不遠(yuǎn)了。在猜列名時(shí),如圖所示,我們提交語句后會碰到以下錯(cuò)誤“在UNION語句中的所有查詢都必須在目標(biāo)列表中具有相同數(shù)目的表達(dá)式”,這就是說你需要找出或者說是探測出在合法的請求中有多少個(gè)列。

  這里我解釋一下,UNION 語句是用來將兩個(gè)不同的查詢結(jié)果集相加得到一個(gè)結(jié)果集,UNION使用的唯一要求是兩個(gè)查詢的信息(你的查詢語句)必須有相同的列數(shù)和相同的數(shù)據(jù)類型

  我舉個(gè)例子,web程序中有如下語句:

  SQLstring= "SELECT FirstName,LastName,EmployeeID FROM Employees WHERE City ='"&strCity"'"

  合法的SELECT語句和我們注入的UNION SELECT語句在WHERE子句中都要有相同的列。就上面的語句來說,如果我要加入U(xiǎn)NION 語句的話,前后兩者都要有3個(gè)列。并且他們列的數(shù)據(jù)類型也要相互匹配才可以。如果FirstName這個(gè)值是字符串類型的,那么在你注入的語句中所對應(yīng)的值也應(yīng)該是字符串類型的。一些數(shù)據(jù)庫,如ORACLE,是對類型檢查非常嚴(yán)格的。其他的數(shù)據(jù)庫相對要好一些,允許你輸入任何數(shù)據(jù)類型并且它會自動(dòng)的把你輸入錯(cuò)誤的數(shù)據(jù)類型轉(zhuǎn)換成正確的。比如SQL數(shù)據(jù)庫中,你在varchar類型的地方輸入數(shù)值類型的數(shù)據(jù)(如int)是不會報(bào)錯(cuò)的,因?yàn)樵谶@里數(shù)值類型會被自動(dòng)轉(zhuǎn)為字符串類型。但是如果在smallint列處輸入text類型則被認(rèn)為是非法的,因?yàn)閠ext類型不能被轉(zhuǎn)換成int類型。把數(shù)值類型的數(shù)據(jù)轉(zhuǎn)換成字符串型是被允許的,而反之則不行,所以默認(rèn)都是使用數(shù)值類型的數(shù)據(jù)。

  要想知道我們要注入的目標(biāo)語句中有多少個(gè)列,你就要試探性的往UNION SELECT子句中添加相應(yīng)的值,直到它不報(bào)“在UNION語句中的所有查詢都必須在目標(biāo)列表中具有相同數(shù)目的表達(dá)式”這樣的錯(cuò)為止。如圖所示,如果你遇到的是數(shù)據(jù)類型不匹配的錯(cuò)誤,那么你要去改變列的數(shù)據(jù)類型。如果返回消息只是一個(gè)轉(zhuǎn)換數(shù)據(jù)類型失敗的錯(cuò)誤,那就說明你已經(jīng)猜對了列的數(shù)目,只是其中有個(gè)別的列的數(shù)據(jù)類型不對。那么接下來要做的就是判斷是哪個(gè)列的數(shù)據(jù)類型的不正確導(dǎo)致的錯(cuò)誤。然后將他改過來就可以了。

  如果一切順利,那么祝賀你,你會得到一個(gè)和上面格式類似的而且是合法的頁面;)無論動(dòng)態(tài)頁面在哪里出現(xiàn),你都可以構(gòu)造自己的語句應(yīng)對自如。

  3.WHERE關(guān)鍵字

  報(bào)錯(cuò)為“無效的列名'EmployeeID'”,這個(gè)問題可能是由我們注入的語句結(jié)尾的WHERE關(guān)鍵字引起的,舉例說明:

  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'

  這樣就會報(bào)錯(cuò):[Microsoft][ODBC SQL Server Driver][SQL Server]無效的列名 'Country'。

  其實(shí)問題就是因?yàn)槟阕⑷氲恼Z句后,系統(tǒng)沒有在從數(shù)據(jù)庫的表中找到一個(gè)叫'Country'的列名。我們這里可以簡單的用“;--”注釋符號將其注釋掉(如果我們是SQL Server)。或者干脆繼續(xù)猜其他的列名,然后構(gòu)造合法請求就如我們上一節(jié)講到的一樣。

  3.1表名的枚舉

  我們已經(jīng)開始掌握如何來使用注入進(jìn)行攻擊,但是我們還要確定要從哪個(gè)表得到信息,換句話說就是我們要的到關(guān)鍵的表名才能獲得我們想要的有用信息。如何獲得表名呢?在SQL Server中,你可以很容易得從數(shù)據(jù)庫中得到全部的表名和列名。但是在Oracle和Access中,你就不一定能如此輕易的得到了,這要看WEB程序?qū)?shù)據(jù)庫的訪問權(quán)限了。關(guān)鍵在于是否能得到系統(tǒng)建立時(shí)自動(dòng)生成的表中包含的表名和列名。如在SQL Server中,它們分別為'sysobjects'和'syscolumns',(在本文最后我們將給出其他數(shù)據(jù)庫系統(tǒng)自建表和相應(yīng)的列名)我們用以下的句子可以在這些表中列出數(shù)據(jù)庫的所有列名和表名,(根據(jù)情況自行修改):

  SELECT name FROM sysobjects WHERE xtype = 'U'

  這句話會返回?cái)?shù)據(jù)庫中用戶定義的所有表,如果我們看到我們感興趣的或者是想要看的表,那么我們就把他打開,這里以O(shè)rders為例構(gòu)造語句:SELECT name FROM syscolumns WHERE id = (SELECT id FROM sysobjects WHERE name = 'Orders')得到結(jié)果如圖。

  3.2單一紀(jì)錄

  上面我們構(gòu)造的語句返回了大量的信息,如果你只想顯示一條數(shù)據(jù)紀(jì)錄也是可以的。你完全可以構(gòu)造你的注入語句來得到你想要的唯一的信息。我們只要在WHERE子句中添加關(guān)鍵字來避免某些行的關(guān)鍵字被選中就可以了。我來舉個(gè)列子:' UNION ALL SELECT name, FieldTwo, FieldThree FROM TableOne WHERE ''='

  我們這樣就可以得到FieldOne,FieldTwo和FieldThree的第一個(gè)值,假設(shè)我們的到的分別是"Alpha", "Beta"和"Delta"。注意,更有意思的來了,我們要得到第2行的值,怎么構(gòu)造下面的語句呢?這樣來:' UNION ALL SELECT FieldOne, FieldTwo, FieldThree FROM TableOne WHERE FieldOne NOT IN ('Alpha') AND FieldTwo NOT IN ('Beta') AND FieldThree NOT IN ('Delta') AND ''='

  這里有一個(gè)子句“NOT IN VALUES”,它的作用是不再返回我們已經(jīng)得到的信息,即不是alpha,不是beta,不是delta.既然都不是,數(shù)據(jù)庫就會傻乎乎的告訴我們第二行的值。我們再假設(shè)我們得到第二行的值為"AlphaAlpha", "BetaBeta"和"DeltaDelta"。

  我們來獲得第三行的值,構(gòu)造語句如下:' 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 ''='

  這樣就避免了得到第一次和第二次我們已經(jīng)得到的值,我們就這樣試下去會得到數(shù)據(jù)庫中所有的值。這看起來好像確實(shí)比較麻煩,但在這里卻是最有效的,不是么?

  3.3 插入

  3.3.1 插入基礎(chǔ)

  關(guān)鍵字INSERT 被用于向數(shù)據(jù)庫添加信息,通常使用INSERT主要在包括用戶注冊,論壇,添加商品到購物車,等等。檢查INSERT使用的弱點(diǎn)和檢查WHERE一樣。你可能不想使用INSERT,如何避免被利用弱點(diǎn)是一個(gè)重要的考慮問題。INSERT注入嘗試常常會讓數(shù)據(jù)庫以行形式返回結(jié)果導(dǎo)致泛濫的單獨(dú)的引用和SQL關(guān)健字的意義可能改變.取決于管理員的注意和信息對數(shù)據(jù)庫的操作,這個(gè)是要引起注意的,剛剛說過的那些,INSERT注入和SELECT注入的不同。我們在一個(gè)允許用戶進(jìn)行各種注冊,這就提供了一個(gè)你輸入你的名字,地址,電話等等的表單。在你提交了這個(gè)表單之后,為了得到進(jìn)一步的INSERT的弱點(diǎn),你必須能夠看到你提交的信息。它在那里不要緊??赡墚?dāng)你登陸根據(jù)在數(shù)據(jù)庫里存儲的名字的給予你權(quán)利的時(shí)候,可能在發(fā)送你的spam郵件的。。,誰知道,尋找一個(gè)途徑至少可以看到你輸入的信息。

  3.3.2

  一個(gè)插入的請求看起來象這樣:INSERT INTO TableName VALUES ('Vaule One','Value Two','Value Three') 你想可能利用一個(gè)在參數(shù)VALUES中的子句來看到其他的數(shù)據(jù)。我們可以使用這種辦法,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')當(dāng)你到了個(gè)人設(shè)置頁面查看你的使用信息,你將看到的第一個(gè)字段這個(gè)通常是用戶名r如果你使不在你的subselect中使用TOP 1,你將得到一個(gè)錯(cuò)誤信息說你的subselect返回了太多記錄,你能查看表中所有的行,使用NOT IN()同樣的方法你可以得到單獨(dú)的記錄。

  3.4. SQL服務(wù)器存儲過程利用

  3.4.1 存儲過程基礎(chǔ)

  4. 一個(gè)完整安裝的MSSQL服務(wù)器有上千的存儲過程。如果你能在一個(gè)后臺使用mssql的網(wǎng)頁應(yīng)用程序得到SQL注入,你能使用這些存儲過程完成一些非凡的成果。我將討論很少的特殊的過程。取決于網(wǎng)頁程序使用數(shù)據(jù)庫的用戶,只有一些可以工作,并不是所有的用戶都可以利用。第一件事你應(yīng)該知道存儲過程注入不能通過存儲過程的返回值來確定你的注入是否成功.取決于你想完成什么,你可能不需要得到數(shù)據(jù)。你可以找到返回給你的數(shù)據(jù)的其他意義。存儲過程注入比一般的查詢注入要容易些,存儲過程的注入的弱點(diǎn)利用看起來象這樣。

  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.但是在這以后將不需要擔(dān)心列和數(shù)據(jù)的類型的匹配。這個(gè)可能弱點(diǎn)的輸出象程序無法返回錯(cuò)誤信息一樣。我最喜歡存儲過程。

  5. 3.4.2. xp_cmdshell

  xp_cmdshell {'command_string'} [, no_output]

  master.dbo.xp_cmdshell是存儲過程的圣杯,它帶來了一個(gè)問題,能夠調(diào)用命令行的數(shù)據(jù)庫用戶的和他的運(yùn)行權(quán)限,這個(gè)并不可用除非這個(gè)網(wǎng)頁程序使用的數(shù)據(jù)庫用戶是SA. 運(yùn)行級別為6

  sp_makeweBTask [@outputfile =] 'outputfile', [@query =] 'query'

  4.1數(shù)據(jù)處理

  所有的客戶端數(shù)據(jù)可以被惡意的提交的字符或字符串清除。這些可能在所有的應(yīng)用程序做到,不僅僅是使用SQL查詢的。Stripping quotes or putting backslashes in front of them is nowhere near enough.最好的過濾數(shù)據(jù)的方式是不用規(guī)則的表達(dá)方式,使它只包括你所想要的字符類型。舉個(gè)例子,下邊的regxp將只能返回字母和數(shù)字,盡可能的過濾象s/[^0-9a-zA-Z]//g 這樣的特殊字符。可能的時(shí)候盡量使用數(shù)字,在這以后只使用數(shù)字和字母。如果你需要包括各種各樣的標(biāo)志或標(biāo)點(diǎn)。確信完全的把它們轉(zhuǎn)換成html標(biāo)記,像“"e;" or ">”。例如,一個(gè)用戶提交了一個(gè)email地址只允許使用數(shù)字和字母還有"@", "_", "." 和"-"。僅僅只有這些字符可以轉(zhuǎn)換成html標(biāo)記。

  4.2. 編寫安全的web程序

  這里同樣有很少的特殊的sql注入規(guī)則。First, prepend and append a quote to all user input。

  盡管數(shù)據(jù)使數(shù)字。其次,限制網(wǎng)頁應(yīng)用程序的數(shù)據(jù)庫用戶在數(shù)據(jù)庫里的權(quán)限。不要給這個(gè)用戶訪問所有的存儲過程的權(quán)利如果這個(gè)用戶只需要訪問一些預(yù)定義的。

  這部分包括了所有在sql注入中有用的系統(tǒng)表,你可以在Google上搜索到每一個(gè)的表的列的定義

  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

  6. 另外一個(gè)好的調(diào)用對象是master.dbo.sp_makewebtask,象你所看的,它是一個(gè)本地的輸出文件和一個(gè)SQL statement。sp_makeweBTask可以查詢并建立一個(gè)包含輸出的網(wǎng)頁。注意你可以象使用一個(gè)UNC路徑名一樣使用一個(gè)本地輸出。這個(gè)意思就是這個(gè)輸出文件可以放有在任何一臺連在Internet并且有個(gè)可寫的SMB共享(SMB請求不需要任何的身份驗(yàn)證)。如果有一個(gè)防火墻限制了服務(wù)器對Internet,試著把輸出文件放在網(wǎng)頁目錄下(你要知道或者猜測網(wǎng)頁的目錄)。同樣值得注意的是引用查詢可能是 包括執(zhí)行其他的存儲過程。Making "EXEC xp_cmdshell 'dir c:'" 這個(gè)查詢將在網(wǎng)頁中給出"dir c:"的輸出。當(dāng)你進(jìn)行嵌套引用的時(shí)候,記得單獨(dú)的引用和雙引號.

SQL在網(wǎng)絡(luò)安全中的應(yīng)用

本文是小編帶來的無線路由器配置錯(cuò)誤分析,歡迎大家閱讀借鑒,希望能幫到你。 1.網(wǎng)絡(luò)應(yīng)用和SQL注射 1.1概述 有些網(wǎng)絡(luò)數(shù)據(jù)庫沒有過濾客戶提供的數(shù)據(jù)中可能有害的字符,SQL注射就是利用插入有害字符進(jìn)行攻擊的技術(shù)。盡管非常容易防范,但
推薦度:
點(diǎn)擊下載文檔文檔為doc格式
122968