Lesson
Plan Title: How to
Perform XPATH Injection Attacks.
Concept /
Topic To Teach:
This lesson
teaches how to perform XPath Injection attacks.
How the
attacks works:
Similar to SQL
Injection, XPATH 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.
General
Goal(s):
The
form below allows employees to see all their personal data including their
salaries. Your account is Mike/test123. Your goal is to try to see other
employees data as well.
Figure 1 XPath Injection
XPath injection is similar to SQL Injection. Input is not validated and
used to create a XPath query. Here you can see how the XPATH query is built:
String dir = s.getContext().getRealPath("/lessons/XPATHInjection/EmployeesData.xml");
File d = new File(dir);
XPathFactory factory = XPathFactory.newInstance();
XPath xPath = factory.newXPath();
InputSource inputSource = new InputSource(new FileInputStream(d));
String expression = "/employees/employee[loginID/text()='" + username + "' and passwd/text()='" + password + "']";
nodes = (NodeList) xPath.evaluate(expression, inputSource, XPathConstants.NODESET);
Figure 2 Inject XPath payload
Injecting Smith' or 1=1 or 'a'='a will log you on
as the first user defined in the system. Password is a required field, so there
you can enter whatever you want.
This is what the server gets:
expression = "/employees/employee[loginID/text()='Smith' or 1=1 or 'a'='a' and passwd/text()='password']"
And this is how the server interprets it:
expression = "/employees/employee[ ( loginID/text()='Smith' or 1=1 ) OR ( 'a'='a' and passwd/text()='password' ) ]"
Figure 3 Lesson completed
Solution by Erwin Geirnaert | ![]() |