XPATH注入哪些坑

极客

哎哟喂!XPATH注入这些坑,我踩得鞋都烂了,今天必须跟你唠明白!

开头先叹口气:这玩意儿是真磨人

兄弟姐妹们,不是我矫情啊,XPATH注入这事儿,我真是踩坑踩到怀疑人生,你说SQL注入好歹教程满天飞,到了XPATH这儿,网上一搜全是“基础入门”,一实操全是“卧槽怎么又报错”?今天我就把自己那点血泪史翻出来晾晾,语气可能有点激动,但你听我说完,绝对能少走俩月弯路!

XPATH注入哪些坑

第一大坑:以为XPATH注入就是“SQL注入的换皮”

哎呀,我当时就这么想的!拿着SQL注入那套' or '1'='1就往XPATH里怼,结果呢?直接被解析器骂得狗血淋头,拜托啊老铁,XPATH查询的是XML文档,不是关系型数据库!它没有注释符,没有UNION SELECT那套花活,你得用count()string()substring()这些函数组合拳,最气人的是,很多工具根本不支持XPATH注入检测,我一开始全靠手工盲注,那个酸爽……眼睛都快瞅瞎了

第二大坑:忽略“布尔化”陷阱,魂都被它勾走

唉,说到这个我就来气,XPATH注入最常用的盲注手法是构造布尔条件,

//user[username='admin' and substring(password,1,1)='a']

乍一看没毛病吧?但坑就坑在这——XML文档的标签结构千变万化,你要是没搞清节点路径,随便加个就想通配?门儿都没有!我遇到过最妖的案例,是目标XML里有一堆注释节点和CDATA,结果我的布尔条件全他妈歪了,判断结果完全相反。那一刻我连砸电脑的心都有了!后来才明白,得先用name()count()把文档结构摸得明明白白,再动手。

第三大坑:输出编码问题,折磨得我头秃

兄弟,你以为注入了就万事大吉?太天真了!我最惨的一次,注入了半天取到了用户名和密码字段,结果页面回来一堆HTML实体,比如<script>全被转义了,我当时还纳闷,这XPATH咋不给我返回原文呢?原来系统输出层做了编码过滤,你想想啊,你自己搭的测试环境当然随便玩,可真实站点的WAF、过滤器全在蹲你呢。这种暗坑最致命,让你怀疑自己是不是注入了假XML。

第四大坑:盲目相信在线Payload,被带沟里了

我必须吐槽一下某些“黑客论坛”的破脚本,十有八九是半吊子写的,我试过什么' or true or ',什么" ] | //admin/* | //*[contains(.,'1'),结果要么返回空,要么直接500,后来我才研究明白,很多Payload是特定环境专用,比如根节点路径、命名空间、属性筛选,差一个字就全盘崩溃,我那次花了三天三夜,最后发现是Payload里少了个ancestor::轴,差点把自己气到住院。

第五大坑:不重视“节点类型”,疯狂翻车

唉,这个坑是真的深!XPATH里有元素节点、属性节点、文本节点之分,你查文本内容用text(),查属性用,但如果你盲注的时候用错了,返回的永远是空节点集,我当时盲注时还傻乎乎地拿substring(//employee/name[1],1,1)='张'做判断,结果死活测不对,我压根没想过name是个子元素,下面还有text节点!于是直接改成substring(//employee/name[1]/text(),1,1)='张',这下才通了,你说这要没点耐心,早就摔键盘了。

第六大坑:不注意“错误处理”,信息全被吞了

还有啊,你以为网站报错就会把查询语句反馈给你?别做梦了!大多数时候是统一返回个“服务器内部错误”,连个标点都不带多的,这时候你就得靠布尔盲注和时间盲注硬扛了,我记得有一次,整个XML文档就几KB,我用二分法猜管理员密码,一个字符一个字符地试,整整猜了两天两夜,最后发现密码是“123456”——那一刻我真的眼泪不争气地流下来了

第七大坑:忘记XPATH也有“权限边界”

注意啊!XPATH注入不是你进了XML文档就万事大吉,有些XML里还会搞外部实体引用(XXE)或者加载外部文件,你一旦想通过document()函数去读取本地文件,分分钟被Java或.NET的底层权限拦得死死的,我有次想读file:///etc/passwd,结果连个毛都没返回,还让管理员日志记录到了IP,吓得我赶紧掐断了会话,所以说啊,能读到XML里已有的数据就赶紧收手,别贪,真的别贪!

第八大坑:没有“手工验证”习惯,全依赖自动化工具

工具好用归好用,但一碰上XPATH注入工具就拉胯,很多扫描器对XML上下文根本不敏感,只会发一堆SQL注入的脏数据过去,我给兄弟们的建议是,先手工用Burp抓包,看请求参数如何映射到XPATH查询里,再用几组无害的布尔条件探测,

正常:?id=1
试错:?id=1' and '1'='1
对比:?id=1' and '1'='2

只有肉眼分辨出响应差异,你才能确信有戏,别偷懒,这个懒偷不得!

结尾赠送:防护秘籍(反面教材可别学)

说到防坑,我也得提一嘴怎么修,最稳妥的办法就是参数化查询,用变量绑定替换字符串拼接严格校验用户输入的格式,比如只允许数字或特定短字符,这等于把XPATH的入口焊死,还有,关闭XML文档的外部实体加载,不然你防了注入,XXE又给你挖个坑

好了,就说这么多了,我现在坐在这,脚趾头还能抠出三室一厅来——全是当年踩坑的后遗症啊。你还有啥更变态的XPATH注入坑经历吗? 评论区来聊聊,咱一起抱团取暖! 😭😭

相关阅读推荐:
XPATH注入防御指南 | XML解析器安全配置实战

文章版权声明:除非注明,否则均为极客网安-咸鱼原创文章,转载或复制请以超链接形式并注明出处。

目录[+]