葛昕,楊小東,岳敏楠
(1.上海理工大學網絡中心,上海200093;2.上海理工大學研究生部,上海200093)
基于.NET的信息系統SQL注入防御研究*
葛昕1,楊小東2,岳敏楠1
(1.上海理工大學網絡中心,上海200093;2.上海理工大學研究生部,上海200093)
使用.NET開發信息系統是近年來高校廣泛采用的一種形式,因此針對它的攻擊也日益增多,其中最為嚴重的SQL注入攻擊,可以徹底摧毀數據庫,并給攻擊者打開登錄系統的后門。本文以上海理工大學研究生信息系統和Web網站為研究樣本,分析了流行的注入攻擊代碼,給出了修復此攻擊的方法,并設計了一套行之有效的SQL注入防御系統,此方法在實際應用中得到了證明。
.NET;SQL注入;存儲過程;信息系統
隨著網絡基礎建設日趨成熟,信息系統的應用也越來越廣泛,而同時產生的問題就是網絡攻擊的不斷出現。在眾多的攻擊手段中,SQL注入式攻擊是較易掌握并容易獲得成功的一種攻擊方式,特別是一些自動化的SQL注入工具的出現,如NBSI2、DOMAIN3等,更是使得許多動態站點成為SQL攻擊下的犧牲品。而造成這種情況的一個主要原因就是程序員在編寫程序時沒有對用戶提交數據的合法性進行驗證,從而使得程序存在隱患。SQL注入是從正常的WWW端口訪問,表面看起來跟一般的Web頁面訪問沒什么區別,這類攻擊屬于應用層攻擊,所以以往的基于包過濾法、基于狀態檢測法等完全無效。要解決SQL注入攻擊問題,就必須在應用層進行充分的防范來確保系統的安全。上海理工大學研究生部的多個應用系統都采用了.NET+SQL作為開發環境,本文就是以此為平臺進行研究。
SQL注入攻擊的具體過程為:發現SQL注入位置;判斷后臺數據庫類型;確定XP_CMDSHELL可執行情況;發現Web虛擬目錄;上傳ASPX木馬;得到管理員權限。[1]發現SQL注入位置是整個攻擊的源頭,攻擊者將某些經過精心構造的特殊的SQL字符串插入到Web表單的輸入域,欺騙服務器執行惡意的SQL命令,即可判斷出是否存在注入點。[2]SQL注入的手法相當靈活,在注入時通過構造巧妙的SQL語句,可以使系統錯誤地授權給攻擊者,幫助其成功獲取想要的數據,或者修改數據,進而在網站進行掛馬操作。以下是近來最為流行的注入攻擊的存儲過程,其結果可以將數據庫中多數類似varchar字段的內容修改為木馬地址來進行系統掛馬。
DECLARE@T varchar(255),@C varchar(255)
DECLARE Table_Cursor CURSOR FOR//定義游標
SELECTa.name,b.nameFROM sysobjectsa,syscolumnsb
WHERE a.id=b.id AND a.xtype=′u′AND(b.xtype =99 OR b.xtype=35 OR b.xtype=231 OR b.xtype=167) //當表字段類型為ntext、text、xtype、nvarchar、varchar時
OPENTable_CursorFETCHNEXTFROM Table_Cursor INTO@T,@C
WHILE(@@FETCH_STATUS=0)
BEGIN
EXEC(′update[′+@T+′]set[′+@C+′]=rtrim (convert(varchar,[′+@C+′]))+′′<script src=http://掛馬網站地址/1.js></script>′′′)//將字段內容修改為掛馬網站地址
FETCH NEXT FROM Table_Cursor INTO@T,@C
END
CLOSE Table_Cursor DEALLOCATE Table_Cursor
這種方式利用系統代碼中存在的漏洞進行注入,先遍歷數據庫中某些特定字段類型,將記錄中該字段插入含有js文件的惡意script標簽,即木馬的地址。雖然這些js文件的內容不同,但是他們都嘗試利用已經被修復的Microsoft產品的漏洞或者第三方ActiveX控件的漏洞。由于這些腳本被單獨存儲,因此很容易被更新以利用客戶端更新的漏洞,也更容易按照不同瀏覽器來定制。對于這種破壞,我們只要采用類似注入攻擊的方法將注入代碼中間部分替換為如下代碼,運行后即可將數據庫中的惡意代碼刪除。
DECLARE@str varchar(500)//聲明要替換的字符
set@str=′<script src=http://掛馬網站地址/1.js></ script>′//這里是你要替換的字符
OPEN Table_Cursor FETCH NEXT FROM Table_ Cursor INTO@T,@C
WHILE(@@FETCH_STATUS=0)
BEGIN
EXEC(′update[′+@T+′]set[′+@C+′]=replace (cast([′+@C+′]as varchar(8000)),′′′+@str+′′′,′′′′)′) //清除記錄內容中含有的木馬地址
FETCH NEXT FROM Table_Cursor INTO@T,@C
END
為了能夠主動地防御SQL注入攻擊,我們可以將所有傳入的SQL參數全部使用存儲過程來實現,但對于一些已經在使用的系統顯然不現實,而且使用分頁存儲時如果進行拼接字串來替換危險字符仍會有漏洞。為了保護原有代碼不做修改,可以采用另一種方法,對傳入參數進行過濾。本文設計了一個綜合防御系統,包括三個部分:檢測模塊、過濾模塊和記錄模塊。檢測模塊用于檢測系統數據庫是否已受注入破壞,過濾模塊對所有要傳入的參數做SQL關鍵字符過濾,日志模塊用于對嘗試注入的攻擊進行日志記錄,幫助管理員進行日常安全性分析與維護。對于所有使用.NET+SQL構造的信息系統,只要將過濾模塊加載在所有要使用數據庫系統的頁面中即可實現對SQL注入的防御。以下只列出最為核心的過濾模塊和日志模塊中的關鍵代碼。
//判斷用戶請求字符是否含有SQL注入攻擊字符
private bool ProcessSqlStr(string Str)//Str為用戶提交數據
{bool ReturnValue=true;
try{if(Str.Trim()!="")
{string SqlStr="and|exec|insert|select |delete|update|count|*|chr|mid|master|truncate|char| declare";//用戶可自行定義過濾參數
string[]anySqlStr=SqlStr.Split(′|′);
foreach(string ss in anySqlStr)
{if(Str.ToLower().IndexOf(ss)>=0)
{ReturnValue=false;
break;}
}
}
}
catch{ReturnValue=false;}
return ReturnValue;
}
在服務器上建立一個文件夾AttackLog,創建日志文件log.aspx用于存放每天SQL攻擊操作產生的日志。以下為記錄日志部分核心代碼。
public partial class ErrorLog_Log:System.Web.UI.Page
{
protected void Page_Load(objectsender,EventArgse)
{
Log(HttpUtility.UrlDecode(Request["PreUrl"]));
}
private void Log(string url)
{
DateTime dt=DateTime.Now;
string fileName=Server.MapPath("/AttackLog") +"\Log"+dt.ToString("yyyy_MM_dd")+".log";
string content=dt.ToString()+","+Request. UserHostAddress+","+url+" ";
File.AppendAllText(fileName,content);
//Response.Redirect("/errorPage.htm l");
}
}
對于.NET開發的信息系統,被攻擊的根本原因還是程序編碼有漏洞,故在編寫程序時,可以參考以下建議,加強程序代碼的安全性。
第一,在構造動態SQL語句時,使用類安全的參數代碼機制。
第二,限制表單或查詢字符串輸入的長度,這可以很大程度上增加攻擊者在SQL命令中插入有害代碼的難度。
第三,檢查用戶輸入的合法性,確信輸入的內容只包含合法的數據。為了彌補客戶端驗證機制脆弱的安全性,數據檢查在服務器端也需要執行。
第四,在部署應用前,對所有的編碼做安全審評。不把敏感數據在數據庫里以明文存放。敏感數據應該在單向加密過后再存放。將用戶輸入的數據加密后,再與數據庫中保存的數據比較,相當于對用戶輸入的數據進行了“消毒”處理,用戶輸入的數據不再對數據庫有任何特殊的意義,從而也就防止了攻擊者注入SQL命令。
第五,檢查提取數據的查詢所返回的記錄數量。如果程序只要求返回一個記錄,但實際返回的記錄卻超過一行,那就當作出錯處理。
第六,只給訪問數據庫的Web應用功能所需的最低權限。
本文分析了流行的SQL注入方法及恢復手段。設計了一個簡單有效的防御系統,可對常見SQL注入進行阻斷,其日志功能在記錄攻擊數據形式的同時為我們進一步完善系統指出了方向。系統采用頁面調用形式,可移植性強、部署簡單,并可自定義過濾參數。上海理工大學研究生部采用.NET+SQL Server開發了多個信息應用系統,從Web站點到綜合教務管理系統在前期都不斷受到各種SQL注入攻擊的考驗。在部署了本防御系統后,經過長期運行,在各個應用系統上都起到了很好的攔截效果,為保證信息系統的穩定運行提供了可靠的保障。☉
[1]張洪星,褚建立.基于ASP.NET的SQL注入攻擊及防范解決方案[J].電腦知識與技術,2006(35).
[2]戴詩發.校園網SQL注入攻擊與防范技術研究[J].昆明理工大學學報,2005.Vol.30(3).
(編輯:隗爽)
book=11,ebook=16
TP309.2
A
1673-8454(2010)13-0011-03
*本文受上海市研究生教育創新計劃資助,項目編號:SLCXPY1001。