Xpath注入攻擊及其防禦技術研究
陸培軍
(南通大學 電腦科學與技術學院,江蘇 南通226019)
摘 要 XML技術被廣泛使用,XML資料的安全性越來越重要。本文簡要介紹了XPath注入攻擊XML資料的原理。在前人提出的防禦通用方法的基礎上,提出一個XPath 注入攻擊通用檢驗模型,模型具有普遍意義。
關鍵詞 XPath注入攻擊; 防禦技術; 模型
1 Xpath注入攻擊概述
1.1 Xpath定義
近年來在現代化電子商務,商場現代化系統中,XML技術被廣泛 的使用,開始出現針對XML資料資訊的XPath注入攻擊技術。 注入攻擊是指利用系統沒有對其輸入進行強制執行或檢查的假設向電腦系統中引入(或 “注入”)代碼的技術。注入代碼的目的通常是繞過或修改程式的最初目標功能,如果被繞過的功能涉及系統安全,那麼結果可能是災難性的。在XML資訊被大量 使用,其資料的安全性顯得非常重要,但是目前很少有研究人員研究XPath的注入攻擊防禦技術。
XPath注入攻擊是指利用XPath 解析器的鬆散輸入和容錯特性,能夠在 URL、表單或其它資訊上附帶惡意的XPath 查詢代碼,以獲得許可權資訊的訪問權並更改這些資訊。XPath注入攻擊是針對Web服務應用新的攻擊方法,它允許攻擊者在事先不知道XPath查詢相關知 識的情況下,通過XPath查詢得到一個XML文檔的完整內容。
1.2 XPath注入攻擊特點
XPath注入攻擊利用兩種技術,即XPath掃描和 XPath查詢布爾化。通過該攻擊,攻擊者可以控制用來進行XPath查詢的XML資料庫。這種攻擊可以有效地對付使用XPath查詢(和XML資料庫) 來執行身分識別驗證、尋找或者其它操作。XPath注入攻擊同SQL注入攻擊類似,但和SQL注入攻擊相比較,XPath在以下方面具有優勢。
(1) 廣泛性。XPath注入攻擊利用的是XPath文法,由於XPath是一種標準語言,因此只要是利用XPath文法的Web 應用程式如果未對輸入的XPath查詢做嚴格的處理都會存在XPath注入漏洞,所以可能在所有的XPath實現中都包含有該弱點,這和SQL注入攻擊有 很大區別。在SQL注入攻擊過程中根據資料庫支援的SQL語言不同,注入攻擊的實現可能不同。
(2) 危害性大。XPath語言幾乎可以引用XML文檔的所有部分,而這樣的引用一般沒有存取控制限制。但在SQL注入攻擊中,一個“使用者”的許可權可能被限制到 某一特定的表、列或者查詢,而XPath注入攻擊可以保證得到完整的XML文檔,即完整的資料庫。只要Web服務應用具有基本的安全性漏洞,即可構造針對 XPath應用的自動攻擊。
2 Xpath注入攻擊原理
XPath注入攻擊主要是通過構建特殊的輸入,這些輸入往往是XPath文法中的一些組合,這些輸入將作為參數傳入Web 應用程式,通過執行XPath查詢而執行入侵者想要的操作,下面以登入驗證中的模組為例,說明 XPath注入攻擊的實現原理。
在Web 應用程式的登入驗證程式中,一般有使用者名稱(username)和密碼(password) 兩個參數,程式會通過使用者所提交輸入的使用者名稱和密碼來執行授權操作。若驗證資料存放在XML檔案中,其原理是通過尋找user表中的使用者名稱 (username)和密碼(password)的結果來進行授權訪問,
例存在user.xml檔案如下:
<users>
<user>
<firstname>Ben</firstname>
<lastname>Elmore</lastname>
<loginID>abc</loginID>
<password>test123</password>
</user>
<user>
<firstname>Shlomy</firstname>
<lastname>Gantz</lastname>
<loginID>xyz</loginID>
<password>123test</password>
</user>
則在XPath中其典型的查詢語句如下:
//users/user[loginID/text()='xyz'and password/text()='123test']
但是,可以採用如下的方法實施注入攻擊,繞過身分識別驗證。如果用 戶傳入一個 login 和 password,例如 loginID = 'xyz' 和 password = '123test',則該查詢語句將返回 true。但如果使用者傳入類似 ' or 1=1 or ''=' 的值,那麼該查詢語句也會得到 true 傳回值,因為 XPath 查詢語句最終會變成如下代碼:
//users/user[loginID/text()=''or 1=1 or ''='' and password/text()='' or 1=1 or ''='']
這個字串會在邏輯上使查詢一直返回 true 並將一直允許攻擊者訪問系統。攻擊者可以利用 XPath 在應用程式中動態地操作 XML 文檔。攻擊完成登入可以再通過XPath盲入技術擷取最高許可權帳號和其它重要文檔資訊。
3 XPath注入攻擊防禦技術
目前專門的XPath攻擊防禦技術還不是太多,但是SQL注入攻擊防禦技術可以加以改進,應用到XPath注入攻擊防禦。具體技術總結如下:
(1)資料提交到伺服器上端,在服務端正式處理這批資料之前,對提交資料的合法性進行驗證。
(2)檢查提交的資料是否包含特殊字元,對特殊字元進行編碼轉換或替換、刪除敏感字元或字串。
(3)對於系統出現的錯誤資訊,以IE錯誤編碼資訊替換,屏蔽系統本身的出錯資訊。
(4)參數化XPath查詢,將需要構建的XPath查詢運算式,以變數的形式表示,變數不是可以執行的指令碼。如下代碼可以通過建立儲存查詢的外部檔案使查詢參數化:
declare variable $loginID as xs:string external;
declare variable $password as xs:string external;
//users/user[@loginID=$loginID and@password= $password]
(5)通過MD5、SSL等密碼編譯演算法,對於資料敏感資訊和在資料轉送過程中加密,即使某些非法使用者通過非法手法擷取資料包,看到的也是加密後的資訊。
4 XPath攻擊防禦模型
4.1 XPath攻擊防禦模型
通過對XPath注入攻擊技術的特點研究其原因,和前人提出的 Xpath注入攻擊檢測與防禦技術的基礎上,作者建立一個最佳化的XPath攻擊防禦模型。如圖1所示,其思想就是所有的驗證都在伺服器端驗證,因為用戶端 驗證可以通過指令碼禁用等方法而繞過。當伺服器接收到用戶端提交過來的資料時,首先檢測其用戶端的IP是否在注入攻擊資料庫中,如果是則直接輸出出錯資訊, 如果不是則驗證是否包含非法字元,如果使用者是首次提交非法資訊,則輸出出錯資訊,如果使用者是第二次提交,則輸出出錯資訊並將該用戶端的IP記入注入攻擊數 據庫中,在兩天之內禁止該使用者訪問,如果資訊合法,則將使用者資訊提交給參數變數,執行安全的查詢,輸出結果。對於記入攻擊資料庫中的IP資訊,兩天后系統 自動刪除,這樣可以防止是因為使用者誤操作而造成合法使用者無法訪問,和某些使用者惡意的多次入侵的企圖。
圖1
通過本模型的驗證,系統可以自動進行入侵防禦,減少人為的進行檢測,節省大量的人力,系統核心代碼如下:
……………………………………
//檢測用戶端IP是否在XPath注入攻擊資料庫中,如果是則禁止訪問
Stringaddress=request.getRemoteAddr().toString();
StringsqlString="select * from ipinjection whereip='"+address+"'";
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
Connectioncn=DriverManager.getConnection("jdbc:odbc:test","sa","ip");
Statementstmt=cn.createStatement();
ResultSetrs=stmt.executeQuery(sqlString);
if(rs.next()){
out.println("非法使用者,禁止進入本系統。");
out.close();
}else{
//如果IP不在攻擊資料庫中,IP地址合法,則進行提交資訊合法性驗證。
if(……………..){
//提交資訊合法,則通過參數化變數的形式,進行查詢,防止進行惡決查詢
Document doc = new Builder().build("users.xml");
XQuery xquery = new XQueryFactory().createXQuery(new File("
dologin.xq"));
Map vars = new HashMap();
vars.put("loginid",username);
vars.put("password",password);
Nodes results = xquery.execute(doc,null,vars).toNodes();
for (int i=0; i < results.size(); i++) {
System.out.println(results.get(i).toXML());
} }else{
//如果提交資訊非法,並且用戶端是首次提交,則直接輸出出錯資訊。
int count=Integer.parseInt(session.getAttribute("count").toString());
if(count==0){
out.println("您進行了非法操作,本系統將記錄您的資訊,如再次進行非法操作,本系統將鎖定您的IP");
session.setAttribute("count",new Integer(count+1));
out.close();
}
else{
//如果提交資訊非法,並且用戶端是第二次提交,則直接輸出出錯資訊。並將用戶端IP記入攻擊資料庫中,禁止該使用者再次進入系統。記入的資料兩天后系統自動刪除,以防止某此使用者是誤操作,造成無法訪問系統的情況
out.println("非法使用者,本系統將禁止您進入。");
sqlstring="inser into ipinjection(ip,host,attacktime,username,password,)
values('"+address+"','"+host+"','"+new Date()+"','"+username+"','"+password+"')";
stmt.executeUpdate(sqlstring);
out.close();
} } }}
4.2 使用方法與實際效果
將所有的代碼放入一個xpathinjection.jsp檔案中,將該檔案包含在需要驗證資訊的檔案中,對於需要驗證其它資訊的,只需要將該代碼進行簡 單修改,將其封裝就可以驗證其它的資訊。通過實際測試,當入侵者在網頁提交一些非法字元達到指定兩次後,系統會自動屏蔽掉該IP 位址對網站的訪問,並將攻擊IP 位址、攻擊時間、攻擊者資訊寫入到資料庫中,具有很好的防注入攻擊效果。
5 結束語
本文闡述了XPath注入攻擊的概念,分析了XPath注入攻擊的原理及其相關防禦技術,根據防禦技術特點,提出了一個自動防禦模型,給出了相應的實現,取得了很好的實際效果。
本文作者創新點: 綜合相應的注入防禦技術,提出了一個自動防禦模型,同時給出了模型的流程與具體實現,對於XPath的注入攻擊防禦具有一定的實用價值。
參考文獻
[1]BoydS,Keromytis A. SQLrand: Preventing SQL injection attacks. In: J akobsson M,Yung M,Zhou J . eds. Proceedings of the 2ndApplied Cryptography and Network Security ( ACNS)Conference. Volume 3089 of Lecture Notesin Computer Sci2ence.,Springer-Verlag,2004. 292~304
[2]Klein,A.: Blind XPath Injection. http://www.packetstormsecurity.org/papers/bypass/Blind_XPath_Injection_20040518.pdf
[3]王競原,胡運發,葛家翔. XPath中的文字查詢研究[J]. 電腦工程,2007,(11)
[4]於瑞萍,劉曉霞,謝倩茹,張明. XML文檔存取控制策略研究[J]. 電腦應用與軟體,2008,(03)
[5]陳楠,薛質.SQL 插入式攻擊的實現和防禦.資訊安全與通訊保密,2005,1:48~50
收稿日期:9月1日 修改日期:9月12日
南通大學自然科學基金項目(03040326)