XPath 基础知识

XPath是一种查询XML文档的语言,它可以用来定位和选择XML文档中的节点,同时还支持对节点进行数据操作。下面是一些常见的XPath增删改查语句命令:

查询语句:

//:选择文档中所有符合条件的节点
/:选择当前节点的直接子节点
..:选择当前节点的父节点
@:选择当前节点的属性
text():选择当前节点的文本内容
例如:

//book:选择文档中所有名为"book"的节点
/library/book:选择根节点下名为"library"节点中所有名为"book"的子节点
/library/*:选择根节点下名为"library"节点中所有子节点
/library//book:选择根节点下名为"library"节点中所有后代节点中名为"book"的节点
/library/book[1]:选择根节点下名为"library"节点中第一个名为"book"的子节点
/library/book[@id='1234']:选择根节点下名为"library"节点中所有id属性值为"1234"的子节点
//title/text():选择文档中所有名为"title"的节点的文本内容
修改语句:

insert-before(): 在某个节点之前插入一个新节点Q
insert-after(): 在某个节点之后插入一个新节点
copy-of(): 复制已有的节点到另一个位置
remove(): 删除某个节点
例如:

insert-before(/library/book[1], New Book):在根节点下名为"library"节点中第一个名为"book"的子节点之前插入一个包含"title"子节点的新"book"节点
remove(/library/book[@id='1234']):删除根节点下名为"library"节点中id属性值为"1234"的所有"book"节点
这里只列举了一些XPath语句的示例,实际应用中需要根据具体需求进行组合和调整。

Xpath注入代码

//index.php  

<?php
$re = array('and','or','count','select','from','union','group','by','limit','insert','where','order','alter','delete','having','max','min','avg','sum','sqrt','rand','concat','sleep');
setcookie('injection','c3FsaSBpcyBub3QgdGhlIG9ubHkgd2F5IGZvciBpbmplY3Rpb24=',time()+100000);
if(file_exists('t3stt3st.xml')) {
    $xml = simplexml_load_file('t3stt3st.xml');
    $user=$_GET['user'];
    $user=str_replace($re, ' ', $user);
  //  $user=str_replace("'", "&apos", $user);
    $query="user/username[@name='".$user."']";
  
    $ans = $xml->xpath($query);
    foreach($ans as $x => $x_value)
    {
        echo $x.":  " . $x_value;
        echo "<br />";
    }
}
?>  

//t3stt3st.xml  

<?xml version="1.0" encoding="utf-8"?>
<root1>
    <user>
        <username name='user1'>user1</username>
        <key>KEY:1</key>
        <username name='user2'>user2</username>
        <key>KEY:2</key>
        <username name='user3'>user3</username>
        <key>KEY:3</key>
        <username name='user4'>user4</username>
        <key>KEY:4</key>
        <username name='user5'>user5</username>
        <key>KEY:5</key>
        <username name='user6'>user6</username>
        <key>KEY:6</key>
        <username name='user7'>user7</username>
        <key>KEY:7</key>
        <username name='user8'>user8</username>
        <key>KEY:8</key>
        <username name='user9'>user9</username>
        <key>KEY:9</key>
    </user>
    <hctfadmin>    
        <username name='hctf1'>hctf</username>
        <key>flag:hctf{Dd0g_fac3_t0_k3yboard233}</key>
    </hctfadmin>
</root1>
XPath基础
XPath 是一门在 XML 文档中查找信息的语言。

结点
在 XPath 中,有七种类型的节点:元素、属性、文本、命名空间、处理指令、注释以及文档节点(或称为根节点)。节点之间存在父、子、先辈、后代、同胞关系,以t3stt3st.xml为例
根节点<root1> 、元素节点<user><username><key><hctfadmin> 、属性节点name='user1'
<root1>是<user>和<htcfadmin>的父节点,同时也是<user><hctfadmin><username><key>的先辈。<username>和<key>是同胞节点。

路径表达式
表达式	描述
nodename	选取此节点的所有子节点
/	从根节点选取
//	从匹配选择的当前节点选择文档中的节点,而不考虑它们的位置
.	选取当前节点
..	选取当前节点的父节点
@	选取属性
[]	查找某个特定的节点或者包含某个指定的值的节点。

通配符
通配符	描述
*	匹配任何元素节点
@*	匹配任何属性节点
node()	匹配任何类型的节点

选取若干路径
通过在路径表达式中使用“|”运算符,可以选取若干个路径。

XPath注入
从index.php源码可知XPath查询语句为$query="user/username[@name='".$user."']", 且$user经过关键字替换。但是黑名单$re中都为SQL关键字,所以并不影响对XPath进行注入。我们可以构造payload如 ']|//*|zzz['来进行注入,获取文档中的所有元素节点。
posted @ 2023-05-08 16:09  不聪明的小子  阅读(99)  评论(0编辑  收藏  举报