網(wǎng)絡(luò)技術(shù)是從1990年代中期發(fā)展起來的新技術(shù),它把互聯(lián)網(wǎng)上分散的資源融為有機(jī)整體,實(shí)現(xiàn)資源的全面共享和有機(jī)協(xié)作,使人們能夠透明地使用資源的整體能力并按需獲取信息。資源包括高性能計(jì)算機(jī)、存儲資源、數(shù)據(jù)資源、信息資源、知識資源、專家資源、大型數(shù)據(jù)庫、網(wǎng)絡(luò)、傳感器等。 當(dāng)前的互聯(lián)網(wǎng)只限于信息共享,網(wǎng)絡(luò)則被認(rèn)為是互聯(lián)網(wǎng)發(fā)展的第三階段。 什么是SQL 指令植入式攻擊? 在設(shè)計(jì)或者維護(hù) Web 網(wǎng)站時,你也許擔(dān)心它們會受到某些卑鄙用戶的惡意攻擊。的確,如今的 Web 網(wǎng)站開發(fā)者們針對其站點(diǎn)所在操作系統(tǒng)平臺或Web 服務(wù)器的安全性而展開的討論實(shí)在太多了。不錯,IIS 服務(wù)器的安全漏洞可能招致惡意攻擊;但你的安全檢查清單不應(yīng)該僅僅有 IIS 安全性這一條。有些代碼,它們通常是專門為數(shù)據(jù)驅(qū)動(data-driven) 的 Web 網(wǎng)站而設(shè)計(jì)的,實(shí)際上往往同其它 IIS 漏洞一樣存在嚴(yán)重的安全隱患。這些潛伏于代碼中的安全隱患就有可能被稱為“SQL 指令植入式攻擊” (SQL injection) 的手段所利用而導(dǎo)致服務(wù)器受到攻擊。 SQL 指令植入式攻擊技術(shù)使得攻擊者能夠利用 Web 應(yīng)用程序中某些疏于防范的輸入機(jī)會動態(tài)生成特殊的 SQL 指令語句。舉一個常見的例子: 某 Web 網(wǎng)站采用表單來收集訪問者的用戶名和密碼以確認(rèn)他有足夠權(quán)限訪問某些保密信息,然后該表單被發(fā)送到 Web 服務(wù)器進(jìn)行處理。接下來,服務(wù)器端的ASP 腳本根據(jù)表單提供的信息生成 SQL 指令語句提交到 SQL 服務(wù)器,并通過分析 SQL 服務(wù)器的返回結(jié)果來判斷該用戶名/密碼組合是否有效。 為了實(shí)現(xiàn)這樣的功能,Web 程序員可能會設(shè)計(jì)兩個頁面:一個 HTML 頁面 (Login.htm) 用于登錄,另一個ASP 頁面 (ExecLogin.asp) 用于驗(yàn)證用戶權(quán)限(即向數(shù)據(jù)庫查詢用戶名/密碼組合是否存在)。具體代碼可能象這樣: Login.htm (HTML 頁面) 代碼:<form action="ExecLogin.asp" method="post"> Username: <input type="text" name="txtUsername"><br> Password: <input type="password" name="txtPassword"><br> <input type="submit"> </form> ExecLogin.asp (ASP 頁面) 代碼:<% Dim p_strUsername, p_strPassword, objRS, strSQL p_strUsername = Request.Form("txtUsername") p_strPassword = Request.Form("txtPassword") strSQL = "SELECT * FROM tblUsers " & _ "WHERE Username='" & p_strUsername & _ "' and Password='" & p_strPassword & "'" Set objRS = Server.CreateObject("ADODB.Recordset") objRS.Open strSQL, "DSN=..." If (objRS.EOF) Then Response.Write "Invalid login." Else Response.Write "You are logged in as " & objRS("Username") End If Set objRS = Nothing %> 乍一看,ExecLogin.asp 的代碼似乎沒有任何安全漏洞,因?yàn)橛脩羧绻唤o出有效的用戶名/密碼組合就無法登錄。然而,這段代碼偏偏不安全,而且它正是SQL 指令植入式攻擊的理想目標(biāo)。具體而言,設(shè)計(jì)者把用戶的輸入直接用于構(gòu)建SQL 指令,從而使攻擊者能夠自行決定即將被執(zhí)行的 SQL 指令。例如:攻擊者可能會在表單的用戶名或密碼欄中輸入包含“ or ”和“=” 等特殊字符。于是,提交給數(shù)據(jù)庫的 SQL 指令就可能是: 代碼:SELECT * FROM tblUsers WHERE Username='' or ''='' and Password = '' or ''='' 這樣,SQL 服務(wù)器將返回 tblUsers 表格中的所有記錄,而 ASP 腳本將會因此而誤認(rèn)為攻擊者的輸入符合 tblUsers 表格中的第一條記錄,從而允許攻擊者以該用戶的名義登入網(wǎng)站。 SQL 指令植入式攻擊還有另一種形式,它發(fā)生在 ASP 服務(wù)器根據(jù) querystring 參數(shù)動態(tài)生成網(wǎng)頁時。這里有一個例子,此 ASP 頁面從 URL 中提取出 querystring 參數(shù)中的 ID 值,然后根據(jù) ID 值動態(tài)生成后繼頁面: 代碼:<% Dim p_lngID, objRS, strSQL p_lngID = Request("ID") strSQL = "SELECT * FROM tblArticles WHERE ID=" & p_lngID Set objRS = Server.CreateObject("ADODB.Recordset") objRS.Open strSQL, "DSN=..." If (Not objRS.EOF) Then Response.Write objRS("ArticleContent") Set objRS = Nothing %> 在一般情況下,此 ASP 腳本能夠顯示具有特定 ID 值的文章的內(nèi)容,而 ID 值是由 URL 中的 querystring 參數(shù)指定的。例如:當(dāng)URL為 http://www.example.com/Article.asp?ID=1055 時,ASP 就會根據(jù) ID 為 1055 的文章提供的內(nèi)容生成頁面。 如同前述登錄頁面的例子一樣,此段代碼也向SQL 指令植入式攻擊敞開了大門。某些惡意用戶可能會把 querystring 中的文章 ID 值偷換為“0 or 1=1”等內(nèi)容(也就是說,把 URL 換成 http://www.example.com/Article.asp?ID=0 or 1=1) 從而誘使 ASP 腳本生成不安全的 SQL 指令如: 代碼:SELECT * FROM tblArticles WHERE ID=0 or 1=1 于是,數(shù)據(jù)庫將會返回所有文章的內(nèi)容。 當(dāng)然了,本例服務(wù)器所受的攻擊不一定會引起什么嚴(yán)重后果?墒牵粽邊s可能變本加厲,比如用同樣的手段發(fā)送 DELETE 等 SQL 指令。這只需要簡單地修改前述 URL 中的 querystring 參數(shù)就可以了!例如:任何人都可以通過 “http://www.example.com/Article.asp?ID=1055; DELETE FROM tblArticles ” 之類的 URL 來訪問 Web 網(wǎng)站。 網(wǎng)絡(luò)的神奇作用吸引著越來越多的用戶加入其中,正因如此,網(wǎng)絡(luò)的承受能力也面臨著越來越嚴(yán)峻的考驗(yàn)―從硬件上、軟件上、所用標(biāo)準(zhǔn)上......,各項(xiàng)技術(shù)都需要適時應(yīng)勢,對應(yīng)發(fā)展,這正是網(wǎng)絡(luò)迅速走向進(jìn)步的催化劑。 |
溫馨提示:喜歡本站的話,請收藏一下本站!