關鍵字:
乍一看,ExecLogin.asp 的代碼似乎沒有任何安全漏洞,因為用戶如果不給出有效的用戶名/密碼組合就無法登錄。然而,這段代碼偏偏不安全,而且它正是SQL 指令植入式攻擊的理想目標。具體而言,設計者把用戶的輸入直接用于構建SQL 指令,從而使攻擊者能夠自行決定即將被執行的 SQL 指令。例如:攻擊者可能會在表單的用戶名或密碼欄中輸入包含“ or ”和“=” 等特殊字符。于是,提交給數據庫的 SQL 指令就可能是:
代碼:SELECT * FROM tblUsers WHERE Username= or = and Password = or =
這樣,SQL 服務器將返回 tblUsers 表格中的所有記錄,而 ASP 腳本將會因此而誤認為攻擊者的輸入符合 tblUsers 表格中的第一條記錄,從而允許攻擊者以該用戶的名義登入網站。
SQL 指令植入式攻擊還有另一種形式,它發生在 ASP 服務器根據 querystring 參數動態生成網頁時。這里有一個例子,此 ASP 頁面從 URL 中提取出 querystring 參數中的 ID 值,然后根據 ID 值動態生成后繼頁面:
代碼:<% 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 值的文章的內容,而 ID 值是由 URL 中的 querystring 參數指定的。例如:當URL為http://www.example.com/Article.asp?ID=1055 時,ASP 就會根據 ID 為1055的文章提供的內容生成頁面。
如同前述登錄頁面的例子一樣,此段代碼也向SQL 指令植入式攻擊敞開了大門。某些惡意用戶可能會把 querystring 中的文章 ID 值偷換為“0 or 1=1”等內容(也就是說,把 URL 換成http://www.example.com/Article.asp?ID=0 or 1=1) 從而誘使 ASP 腳本生成不安全的SQL指令如:
代碼:SELECT * FROM tblArticles WHERE ID=0 or 1=1
于是,數據庫將會返回所有文章的內容。
當然了,本例服務器所受的攻擊不一定會引起什么嚴重后果??墒?,攻擊者卻可能變本加厲,比如用同樣的手段發送 DELETE 等SQL指令。這只需要簡單地修改前述 URL 中的querystring 參數就可以了!例如:任何人都可以通過 http://www.example.com/Article.asp?ID=1055; DELETE FROM tblArticles ”之類的URL來訪問Web網站。
原文轉自:http://www.anti-gravitydesign.com