1. 程式人生 > >看好你的門-攻擊資料儲存區(4)-XPath注入攻擊

看好你的門-攻擊資料儲存區(4)-XPath注入攻擊

首先需要宣告,本文純屬一個毫無遠見和真才實學的小小開發人員的愚昧見解,僅供用於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注入。