经常我们在看到相关的一些JAVA程序站点的时候会遇到一些问题即为,为什么他们的POC在最后总有一
些让人不理解的字符例如:;.js ;server ;.css等。
我们进行盲猜的时候大概可以知道这大概率是为了绕过鉴权的,但是因为什么可以导致被绕过呢,今天
我们来展开分析。
System.out.println("1:我是getRequestURI"+requestURI);
StringBuffer requestURL \= request.getRequestURL(); //获取url
System.out.println("2:我是getRequestURl"+requestURI);
String servletPath \= request.getServletPath(); //获取Servlet的路径
System.out.println("3:我是getServletPath"+requestURI);
在JAVA当中获取到当前的URL一般可以分为上述几个方法,我们来进行运行查看。
可以看到最后一个是I的获取到的只是访问的目录
URL的获取到的是全部的一个地址
ServletPath获取到的也是一个访问目录
在经过测试之后可以发现一个问题:
那么即为上述问题,可以看到不同的获取URL的方法,对于结果并不一样。
可以看出来,其中两个方法:
getRequestURL
getRequestURI
获取到的参数都不尽相同,但是我们是否能够成功的进行访问呢。
可以看到我们即使输入别的参数也是可以正常访问到的。
这里我们模拟一个环境。
getRequestURL方法
这里我设置了一个过滤器,要求是过滤全部的请求,通读一次代码为,若是在URL当中判断出来存在相关的.css的时候放行,若是不存在.css那么不允许进行放行。
那么我们使用上述的payload即可进行相关的绕过,导致我们可以成功的被放行。
同样我们换成getRequestURI方法的时候也是可以进行绕过的。
那么我们换成下一个方法
我们在进行测试绕过的时候可以发现。
使用这个方法是不能够成功绕过的。
并且自己在测试的时候发现,若是变为equals方法是无法进行绕过的。
再通过查询相关资料之后发现
equals是进行判断两个值是否等价,也就是是否是完全相等的,然而endsWith是来判断一个字符串的结尾是否为指定结尾的
可以看到其中的indexOf方法也是比较好理解的,也是进行一个指定内容在字符串当中出现的位置。
然而startsWith方法则是进行判断是否以某个字符串开头的
在其他方法当中都是可以绕过的除了(equles)那么方法startsWith该如何进行绕过呢。
下面代码实例
可以看到这段过滤器当中进行了判断是否.css开头,那么这种办法是无法进行绕过的,但是如果他指定某一个路径开头呢
回到刚才我们可以看到我们输入/a/../index也是可以的,那么当过滤器代码变为了下面这种
指定我们以css目录开头
同样我们也是可以进行绕过的。
全程代码只有一个路由/Servlet_dome以及一个过滤器
import jdk.nashorn.internal.ir.RuntimeNode;
import javax.servlet.\*;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
import java.io.PrintWriter;
public class Filter\_dome implements Filter {public void init(FilterConfig config) throws ServletException {
}
public void destroy() {
}
@Override
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws ServletException, IOException {
HttpServletRequest req \= (HttpServletRequest) request;
String requestURL \= req.getRequestURI();
if (requestURL.startsWith("/css")){
chain.doFilter(request,response);
}
else {
PrintWriter writer \= response.getWriter();
writer.println("false");
}
}
}
import javax.servlet.\*;
import javax.servlet.http.\*;
import javax.servlet.annotation.\*;
import java.io.IOException;
import java.io.PrintWriter;
@WebServlet(name \= "Servlet\_dome", value \= "/Servlet\_dome")
public class Servlet\_dome extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse
response) throws ServletException, IOException {
String requestURI \= request.getRequestURI(); // 获取整个URL
System.out.println("1:我是getRequestURI"+requestURI);
StringBuffer requestURL \= request.getRequestURL(); //获取url
System.out.println("2:我是getRequestURl"+requestURL);
String servletPath \= request.getServletPath(); //获取Servlet的路径
System.out.println("3:我是getServletPath"+servletPath);
PrintWriter writer \= response.getWriter();
writer.println("success");
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse
response) throws ServletException, IOException {
}
}
<web-app xmlns\="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi\="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation\="http://xmlns.jcp.org/xml/ns/javaee
http://xmlns.jcp.org/xml/ns/javaee/web-app\_4\_0.xsd"
version\="4.0"\>
<filter>
<filter-name>Filter\_dome</filter-name>
<filter-class>controller.Filter\_dome</filter-class>
</filter>
<filter-mapping>
<filter-name>Filter\_dome</filter-name>
<url-pattern>/\*</url-pattern>
</filter-mapping>
</web-app>
这一段是进行过滤SQL注入攻击的,但是发现使用的getRequestURl来获取到相关的路径,并且通过
indexOf来判断出现的位置,出现相关参数之后就不会在进行绕过而是进行了放行,导致被sql注入攻击
这个运用了Spring框架,其中明确规定了若是访问路径为.js或.css等不进行过滤,然而看下面的过滤器类
名称可以看到为Login等方法,也能想到可以进行绕过认证导致前台漏洞的产生
getRequestURL() 和 getRequestURI() 这两个API解析的URL是包含特殊字符的,当使用不当时会存在
安全问题,我们应该进行使用 getServletPath() 来获取URI。
6 篇文章
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!