freeBuf
主站

分类

云安全 AI安全 开发安全 终端安全 数据安全 Web安全 基础安全 企业安全 关基安全 移动安全 系统安全 其他安全

特色

热点 工具 漏洞 人物志 活动 安全招聘 攻防演练 政策法规

点我创作

试试在FreeBuf发布您的第一篇文章 让安全圈留下您的足迹
我知道了

官方公众号企业安全新浪微博

FreeBuf.COM网络安全行业门户,每日发布专业的安全资讯、技术剖析。

FreeBuf+小程序

FreeBuf+小程序

【由浅入深_打牢基础】一文搞懂XPath 注入漏洞
2022-07-10 16:17:33
所属地 北京

1. XPath简介

XPath的作用就是用于在XML或HTML中查找信息,就像SQL语句的作用是在数据库中查询信息一样。

建议没接触过的试着写写如下代码,亲身尝试一下xpath查询,理解的会更加深刻

我这里对XPath的语法进行简单的举例:

在XPath中,XML文档被作为节点树对待,XPath中有七种结点类型:元素、属性、文本、命名空间、处理指令、注释以及文档节点(或成为根节点)。

nodename:选取此节点的所有节点

/:从根节点选取

//:表示选取所有的子元素,不考虑其在文档的位置

.:选取当前节点

..:选取当前节点的父节点

@:选取属性

函数:

starts-with 匹配一个属性开始位置的关键字

contains 匹配一个属性值中包含的字符串

text() 匹配的是显示文本信息

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

<students>
    <student number="1">
        <name id="zs">
            <xing>张</xing>
            <ming>三</ming>
        </name>
        <age>18</age>
        <sex>male</sex>
    </student>
    <student number="2">
        <name id = "ls">李四</name>
        <age>24</age>
        <sex>female</sex>
    </student>

</students>

这里根节点是<students>
像<xing>或者<name>这些都可以叫元素节点
id="zs"这些事属性节点

上边是一个简单的XML文档,那么接下来用Xpath来查语句(这里用python语言举例,人生苦短我用python)

from lxml import etree

xml ='''
  <students>
    <student number="1">
        <name id="zs">
            <xing>张</xing>
            <ming>三</ming>
        </name>
        <age>18</age>
        <sex>male</sex>
    </student>
    <student number="2">
        <name id = "ls">李四</name>
        <age>24</age>
        <sex>female</sex>
    </student>

</students>
'''
tree = etree.XML(xml)
#选所有students,选第一个值->students->student->name->xing的文本
out = tree.xpath('//students')[0][0][0][0].text
print(out)
print('-------------------------------------')
#所有name元素,第二个也就是李四那个,选它的文本
out = tree.xpath('//name')[1].text
print(out)
out = tree.xpath('//name')[1].xpath('@id')
print(out)

结果如下

image-20220710120715934

函数演示结果如下:

image-20220710151226817

再来一个

image-20220710151601067


2. Xpath 注入攻击

正如之前所说,它就像sql语句再查询数据库,既然如此那同样也可能存在注入,下边举个例子

比如正常网站存在如下登录代码

from lxml import etree

xml ='''
  <students>
 <student>
    <id>admin</id>
    <password>123456</password>
 </student>
</students>
'''
tree = etree.XML(xml)
username = input('请输入用户名')
password = input('请输入密码')
out = tree.xpath('/students/student[id/text()="'+username+'" and password/text()="'+password+'"]')
print('登录成功,欢迎您'+out[0][0].text)

我们正常登录

image-20220710124132389

当然也可以不正常登录

image-20220710125423036

此时语句就变成了如下所示,就可以绕过了

/students/student[id/text()="admin" and password/text() = "" or ""=""]

3. Xpath注入示例

3.1 墨者靶场

image-20220710133906516

可以看到name值传了个xml,首先是字符串那它肯定有单双引号闭合,先假设它是单引号,之后我们想把所有数据读出来,那我尝试一下构造恒等条件

' or ''='

image-20220710134549988

一发入魂


bWAPP靶场下载:https://pan.baidu.com/s/1Cpo0k2BRRv9U7fxGmRKdCA,提取码后台回复0004

image-20220710141552720

解决乱序问题:system-->Preferences-->keyboard,去设置并选定为china,然后重启

image-20220710144226865

3.2 bWAPP--XPath(Login Form)

我这里用户名和密码输入的都是admin然后登陆,发现url变了

image-20220710144334503

尝试构造'or''='

image-20220710145328575


3.3.bWAPP--XPath(Search)

首先加一个'发现保存,存在xpath注入

image-20220710152029646

紧接着老规矩

image-20220710152100261

发现不太行,那么观察到movie返回的事好几个值,那么我们就直接构造payload返回所有值,这时候需要用到运算符|,它的作用就是集合,也就是能把后边我们自己构造查出来的值显示出来

' | //* or''='' or ''='

image-20220710152623735

发现报错,也就证明我们的闭合没有处理好,那么也就不单单是单引号闭合那么简单了,所以我们应该首先想到[],所以假设存在[]构造payload,如下

'] | //* | test[a='a

发现依然报错

image-20220710152828913

那就得往更复杂了想,就是可能使用了函数存在还存在()这个符号,所以假设使用了函数继续构造

')] | //* | test[a=('a

OK了,全出来了

image-20220710153033930


靶场搭建参考:https://www.cnblogs.com/sillage/p/13895046.html

# 渗透测试 # web安全 # 漏洞分析
免责声明
1.一般免责声明:本文所提供的技术信息仅供参考,不构成任何专业建议。读者应根据自身情况谨慎使用且应遵守《中华人民共和国网络安全法》,作者及发布平台不对因使用本文信息而导致的任何直接或间接责任或损失负责。
2. 适用性声明:文中技术内容可能不适用于所有情况或系统,在实际应用前请充分测试和评估。若因使用不当造成的任何问题,相关方不承担责任。
3. 更新声明:技术发展迅速,文章内容可能存在滞后性。读者需自行判断信息的时效性,因依据过时内容产生的后果,作者及发布平台不承担责任。
本文为 独立观点,未经授权禁止转载。
如需授权、对文章有疑问或需删除稿件,请联系 FreeBuf 客服小蜜蜂(微信:freebee1024)
被以下专辑收录,发现更多精彩内容
+ 收入我的专辑
+ 加入我的收藏
相关推荐
  • 0 文章数
  • 0 关注者
文章目录