看好你的門-攻擊資料儲存區(4)-XPath注入攻擊
阿新 • • 發佈:2019-01-25
首先需要宣告,本文純屬一個毫無遠見和真才實學的小小開發人員的愚昧見解,僅供用於web系統安全方面的參考。
1、一些多餘的話
XPath注入和SQL注入,原理上非常相似
但是XPath注入的物件主要是XML,相對來說,危害性更加大
2、儲存使用者資訊的XML
<?xml version="1.0" encoding="utf-8" ?>
<root>
<user>
<id>1</id>
<username>admin</username>
<password>123</password >
</user>
<user>
<id>5</id>
<username>ffm</username>
<password>1</password>
</user>
</root>
3、潛在漏洞的匹配語句
XPathExpression expr = xpath.compile("//root/user[username/text()='"
+ username + "'and password/text()='" + password + "']" );
類似這種拼裝的語句,天生就有被攻擊的可能性。
3、實現XPath注入的JAVA登陸驗證原始碼
package com.struts2;
import javax.xml.parsers.*;
import javax.xml.xpath.*;
import org.w3c.dom.*;
import com.opensymphony.xwork2.ActionSupport;
/**
* 一個簡單的XPath認證功能,僅用於說明情況
*
* @author 範芳銘
*/
public class XPathLoginAction extends ActionSupport {
public String execute() throws Exception {
return "success";
}
public boolean getXPathInfo(String username, String password)
throws Exception {
DocumentBuilderFactory domFactory = DocumentBuilderFactory.newInstance();
domFactory.setNamespaceAware(true);
DocumentBuilder builder = domFactory.newDocumentBuilder();
XPathFactory factory = XPathFactory.newInstance();
XPath xpath = factory.newXPath();
Document doc = builder.parse("D:/ffm83/user.xml");
XPathExpression expr = xpath.compile("//root/user[username/text()='"
+ username + "'and password/text()='" + password + "']");
Object result = expr.evaluate(doc, XPathConstants.NODESET);
NodeList nodes = (NodeList) result;
if (nodes.getLength() >= 1) {
System.out.println("登陸成功。");
return true;
}
else {
System.out.println("使用者名稱或者密碼錯誤,登陸失敗。");
return false;
}
}
public static void main(String[] args) throws Exception {
XPathLoginAction xpath = new XPathLoginAction();
xpath.getXPathInfo("ffm", "1");
}
}
5、執行情況
xpath.getXPathInfo(“ffm”, “1”);
登陸成功。
xpath.getXPathInfo(“ffm”, “2”);
使用者名稱或者密碼錯誤,登陸失敗。
6、簡單模擬攻擊
在密碼欄位輸入:’ or ‘1’=’1
xpath.getXPathInfo(“ffm”, “’ or ‘1’=’1”);
執行後發現:
登陸成功。
已經被成功進行XPath注入。