zl程序教程

您现在的位置是:首页 >  其他

当前栏目

web渗透测试----17、Xpath漏洞

漏洞测试Web ---- 渗透 17 xpath
2023-09-11 14:17:06 时间


一、XPath简介

XPath 是一门在 XML 文档中查找信息的语言。XPath 用于在 XML 文档中通过元素和属性进行导航。
如下XML代码文件:

<?xml version="1.0" encoding="UTF-8" ?>

<students>
    <student number="zr_0001">
        <name id="zr">
            <xing></xing>
            <ming></ming>
        </name>
        <age>18</age>
        <sex>male</sex>
    </student>
    <student number="zr_0002">
        <name id = "itcast">lisi</name>
        <age>24</age>
        <sex>female</sex>
    </student>

</students>

利用XPath来获取某些标签

public static void main(String[] args) throws IOException, XpathSyntaxErrorException {
	        //获取student.xml的path
	        String path = JsoupDemo2.class.getClassLoader().getResource("student.xml").getPath();
	        //获取Document对象
	        Document document = Jsoup.parse(new File(path),"UTF-8");
	        //根据document对象,创建JXDocument对象
	        JXDocument jxDocument = new JXDocument(document);
	        //结合xpath语法查询
	        //查询所有子元素标签
	        List<JXNode> jxNodes = jxDocument.selN("//student");//  //表示选取所有的子元素,不考虑其在文档的位置
	        for (JXNode jxNode : jxNodes) {
	            System.out.println(jxNode);
	        }
	        System.out.println("-----------------------------------");
	        //查询某个子元素下的某类标签,比如我们获取student下的name标签
	        List<JXNode> jxNodes2 = jxDocument.selN("//student/name");//  //表示选取所有的子元素,不考虑其在文档的位置
	        for (JXNode jxNode : jxNodes2) {
	            System.out.println(jxNode);
	        }
	
	
	        System.out.println("---------------------------------");
	        //查询student标签下带有id属性的name标签
	        List<JXNode> jxNodes3 = jxDocument.selN("//student/name[@id]");//  //表示选取所有的子元素,不考虑其在文档的位置
	        for (JXNode jxNode : jxNodes3) {
	            System.out.println(jxNode);
	        }
	
	
	        System.out.println("----------------------------------");
	        //查询student标签下带有id属性的name标签 并且id属性值为itcast
	        List<JXNode> jxNodes4 = jxDocument.selN("//student/name[@id='itcast']");//  //表示选取所有的子元素,不考虑其在文档的位置
	        for (JXNode jxNode : jxNodes4) {
	            System.out.println(jxNode);
	        }
	    }

二、XPath注入原理

Xpath注入攻击是指利用XPath解析器的松散输入和容错特性,能够在URL、表单或其他信息上附带恶意的Xpath查询代码,以获得权限信息的访问权并更改这些信息。XPath 注入与 SQL 注入类似,均是通过构造恶意的查询语句,对应用程序进行攻击。


三、XPath注入攻击实现

SQL中存在权限的概念,所以在数据库和程序中都可以对数据库权限进行防护,但是XPath数据管理不受权限控制,在表单中提交恶意的 XPath代码,就可以获取到权限限制数据的访问权限,并可以修改这些数据,也可以通过构造恶意查询语句获取到系统内部完整的XML文档,进而进行用户权限提升等操作。

XPath注入攻击主要是通过构建特殊的输入,这些输入往往是XPath语法中的一些组合,这些输入将作为参数传入Web 应用程序,通过执行XPath查询而执行入侵者想要的操作,下面以登录验证中的模块为例,说明 XPath注入攻击的实现原理。

在Web 应用程序的登录验证程序中,一般有用户名(username)和密码(password) 两个参数,程序会通过用户所提交输入的用户名和密码来执行授权操作。若验证数据存放在XML文件中,其原理是通过查找user表中的用户名 (username)和密码(password)的结果来进行授权访问,

例存在user.xml文件如下:

<users>
     <user>
         <firstname>Ben</firstname>
         <lastname>Elmore</lastname>
         <loginID>abc</loginID>
         <password>test123</password>
     </user>
     <user>
         <firstname>Shlomy</firstname>
         <lastname>Gantz</lastname>
         <loginID>xyz</loginID>
         <password>123test</password>
     </user>

则在XPath中其典型的查询语句为:

 //users/user[loginID/text()='xyz'and password/text()='123test']

但是,可以采用如下的方法实施注入攻击,绕过身份验证。
如果用 户传入一个 login 和 password,例如 loginID = ‘xyz’ 和 password = ‘123test’ ,则该查询语句将返回 true。但如果用户传入类似 ’ or 1=1 or ‘’=’ 的值,那么该查询语句也会得到 true 返回值,因为 XPath 查询语句最终会变成如下代码:

//users/user[loginID/text()=''or 1=1 or ''='' and password/text()='' or 1=1 or ''='']

这个字符串会在逻辑上使查询一直返回 true 并将一直允许攻击者访问系统。攻击者可以利用 XPath 在应用程序中动态地操作 XML 文档。攻击完成登录可以再通过XPath盲注技术获取最高权限帐号和其它重要文档信息。


四、XPath注入的防御

1、对用户的输入进行合理验证,对特殊字符(如<、>、’、”等)等进行转义。过滤可以在客户端和服务端两边实现,如果可能的话,建议两者同时进行过滤。
2、创建一份安全字符白名单,确保 XPath 查询中由用户控制的数值完全来自于预定的字符集合,不包含任何 XPath 元字符。
3、使用源代码静态分析工具,进行自动化的检测,可以有效的发现源代码中的 XPath 注入问题。