Xpath注入学习记录

本文详细介绍了XPath注入的概念、原因、示例及其与SQL注入的差异。XPath注入允许攻击者通过构造恶意XPath查询获取XML文档中的敏感信息,甚至提升权限。示例展示了如何利用XPath注入攻破登录验证。防御措施包括输入验证、错误信息统一和黑名单过滤。文章还提及了一个实际的CTF挑战案例,展示了如何进行XPath盲注。

Xpath 简介

XPath 是一门在 XML 文档中查找信息的语言。XPath 可用来在 XML 文档中对元素和属性进行遍历。
XPath 是 W3C XSLT 标准的主要元素,并且 XQuery 和 XPointer 都构建于 XPath 表达之上。
XML 不是 HTML的代替,HTML旨在显示信息,XML旨在显示传输信息,关注的是数据的内容

为什么需要XML

现实生活中一些数据之间往往存在一定的关系。
我们希望能在计算机中保存和处理这些数据的同时能够保存和处理他们之间的关系。
XML就是为了解决这样的需求而产生数据存储格式。

XML 基本格式

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>		<!--xml文件的声明-->
<bookstore>                                                 <!--根元素-->
	<book category="COOKING">        						<!--bookstore的子元素,category为属性-->
		<title>Everyday Italian</title>           			<!--book的子元素,lang为属性-->
		<author>Giada De Laurentiis</author>                <!--book的子元素-->
		<year>2005</year>                                   <!--book的子元素-->
		<price>30.00</price>                                <!--book的子元素-->
	</book>                                                 <!--book的结束-->
</bookstore>                                       			<!--bookstore的结束-->

所有 XML 元素都须有关闭标签。
XML 标签对大小写敏感。
XML 必须正确地嵌套。
XML 文档必须有根元素。
XML 的属性值须加引号。

Xpath注入

Xpath注入攻击是指利用Xpath 解析器的松散输入和容错特性,能够在 URL、表单或其它信息上附带恶意的XPath 查询代码,以获得权限信息的访问权并更改这些信息。
Xpath注入发生在当站点使用用户输入的信息来构造请求以获取XML数据。
攻击者对站点发送经过特殊构造的信息来探究站点使用的XML是如何构造的,从而进一步获取正常途径下无法获取的数据。当XML数据被用作账户验证时,攻击者还可以提升他的权限

Xpath注入的原理和sql注入很像, Xpath注入攻击主要是通过构建特殊的输入,这些输入往往是Xpath语法中的一些组合,这些输入将作为参数传入Web 应用程序,通过执行Xpath查询而执行入侵者想要的操作。
但是注入的对象不是数据库users表了,而是一个存储数据的XML文件。攻击者可以获取 XML 数据的组织结构,或者访问在正常情况下不允许访问的数据。
如果 XML 数据被用于用户认证,那么攻击者就可以提升他的权限。因为Xpath不存在访问控制,所以我们不会遇到许多在SQL注入中经常遇到的访问限制。
XML 中没有访问控制或者用户认证,如果用户有权限使用 Xpath 查询,并且之间没有防御系统或者查询语句没有被防御系统过滤,那么用户就能够访问整个 XML 文档。

举个例子

Xpath 的查询语句通常是下面这种类似的样子去验证登录,很显然可以像SQL注入那样去构造 'or '1'='1 这种永真式去执行

$query = "/root/users/user[username/text()='".$name."' and password/text()='".$pwd."']";

例子 1

<?php

$xml = simplexml_load_file('blog.xml');
$name = $_GET['name'];
$pwd = md5($_GET['pwd']);
$query = "/root/users/user[username/text()='".$name."' and password/text()='".$pwd."']";
echo $query;
$result = $xml->xpath($query);
if($result) {
   
   
    echo '<h2>Welcome</h2>';
    foreach ($result as $key => $value) {
   
   
        echo '<br />ID:'.$value->id;
        echo '<br />Username:'.$value->username;
    }
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

paidx0

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值