天天看點

Xpath注入攻擊及其防禦技術研究

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>

         <firstname>Shlomy</firstname>

         <lastname>Gantz</lastname>

         <loginID>xyz</loginID>

         <password>123test</password>

    則在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);

}   } }}

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)