网易首页 > 网易号 > 正文 申请入驻

Tomcat容器攻防笔记之URI解析特性利用

0
分享至

一、提要

Hello,好久不见,最近琐事缠身,也是抽空对Tomcat这个基础特性,做了点微小的工作。

回归正题,在日常代码审计的过程中发现,Tomcat原生javax.servlet.http.HttpServletRequest类提供的getRequestURI()方法,在解析请求时若使用不当,可以绕过访问控制,导致未授权访问。

事实上,Tomcat在解析请求路径时,会自行修正路径,并使用修正后的路径来匹配对应的Servlet,然而,在路径需要修正的情况下,Tomcat自行修正后得到的URI路径跟使用getRequestURI方法得到的URI路径不一致,因而在我们去对请求路径做权限访问控制时,容易导致绕过。

ok,前情提要浅尝即止,接下来,上号!

二、URI解析特性

这次换个思路,逆流而上,先来看看,Tomcat是根据什么来匹配对应的Servlet。

回顾先前文章,涉及流的解析与对象封装,那就是Tomcat架构中Connector连接器与Container容器的桥梁org.apache.catalina.connector.CoyoteAdapter#prepare,在那里新建和封装Request和Response对象,并最终在postParseRequest方法的this.connector.getService().getMapper().map()中完成对Servlet的绑定。走,看看去。

阿~是decodedURI,后面是根据decodeURI来匹配Servlet的,可以,现在我们去追溯一下decodedURI。适配器CoyoteAdapter作为桥梁,首先被调用Prepare方法,在其中新建Request及Response对象,并调用postParseRequest方法对Request对象完成数据封装。

看方法名识方法作用,进入postParseRequest方法,该方法会对请求所使用的协议、方式等进行判断,并一一封装入Request对象中,略过,直捣黄龙。

decodeURI从req,decodedURI()中取出,刚取出时为null,(由于undecodedURI的Type为2时指代bytes类型,满足if条件),随后进入if逻辑,通过duplicate(复制),复制得到了undecodedURI的值。这里调试时,访问的地址为“/txxx/;abc/index.jsp”。随后进入parsePathParameters方法,进一步解析URI。

举一个例子说明处理流程,比方说访问的URI为“/t/;a=1;b=2/./../index.jsp”
首先根据分号来进行分割出A部分和B部分.
A部分:”/t/“
B部分:”a=1;b=2/./../index.jsp”
然后查找B部分中,第一个分号的下标,分割出pathVariables简称pv(路径参数)以及C部分。
pv部分:”a=1”
C部分:”;b=2/./../index.jsp”
将A部分与C部分进行拼接得到D部分
D部分:”/t/;b=2/./../index.jsp”

而每次分割得到的pv,会判断是否含有等于号,含有则会被保存为pathParameters,因此上述最后得到pathParameters={“a”:”1”, ”b”:”2”},没有等于号,则直接忽略pv。

重复以上流程,直到分割后的第二部分不存在分号,最后得到“/t//./../index.jsp”

到这里,parsePathParameters(req, request)就完成了,然后进入602行req.getURLDecoder().convert(decodedURI, false),完成URL编码解析,再之后进入607行normalize(req.decodedURI())方法,该方法顾名思义用于规范化URI,会对URI进行进一步的修正。

normalize方法主要有四个修正行为,一一列举。

反斜杠的Ascii码为“92”,将URI中所有的“\”修正为“/”

斜杠的Ascii码为“47”,将URI中紧邻的两个斜杠修正为一个斜杠,形如“/t//./../index.jsp”修正为“/t/./../index.jsp”

第三第四合在一起说,首先修正URI中的“/./”,例如将“/t/./../index.jsp”修正为”/t/../index.jsp”,随后,解析“/../”进行URI路径跳跃,例如将“/t/../index.jsp”最终解析为“/index.jsp”

综上,normalize()方法结束后,Tomcat对于当前请求的URI已经解析完毕,并保存在变量decodedURI中,并最终交由this.connector.getService().getMapper().map(serverName, decodedURI, version, request.getMappingData());根据decodedURI来匹配对应的Servlet。

而我们原本访问的URI“/t/;a=1;b=2/./../index.jsp”则保存在Coyote.Request实例的uriMB当中。

三、利用场景

对于各种业务系统而言,理所应当会存在多用户多角色的访问控制,具体表现在是否有足够的权限去调用后端的接口,而实现访问控制很重要的前提就是通过用户当前请求的路径来进行判断匹配。

打个比方说,用户test,不可以访问“/admin”接口,从业务代码实现起来,就是判断用户test当前访问的URI是否等价于”/admin”,如果等价,则响应401权限不足。

这里边的问题是什么呢?仍有部分开发者,习惯地通过HttpServletRequest.getRequestURI()的方式,来获取当前请求的URI。承接前面我们的分析,补充一下,该方法事实上是返回了Coyote.Request中的uriMB,也就是没有经过Tomcat修正的URI。

因此可能会产生这么一种情况:用户test访问的URI经过修正后,实际访问的是“/admin”,但后端使用getRequestURI()方法得到的URI跟“/admin”不等价,结合上面分析举个例子,很容易明白:“/;/admin”、“/;a/admin”、“/;a=1/admin”

以上三个路径跟”/admin”无法等价,但经Tomcat修正后,访问的却恰恰是“/admin”。

四、修复方案及延伸

String uri = request.getContextPath() + request.getServletPath();

不同的框架可能在资源解析中各有差异,就像先前Spring与Shiro之间的解析差异产生的未授权访问,因此日常审计也可以多留心这条思路。

从修复漏洞,抵御风险,提高系统安全性的角度来说,需尽保证关键数据、关键对象,传递和使用的一致性,以免岔路

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相关推荐
热点推荐
遭恒大拖累的一众装修企业,唯有他早做决断,套现14.6亿安稳脱身

遭恒大拖累的一众装修企业,唯有他早做决断,套现14.6亿安稳脱身

青眼财经
2026-06-15 18:37:20
中国在争议区建了22个村庄,不丹已经拆光建筑,印度只能干着急了

中国在争议区建了22个村庄,不丹已经拆光建筑,印度只能干着急了

全金猫眼
2026-05-23 20:45:03
张艺谋4月身体出状况,陈婷摘掉妻子认证

张艺谋4月身体出状况,陈婷摘掉妻子认证

青杉依旧啊啊
2026-05-16 23:41:41
56岁张嘉益现状,住西安大豪宅,二婚娶女演员,如今新剧获赞

56岁张嘉益现状,住西安大豪宅,二婚娶女演员,如今新剧获赞

娱说瑜悦
2026-05-13 15:25:22
深交所迎来史上最大规模IPO,牛市拐点会发生在下半年吗?

深交所迎来史上最大规模IPO,牛市拐点会发生在下半年吗?

金融界
2026-06-22 08:14:33
地下党吴凤翔叛变,日军让他去聚餐,他却掏枪顶住日军大佐的脑袋

地下党吴凤翔叛变,日军让他去聚餐,他却掏枪顶住日军大佐的脑袋

舆图看世界
2026-06-22 08:10:06
没想到,印尼卡镍卡了三个月,逼中企停产,反倒帮了中国一个大忙

没想到,印尼卡镍卡了三个月,逼中企停产,反倒帮了中国一个大忙

春日在捕月
2026-06-21 11:22:35
正式复出,张继科官宣重返赛场,首秀曝光,迎战德国名将

正式复出,张继科官宣重返赛场,首秀曝光,迎战德国名将

泥说体育
2026-06-21 16:40:38
特斯拉Autopilot再酿致命事故:76岁老人客厅内被撞身亡,系统监管正趋严

特斯拉Autopilot再酿致命事故:76岁老人客厅内被撞身亡,系统监管正趋严

码上闲叙
2026-06-22 02:08:33
中方外交官已撤离,立陶宛总统逼外长,要么搞好对华关系,要么走

中方外交官已撤离,立陶宛总统逼外长,要么搞好对华关系,要么走

福建睿平
2026-06-22 07:30:20
A股:周一上午传来3个特大级消息!A股或迎更大级别变盘行情?

A股:周一上午传来3个特大级消息!A股或迎更大级别变盘行情?

股侠指北针
2026-06-22 07:53:46
泽连斯基放话:让战争回归俄罗斯,让俄罗斯人也感受到压力

泽连斯基放话:让战争回归俄罗斯,让俄罗斯人也感受到压力

俄语大世界
2026-06-22 08:20:21
原来家里全是狠人!我被爸妈爷奶的低调惊到了

原来家里全是狠人!我被爸妈爷奶的低调惊到了

夜深爱杂谈
2026-06-16 22:22:36
央视曝光!多款水果跌落神坛,滥用甜味剂8000倍甜度、违规防腐剂

央视曝光!多款水果跌落神坛,滥用甜味剂8000倍甜度、违规防腐剂

哄动一时啊
2026-06-21 19:52:09
龙岗区交通部门:东部过境高速明年通车

龙岗区交通部门:东部过境高速明年通车

南方都市报
2026-06-22 07:06:17
布达拉宫地下世界复杂得吓人!
金碧辉煌下藏着1200多个“地垄”

布达拉宫地下世界复杂得吓人! 金碧辉煌下藏着1200多个“地垄”

西楼知趣杂谈
2026-06-12 08:54:44
虎扑网友发帖求图:这不属于普通人的世界

虎扑网友发帖求图:这不属于普通人的世界

赴一场山海啊
2026-06-21 00:47:43
梅洛尼终于爆发,“干了件美国盟友都不敢的事儿”

梅洛尼终于爆发,“干了件美国盟友都不敢的事儿”

观察者网
2026-06-21 15:32:28
徐悲鸿因厌恶妻子,故意给刚出生儿子起一个晦气名字,没想到7年后,却字字应验

徐悲鸿因厌恶妻子,故意给刚出生儿子起一个晦气名字,没想到7年后,却字字应验

LULU生活家
2026-06-17 15:25:14
向佐曝弟弟和父母断绝关系后,向太罕见给向佑留言,劝他做个好人

向佐曝弟弟和父母断绝关系后,向太罕见给向佑留言,劝他做个好人

小鋭有话说
2026-06-21 15:41:08
2026-06-22 08:56:49
安全客 incentive-icons
安全客
有思想的安全新媒体
1360文章数 4754关注度
往期回顾 全部

科技要闻

SpaceX 74天闪电IPO,OpenAI能照搬吗?

头条要闻

涨粉1400多万接"失业通知书" 佛得角门将收不续约通知

头条要闻

涨粉1400多万接"失业通知书" 佛得角门将收不续约通知

体育要闻

18岁斩世界杯首球!亚马尔连创5大纪录

娱乐要闻

原来她就是张颂文老婆

财经要闻

这门“躺赚”的生意,要凉了?

汽车要闻

惊出冷汗!重庆实测奥迪A5L,华为智驾这波操作绝了…

态度原创

健康
时尚
数码
艺术
军事航空

吃粽子的3条保胃法则,消化科医生推荐

不得不说,“T恤+九分裤”真的很适合夏天,清爽减龄又高级!

数码要闻

存储价格暴涨超300%!手机电脑又要涨价了 涨幅预计还是千元起

艺术要闻

310米!欧盟第一高楼,坐落于波兰

军事要闻

时隔44年试射洲际导弹 现场照片传递三个重磅信息

无障碍浏览 进入关怀版