SQL注入原理和方法

最近在做的項目是網絡安全評估的內容,其中包含***測試,而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中的所有字段列表。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章