標籤:
最近在做的項目是網路安全評估的內容,其中包含滲透測試,而SQL注入往往是滲透測試中最為有效手段之一,本文中將會就SQL注入的原理和方法進行敘述,使普通讀者對SQL注入有所瞭解。
SQL注入攻擊是駭客對資料庫進行攻擊的常用手段之一。隨著B/S模式應用開發的發展,使用這種模式編寫應用程式的程式員也越來越多。但是由於程式員的水平及經驗也參差不齊,相當大一部分程式員在編寫代碼的時候,沒有對使用者輸入資料的合法性進行判斷,使應用程式存在安全隱患。使用者可以提交一段資料庫查詢代碼,根據程式返回的結果,獲得某些他想得知的資料,這就是所謂的SQL Injection,即SQL注入。SQL注入是從正常的WWW連接埠訪問,而且表面看起來跟一般的Web頁面訪問沒什麼區別,所以目前市面的防火牆都不會對SQL注入發出警報,如果管理員沒查看IIS日誌的習慣,可能被入侵很長時間都不會發覺。但是,SQL注入的手法相當靈活,在注入的時候會碰到很多意外的情況,需要構造巧妙的SQL語句,從而成功擷取想要的資料。SQL注入測試就是通過利用目標網站的某個頁面缺少對使用者傳遞參數控制或者控制的不夠好的情況下出現的漏洞,從而達到擷取、修改、刪除資料,甚至控制資料庫伺服器、Web伺服器的目的的測試方法。
SQL注入攻擊的總體思路
·發現SQL注入位置;
·判斷後台資料庫類型;
·確定XP_CMDSHELL可執行情況
·發現WEB虛擬目錄
·上傳ASP木馬;
SQL注入攻擊的步驟
一、SQL注入漏洞的判斷
一般來說,SQL注入一般存在於形如:HTTP://www.xxx.com/abc.asp?id=XX等帶有參數的ASP動態網頁中,有時一個動態網頁中可能只有一個參數,有時可能有N個參數,有時是整型參數,有時是字串型參數,不能一概而論。總之只要是帶有參數的動態網頁且此網頁訪問了資料庫,那麼就有可能存在SQL注入。如果ASP程式員沒有安全意識,不進行必要的字元過濾,存在SQL注入的可能性就非常大。
為了全面瞭解動態網頁回答的資訊,首選請調整IE的配置。把IE菜單-工具-Internet選項-進階-顯示友好HTTP錯誤資訊前面的勾去掉。
為了把問題說明清楚,以下以HTTP://www.xxx.com/abc.asp?p=YY為例進行分析,YY可能是整型,也有可能是字串。1、整型參數的判斷
當輸入的參數YY為整型時,通常abc.asp中SQL語句原貌大致如下:
select * from 表名 where 欄位=YY,所以可以用以下步驟測試SQL注入是否存在。
①HTTP://www.xxx.com/abc.asp?p=YY’(附加一個單引號),此時abc.ASP中的SQL語句變成了
select * from 表名 where 欄位=YY’,abc.asp運行異常;
②HTTP://www.xxx.com/abc.asp?p=YY and 1=1, abc.asp運行正常,而且與HTTP://www.xxx.com/abc.asp?p=YY運行結果相同;
③HTTP://www.xxx.com/abc.asp?p=YY and 1=2, abc.asp運行異常;
如果以上三步全面滿足,abc.asp中一定存在SQL注入漏洞。
2、字串型參數的判斷
當輸入的參數YY為字串時,通常abc.asp中SQL語句原貌大致如下:
select * from 表名 where 欄位=‘YY‘,所以可以用以下步驟測試SQL注入是否存在。
①HTTP://www.xxx.com/abc.asp?p=YY’(附加一個單引號),此時abc.ASP中的SQL語句變成了
select * from 表名 where 欄位=YY’,abc.asp運行異常;
②HTTP://www.xxx.com/abc.asp?p=YY&;nb ... 39;1‘=‘1‘, abc.asp運行正常,而且與HTTP://www.xxx.com/abc.asp?p=YY運行結果相同;
③HTTP://www.xxx.com/abc.asp?p=YY&;nb ... 39;1‘=‘2‘, abc.asp運行異常;
如果以上三步全面滿足,abc.asp中一定存在SQL注入漏洞。
3、特殊情況的處理
有時ASP程式員會在程式員過濾掉單引號等字元,以防止SQL注入。此時可以用以下幾種方法試一試。
①大小定混合法:由於VBS並不區分大小寫,而程式員在過濾時通常要麼全部過濾大寫字串,要麼全部過濾小寫字串,而大小寫混合往往會被忽視。如用SelecT代替select,SELECT等;
②UNICODE法:在IIS中,以UNICODE字元集實現國際化,我們完全可以IE中輸入的字串化成UNICODE字串進行輸入。如+ =%2B,空格=%20 等;URLEncode資訊參見附件一;
③ASCII碼法:可以把輸入的部分或全部字元全部用ASCII碼代替,如U=chr(85),a=chr(97)等,ASCII資訊參見附件二;
二、分析資料程式庫伺服器類型
一般來說,ACCESS與SQL-SERVER是最常用的資料庫伺服器,儘管它們都支援T-SQL標準,但還有不同之處,而且不同的資料庫有不同的攻擊方法,必須要區別對待。
1、 利用資料庫伺服器的系統變數進行區分
SQL-SERVER有user,db_name()等系統變數,利用這些系統值不僅可以判斷SQL-SERVER,而且還可以得到大量有用資訊。如:
① HTTP://www.xxx.com/abc.asp?p=YY and user>0 不僅可以判斷是否是SQL-SERVER,而還可以得到當前串連到資料庫的使用者名稱
②HTTP://www.xxx.com/abc.asp?p=YY&;n ... db_name()>0 不僅可以判斷是否是SQL-SERVER,而還可以得到當前正在使用的資料庫名;
2、利用系統資料表
ACCESS的系統資料表是msysobjects,且在WEB環境下沒有存取權限,而SQL-SERVER的系統資料表是sysobjects,在WEB環境下有存取權限。對於以下兩條語句:
①HTTP://www.xxx.com/abc.asp?p=YY and (select count(*) from sysobjects)>0
②HTTP://www.xxx.com/abc.asp?p=YY and (select count(*) from msysobjects)>0
若資料庫是SQL-SERVE,則第一條,abc.asp一定運行正常,第二條則異常;若是ACCESS則兩條都會異常。
3、 MSSQL三個關鍵系統資料表
sysdatabases系統資料表:Microsoft SQL Server 上的每個資料庫在表中佔一行。最初安裝 SQL Server 時,sysdatabases 包含 master、model、msdb、mssqlweb 和 tempdb 資料庫的項。該表只儲存在 master 資料庫中。 這個表儲存在master資料庫中,這個表中儲存的是什麼資訊呢?這個非常重要。他是 儲存了所有的庫名,以及庫的ID和一些相關資訊。
這裡我把對於我們有用的欄位名稱和相關說明給大家列出來。name //表示庫的名字。
dbid //表示庫的ID,dbid從1到5是系統的。分別是:master、model、msdb、mssqlweb、tempdb 這五個庫。用select * from master.dbo.sysdatabases 就可以查詢出所有的庫名。
Sysobjects:SQL-SERVER的每個資料庫內都有此系統資料表,它存放該資料庫內建立的所有對象,如約束、預設值、日誌、規則、預存程序等,每個對象在表中佔一行。
syscolumns:每個表和視圖中的每列在表中佔一行,預存程序中的每個參數在表中也佔一行。該表位於每個資料庫中。主要欄位有:
name ,id, colid :分別是欄位名稱,表ID號,欄位ID號,其中的 ID 是 剛上我們用sysobjects得到的表的ID號。
用: select * from ChouYFD.dbo.syscolumns where id=123456789 得到ChouYFD這個庫中,表的ID是123456789中的所有欄位列表。
【轉】SQL注入原理和方法