声明
出品|先知社区(ID:RoboTerh)
以下内容,来自先知社区的RoboTerh作者原创,由于传播,利用此文所提供的信息而造成的任何直接或间接的后果和损失,均由使用者本人负责,长白山攻防实验室以及文章作者不承担任何责任。
前言
这里通过阅读源码和黑盒测试相结合的方式来更加透彻的了解Tomcat的url解析策略
parsePathParameters
处理逻辑
跟进这个方法的调用,看看具体的逻辑是什么
如果不为空,也即是req.scheme返回的是https,则将会设置secure属性值为true
反之,如果为空,也即是http请求,将会将属性值设置为false
接下来的逻辑就是有代理就设置代理,没有的话,将会判断tomcat有没有对端口进行配置,如果这里是通过https进行请求,将会将服务端口设置为443,反之就是默认端口80
这里主要看看pathParamEnd的获取方式
好了,现在回到parsePathParameters方法中的逻辑来,如果在第一个;后面出现了分隔符,将会进入if语句中去
总结
这里可以简单做个总结
/upload;test ==> /upload
/upload;test/ ==> /upload/
/upload;test;/ ==> /upload/
/upload;te;st/ ==> /upload/
/upload;te/st/ ==> /upload/st/
/upload;te/s;t/ ==> /upload/s/
/upload;te;s;t/ ==> /upload/
/upload;te;s/t/ ==> /upload/t/
这里通过黑白盒的方式,大概可以看出来,
在URI中以;开头,并且以;或者/结尾的地方将会在处理过程中进行舍弃
如果URI末尾存在/,解析之后的URI一定存在/
normalize处理逻辑
接下来我们回到postParseRequest方法中继续阅读Tomcat源码,在这里通过调用req.getURL-Decoder().convert方法对URI进行url解码
这里主要是在URI的Byte数组中寻找是否存在有%, 之后进行后续解码操作,之后来到了normalize方法的调用
/upload/../ ==> /
/upload/./ ==> /upload/
/./upload/ ==> /upload/
/../upload/ ==> /upload/
\upload/ ==> /upload/
\\upload/ ==> /upload/
欢迎关注长白山攻防实验室微信公众号
定期更新优质文字分享