还记得IIS的剖析破绽吗?xx.asp;.jpg。而近来对java网站停止测试的时刻发明了一个成绩,也是由分号惹起的,也是以去检查了一下源码,大概许多人曾经晓得了这个成绩,然则大概有的人不晓得,以是我将内容记载上去了并停止了分享。
原由
我在测试的时刻的一个功效的设置装备摆设文件片断为:
<bean id="viewResolver"
代码片断:
public static String PRE = "landingpage/"; @ request Mapping({"online"}) public String toOnline(String version) { if (StringUtils.isBlank(version)) {
很显著,version的值是能够经由进程客户端通报过去的,也便是前往的文件门路是能够被节制的:
当version=xxx时,前往的文件应当是:/view/landingpage/online-xxx. jsp
以是这一功效是存在随意率性文件下载破绽的,条件是咱们若何把后面的.jsp给朋分进来,在许多时刻咱们会应用%00等空字符停止截断,然则这里并不能胜利。
而颠末一些测试,我发明分号在这里能有截断的功效,也便是当我输出../../WEB-INF/web.xml;的时刻,我能够或许获得到web.xml的设置装备摆设信息:
狐疑
破绽曾经测试胜利,然则为何分号能够或许有截断的功效呢?
我开端以为是spring mvc的框架中的成绩,但彷佛并非,我又狐疑是 tomcat 中间件的成绩,彷佛也不满是。
若何验证这些疑难呢?
找一个java的网站,在门路的开头也便是问号的后面输出:,你会发明和前往的成果同样的,并无提醒找不到对应的页面。
也便是说;xxxx在处置的进程当中与后面的内容被分开开了。
也便是说这彷佛是java web的一个广泛征象,而不仅仅是某个中间件或许 spring 的成绩。
调试
因而间接写了一个简略的jsp的代码,来调试这个进程:
<% request.getRequestDispatcher(request.getParameter("filename")+".doc"). include (request, response); %>
作为突破口,应用tomcat作为中间件停止调试,关上接口requestDispatcher的一个完成类:ApplicationDispatcher
在ApplicationDispatcher中设置断点停止调试
拜访上面地点来触发断点:
这时候发明doForward函数中的变量servletPath中的值为:WEB-INF/web.xml,曾经将分号和后面的数据给去除
而颠末变量的追踪,就发明在颠末wrequest.setServletPath(servletPath)这个办法前:wrequest.getServletPath=”test123.jsp”,而之后变成为了/WEB-INF/web.xml,以是成绩出在servletPath的获得上:servletPath的获得应当是在实例化的时刻,也便是在代码中:
public ApplicationDispatcher (Wrapper wrapper, String requestURI, String servletPath, String pathInfo, String queryString, String name) { super(); // Save all of our configuration parameters
由此看进去servletPath的值也是从外部通报进来的
实例化该类的工具为:ApplicationContext.getRequestDispatcher:
检查代码
和调试时发明初始的path通报的值为
而终极前往的内容的值为:/WEB-INF/web.xml
也是以定位了症结地位:
而这里并无停止,由于在这个办法中,除分号的一个截断外,还有一个标记也会被朋分,便是问号“?”:
停止
也便是说在java web中咱们应用分号和问号,在某种程度上来讲,是能够起到截断的作用的,但会不会如xx.asp;.jpg同样,招致剖析破绽呢,事实上是没有的,当咱们去拜访的时刻,事实上拜访的是1.jsp这个文件,而不是1.jsp;.jpg这个文件,当咱们上传了1.jsp;.jpg文件时,经由进程web是拜访不到的。
PS:java servlet的重定向和转发:
request.getRequestDispatcher("").forward(request,reponse);