Difference between revisions of "XPATH Injection"

From OWASP
Jump to: navigation, search
(Examples)
(Examples)
Line 35: Line 35:
 
VB:
 
VB:
 
Dim FindUserXPath as String
 
Dim FindUserXPath as String
FindUserXPath = "//Employee[UserName/text()='" & Request("Username") & "' And Password/text()='" & Request("Password") & "']"
+
FindUserXPath = "//Employee[UserName/text()='" & Request("Username") & "' And  
 +
        Password/text()='" & Request("Password") & "']"
  
 
C#:
 
C#:
 
String FindUserXPath;
 
String FindUserXPath;
FindUserXPath = "//Employee[UserName/text()='" + Request("Username") + "' And Password/text()='" + Request("Password") + "']";
+
FindUserXPath = "//Employee[UserName/text()='" + Request("Username") + "' And  
 +
        Password/text()='" + Request("Password") + "']";
 
</pre>
 
</pre>
  
Line 45: Line 47:
  
 
<pre>
 
<pre>
Username = ' or 1=1 or 'a'='a
+
Username: blah' or 1=1 or 'a'='a
 +
Password: blah
  
FindUserXPath becomes //Employee[UserName/text()='' or 1=1 or 'a'='a' And Password/text()='']
+
FindUserXPath becomes //Employee[UserName/text()='blah' or 1=1 or  
 +
        'a'='a' And Password/text()='blah']
 +
 
 +
Logically this is equivalent to:
 +
        //Employee[(UserName/text()='blah' or 1=1) or
 +
        ('a'='a' And Password/text()='blah')]
 
</pre>
 
</pre>
 +
 +
In this case, only the first part of the XPath needs to be true.  The password part becomes irrelevant, and the UserName part will match ALL employees because of the "1=1".
  
 
==Related Threats==
 
==Related Threats==

Revision as of 21:06, 1 September 2006

This is an Attack. To view all attacks, please see the Attack Category page.


Description

Similar to SQL Injection, XML Injection attacks occur when a web site uses user supplied information to query XML data. By sending intentionally malformed information into the web site, an attacker can find out how the XML data is structured or access data that they may not normally have access to. They may even be able to elevate their privileges on the web site if the xml data is being used for authentication (such as an xml based user file).

Querying XML is done with XPath, a type of simple descriptive statement that allows the xml query to locate a piece of information. Like SQL you can specify certain attributes to find and patterns to match. When using XML for a web site it is common to accept some form of input on the query string to identify the content to locate and display on the page. This input must be sanitized to verify that it doesn't mess up the XPath query and return the wrong data.

Examples

We'll use this xml snippet for the examples.

<?xml version="1.0" encoding="utf-8"?>
<Employees>
   <Employee ID="1">
      <FirstName>Arnold</FirstName>
      <LastName>Baker</LastName>
      <UserName>ABaker</UserName>
      <Password>SoSecret</Password>
      <Type>Admin</Type>
   </Employee>
   <Employee ID="2">
      <FirstName>Peter</FirstName>
      <LastName>Pan</LastName>
      <UserName>PPan</UserName>
      <Password>NotTelling</Password>
      <Type>User</Type>
   </Employee>
</Employees>

Suppose we have a user authentication system on a web page that used a data file of this sort to login users. Once a username and password had been supplied the software might use an XPath to lookup the user such as this:

VB:
Dim FindUserXPath as String
FindUserXPath = "//Employee[UserName/text()='" & Request("Username") & "' And 
        Password/text()='" & Request("Password") & "']"

C#:
String FindUserXPath;
FindUserXPath = "//Employee[UserName/text()='" + Request("Username") + "' And 
        Password/text()='" + Request("Password") + "']";

With a normal username and password this XPath would work, but an attacker may send a bad username and password and get an xml node selected without knowing the username or password, like this:

Username: blah' or 1=1 or 'a'='a
Password: blah

FindUserXPath becomes //Employee[UserName/text()='blah' or 1=1 or 
        'a'='a' And Password/text()='blah']

Logically this is equivalent to:
        //Employee[(UserName/text()='blah' or 1=1) or 
        ('a'='a' And Password/text()='blah')]

In this case, only the first part of the XPath needs to be true. The password part becomes irrelevant, and the UserName part will match ALL employees because of the "1=1".

Related Threats

Related Attacks

Related Vulnerabilities

Related Countermeasures

Categories

This article is a stub. You can help OWASP by expanding it or discussing it on its Talk page.