天天看點

《Java編碼指南:編寫安全可靠程式的75條建議》—— 指南8:防止XPath注入

本節書摘來異步社群《java編碼指南:編寫安全可靠程式的75條建議》一書中的第1章,第1.8節,作者:【美】fred long(弗雷德•朗), dhruv mohindra(德魯•莫欣達), robert c.seacord(羅伯特 c.西科德), dean f.sutherland(迪恩 f.薩瑟蘭), david svoboda(大衛•斯沃博達),更多章節内容可以通路雲栖社群“異步社群”公衆号檢視。

可擴充标記語言(extensible markup language,xml)可用于以類似于關系資料庫的方式來存儲資料。xml文檔中的資料通常是用xpath來檢索。當給xpath檢索例程提供的資料沒有做合适的無害化處理時,就有可能會導緻xpath注入(xpath injection)攻擊。這種攻擊類似于sql注入或xml注入(參見《the cert® oracle® secure coding standard for java™》[long 2012]的“ids00-j. sanitize untrusted data passed across a trust boundary”。攻擊者可以在查詢用的資料字段中輸入有效的sql構造或xml構造。典型的攻擊是,讓條件查詢字段解析為一個永真式,這樣就會導緻攻擊者通路到未經授權的資訊。

該指南是指南7的一個具體示例。

xml路徑注入示例

先來看看下面的xml模式。

//users/user[username/text()='&login&' and

 password/text()='&amp;password&amp;' ]<code>`</code>

如果攻擊者知道utah是一個有效的使用者名,他可以指定一個下面這樣的輸入:

//users/user[username/text()='utah' or '1'='1'

 and password/text()='xxxx']<code>`</code>

因為'1'='1'自動為真,是以密碼永遠也不會被檢查。是以,攻擊者在不知道使用者utah的密碼的情況下被不适當地驗證成了該使用者。

下面的違規代碼示例從使用者輸入中讀取使用者名和密碼,并使用它們來建構查詢字元串,将密碼以字元數組的形式傳遞,然後對其進行散列加密。這個示例容易受到上面提到的那種方式的攻擊。如果将上面描述的攻擊字元串傳遞給evaluate()方法,這個方法調用會傳回xml檔案中的相應節點,這會導緻dologin()方法傳回true,并繞過所有授權。

輸入檔案:login.xq

declare variable $username as xs:string external;

declare variable $password as xs:string external;

//users/user[@username=$username and @password=$password]<code>`</code>

下面的合規解決方案從一個文本檔案中讀取所需的特定格式的查詢語句,然後将使用者名和密碼的值插入一個映射中。xquery庫構造了這些來自使用者輸入的xml查詢。

根據owasp [owasp 2013]: