国产成人精品18p,天天干成人网,无码专区狠狠躁天天躁,美女脱精光隐私扒开免费观看

Java安全之Filter權限繞過(guò)的實(shí)現

發(fā)布時(shí)間:2021-07-05 18:40 來(lái)源:腳本之家 閱讀:0 作者:nice0e3 欄目: 開(kāi)發(fā)技術(shù)

前言

在一些需要挖掘一些無(wú)條件RCE中,大部分類(lèi)似于一些系統大部分地方都做了權限控制的,而這時(shí)候想要利用權限繞過(guò)就顯得格外重要。在此來(lái)學(xué)習一波權限繞過(guò)的思路。

0x01 權限控制實(shí)現

常見(jiàn)的實(shí)現方式,在不調用Spring Security、Shiro等權限控制組件的情況下,會(huì )使用Filter獲取請求路徑,進(jìn)行校驗。

編寫(xiě)一個(gè)servlet

package com.nice0e3;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@WebServlet("/helloServlet")
public class helloServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

            response.getWriter().write("hello!!!");
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doPost(request, response);
    }
}

定義一個(gè)Filter

package com.nice0e3.filter;

import com.nice0e3.User;

import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;

@WebFilter("/*")
public class demoFilter implements Filter {
    public void destroy() {
    }


    public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
        HttpServletRequest request = (HttpServletRequest) req;



        String uri = request.getRequestURI();
        StringBuffer requestURL = request.getRequestURL();
        System.out.println(requestURL);
        if(uri.startsWith("/system/login")) {  //登陸接口設置⽩白名單,即登錄頁(yè)面
            System.out.println("login_page");
            resp.getWriter(). write("login_page");

            chain.doFilter(request, resp);
        }
        else if(uri.endsWith(".do")||uri.endsWith(".action")) {
//檢測當前⽤戶(hù)是否登陸
            User user =(User) request.getSession().getAttribute("user");
            if(user == null) {
                resp.getWriter(). write("unauthorized access"); //未授權訪(fǎng)問(wèn)
                System.out.println("unauthorized access");
                resp.getWriter(). write("go to login_page");//跳轉登錄
                System.out.println("go to login_page");
            }
        }


    }

    public void init(FilterConfig config) throws ServletException {

    }
}

這里使用 request.getRequestURI();獲取URI為 /system/login開(kāi)頭 則直接放行。結尾,為.do.action的請求去做校驗,獲取session有沒(méi)有user的值,沒(méi)有的話(huà)即返回unauthorized access,如果不為.do.action的請求或session中存在user即放行。

訪(fǎng)問(wèn)main頁(yè)面,顯示未授權訪(fǎng)問(wèn)并且跳轉到登錄的頁(yè)面

在Java中通常會(huì )使用request.getRequestURL()request.getRequestURI()這兩個(gè)方法獲取請求路徑,然后對請求路徑做校驗。

../繞過(guò)方式

這里采用../的方式繞過(guò)

這里就繞過(guò)了,權限控制,直接能訪(fǎng)問(wèn)到main,而不是顯示未授權訪(fǎng)問(wèn)。在繞過(guò)時(shí)候可以找一些白名單的路徑,然后使用../去繞過(guò)。

payload:/system/login/../../login/main.do

繞過(guò)原理分析

上圖可以看到我們前面為system/login開(kāi)頭

符合匹配的規則,而匹配上該規則后則是直接放行,讓系統認為訪(fǎng)問(wèn)路徑是一個(gè)登錄的路徑,但在后面加入2個(gè)../進(jìn)行跳轉到根目錄,并且拼接上login/main.do,這時(shí)候實(shí)際訪(fǎng)問(wèn)到的是http://127.0.0.1/login/main.do。

但使用

 StringBuffer requestURL = request.getRequestURL();
if(requestURL.toString().startsWith("/system/login"))

request.getRequestURL();該方法獲取URL是攜帶http://127.xxx等信息的。其實(shí)這里比較廢話(huà),因為驗證首部的字符路徑的話(huà),使用 request.getRequestURI();來(lái)獲取請求路徑部分來(lái)校驗。

URL截斷繞過(guò)

基于前面Filter代碼將../進(jìn)行過(guò)濾

package com.nice0e3.filter;

import com.nice0e3.User;

import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;

@WebFilter("/*")
public class demoFilter implements Filter {
    public void destroy() {
    }


    public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
        HttpServletRequest request = (HttpServletRequest) req;



        String uri = request.getRequestURI();

        if(uri.contains("./")){
            resp.getWriter().write("error");
            return;
        }
        StringBuffer requestURL = request.getRequestURL();
        System.out.println(requestURL);
        if(uri.startsWith("/system/login")) {  //登陸接口設置⽩白名單,即登錄頁(yè)面
            System.out.println("login_page");
            resp.getWriter(). write("login_page");

            chain.doFilter(request, resp);
        }
        else if(uri.endsWith(".do")||uri.endsWith(".action")) {
//檢測當前⽤戶(hù)是否登陸
            User user =(User) request.getSession().getAttribute("user");
            if(user == null) {
                resp.getWriter(). write("unauthorized access"); //未授權訪(fǎng)問(wèn)
                System.out.println("unauthorized access");
                resp.getWriter(). write("go to login_page");//跳轉登錄
                System.out.println("go to login_page");
            }
        }

    chain.doFilter(request,resp);
    }

    public void init(FilterConfig config) throws ServletException {

    }
}

添加多了一個(gè)uri.contains("./")做過(guò)濾只要包含./字符直接報錯。

這時(shí)候會(huì )報錯,可見(jiàn)上圖???code>;進(jìn)行繞過(guò)

payload:/login/main.do;123

繞過(guò)分析

URL中有一個(gè)保留字符分號;,主要為參數進(jìn)行分割使用,有時(shí)候是請求中傳遞的參數太多了,所以使用分號;將參數對(key=value)連接起來(lái)作為一個(gè)請求參數進(jìn)⾏傳遞。

再來(lái)看到代碼,代碼中識別.do.action的后綴的字符,而加入;加上隨便內容后,代碼中就識別不到了。則會(huì )走到最下面的chain.doFilter(request,resp);,而在后面添加;分號不會(huì )對地址的訪(fǎng)問(wèn)有任何影響。

繞過(guò)

創(chuàng )建一個(gè)后臺接口,只允許admin用戶(hù)登錄訪(fǎng)問(wèn)

package com.nice0e3.Servlet;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@WebServlet("/system/UserInfoSearch.do")
public class UserInfoServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    response.getWriter().write("admin_login!!!");
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    this.doPost(request, response);
    }
}

而權限控制這步肯定是在Filter里面實(shí)現

   String uri = request.getRequestURI();

        if(uri.equals("/system/UserInfoSearch.do")){
            User user =(User) request.getSession().getAttribute("user");
            String role = user.getRole();
            if(role.equals("admin")) {
//當前⽤用戶(hù)為admin,允許訪(fǎng)問(wèn)該接⼝
                chain.doFilter(request, resp);
            }
            else {
                resp.getWriter().write("Unauthorized");
                return;
            }
        }

這時(shí)候去對/system/UserInfoSearch.do做了校驗,獲取URI地址后匹配如果是這個(gè)/system/UserInfoSearch.do,則驗證用戶(hù)身份,加入不為admin,則顯示Unauthorized,越權訪(fǎng)問(wèn)。

可直接訪(fǎng)問(wèn)到admin用戶(hù)才可訪(fǎng)問(wèn)的頁(yè)面下。

payload: //system/UserInfoSearch.do;123

繞過(guò)分析

看到代碼中只是對比了URI是否為/system/UserInfoSearch.do,而多加一個(gè)/并不影響正常解析,而又能讓該規則匹配不到。

URL編碼繞過(guò)

還是用上面的代碼演示,繞過(guò)手法則是換成url編碼繞過(guò)的方式。

payload:/system/%55%73%65%72%49%6e%66%6f%53%65%61%72%63%68%2e%64%6f

繞過(guò)分析

當Filter處理完相關(guān)的流程后,中間件會(huì )對請求的URL進(jìn)行一次URL解碼操作,然后請求解碼后的Servlet,而在request.getRequestURL()和request.getRequestURI()中并不會(huì )自動(dòng)進(jìn)行解碼,所以這時(shí)候直接接收過(guò)來(lái)進(jìn)行規則匹配,則識別不出來(lái)。這時(shí)候導致了繞過(guò)。

Spring MVC中追加/繞過(guò)

在SpringMVC中假設以如下方法配置:

<servlet-mapping>
<servlet-name>SpringMVC</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>

特定情況下Spring匹配web路徑的時(shí)候會(huì )容錯后面的/

如,/admin/main.do/

修復

使用該代碼接受URI

String uri1 = request.getServletPath() + (request.getPathInfo() != null ? request.getPathInfo() : "");

下面來(lái)嘗試前面的幾種繞過(guò)方式。

分號階段繞過(guò) payload: /login/main.do;123

/繞過(guò)payload: //system/UserInfoSearch.do;123

URL編碼繞過(guò)payload:/system/%55%73%65%72%49%6e%66%6f%53%65%61%72%63%68%2e%64%6f

../繞過(guò)payload:/system/login/../../login/main.do

均不可用,使用上面的方式接受URI后,接受過(guò)去的時(shí)候發(fā)送特殊字符一律被剔除了。打斷點(diǎn)可見(jiàn)。

關(guān)注點(diǎn)

前面提到過(guò)request.getRequestURL()request.getRequestURI(),這些危險字符并不會(huì )自動(dòng)剔除掉??芍攸c(diǎn)關(guān)注該方法。

參考

0x02 結尾

不只是Filter里面可以做權限繞過(guò),在使用到一些Shiro框架的時(shí)候,也會(huì )有一些權限繞過(guò)的方式。

到此這篇關(guān)于Java安全之Filter權限繞過(guò)的實(shí)現的文章就介紹到這了,更多相關(guān)Java Filter權限繞過(guò)內容請搜索腳本之家以前的文章或繼續瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng )、來(lái)自互聯(lián)網(wǎng)轉載和分享為主,文章觀(guān)點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權請聯(lián)系QQ:712375056 進(jìn)行舉報,并提供相關(guān)證據,一經(jīng)查實(shí),將立刻刪除涉嫌侵權內容。

久久精品国产亚洲AV无码麻豆| 久久无码AV三级| 欧美交A欧美精品喷水| 久久综合少妇11P| 末成年女A∨片一区二区| 日本按摩高潮A级中文片|