欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java安全之Filter權(quán)限繞過的實(shí)現(xiàn)

 更新時(shí)間:2021年05月24日 09:48:54   作者:nice0e3  
在一些需要挖掘一些無條件RCE中,大部分類似于一些系統(tǒng)大部分地方都做了權(quán)限控制的,而這時(shí)候想要利用權(quán)限繞過就顯得格外重要,本文就介紹了如何實(shí)現(xiàn),一起來了解一下

前言

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

0x01 權(quán)限控制實(shí)現(xiàn)

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

編寫一個(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")) {  //登陸接口設(shè)置⽩白名單,即登錄頁面
            System.out.println("login_page");
            resp.getWriter(). write("login_page");

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


    }

    public void init(FilterConfig config) throws ServletException {

    }
}

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

訪問main頁面,顯示未授權(quán)訪問并且跳轉(zhuǎn)到登錄的頁面

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

../繞過方式

這里采用../的方式繞過

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

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

繞過原理分析

上圖可以看到我們前面為system/login開頭

符合匹配的規(guī)則,而匹配上該規(guī)則后則是直接放行,讓系統(tǒng)認(rèn)為訪問路徑是一個(gè)登錄的路徑,但在后面加入2個(gè)../進(jìn)行跳轉(zhuǎn)到根目錄,并且拼接上login/main.do,這時(shí)候?qū)嶋H訪問到的是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í)這里比較廢話,因?yàn)轵?yàn)證首部的字符路徑的話,使用 request.getRequestURI();來獲取請求路徑部分來校驗(yàn)。

URL截?cái)嗬@過

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

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")) {  //登陸接口設(shè)置⽩白名單,即登錄頁面
            System.out.println("login_page");
            resp.getWriter(). write("login_page");

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

    chain.doFilter(request,resp);
    }

    public void init(FilterConfig config) throws ServletException {

    }
}

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

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

payload:/login/main.do;123

繞過分析

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

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

繞過

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

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);
    }
}

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

   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")) {
//當(dāng)前⽤用戶為admin,允許訪問該接⼝
                chain.doFilter(request, resp);
            }
            else {
                resp.getWriter().write("Unauthorized");
                return;
            }
        }

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

可直接訪問到admin用戶才可訪問的頁面下。

payload: //system/UserInfoSearch.do;123

繞過分析

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

URL編碼繞過

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

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

繞過分析

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

Spring MVC中追加/繞過

在SpringMVC中假設(shè)以如下方法配置:

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

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

如,/admin/main.do/

修復(fù)

使用該代碼接受URI

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

下面來嘗試前面的幾種繞過方式。

分號階段繞過 payload: /login/main.do;123

/繞過payload: //system/UserInfoSearch.do;123

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

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

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

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

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

參考

https://blog.csdn.net/qq_38154820/article/details/106799046

0x02 結(jié)尾

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

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

相關(guān)文章

  • java語言中封裝類代碼示例

    java語言中封裝類代碼示例

    這篇文章主要介紹了java語言中封裝類,涉及相關(guān)代碼示例及結(jié)果分析,以及封裝的好處簡單介紹,具有一定借鑒價(jià)值,需要的朋友可以參考下
    2018-01-01
  • 關(guān)于Springboot的日志配置

    關(guān)于Springboot的日志配置

    Spring Boot默認(rèn)使用LogBack日志系統(tǒng),如果不需要更改為其他日志系統(tǒng)如Log4j2等,則無需多余的配置,LogBack默認(rèn)將日志打印到控制臺上,需要的朋友可以參考下
    2023-05-05
  • Spring Boot中自動化配置的利弊以及解決方法

    Spring Boot中自動化配置的利弊以及解決方法

    這篇文章主要給大家介紹了關(guān)于Spring Boot中自動化配置的利弊以及解決方法,文中通過示例代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用Spring Boot具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起看看吧。
    2017-08-08
  • 詳解如何在Spring中為@Value注解設(shè)置默認(rèn)值

    詳解如何在Spring中為@Value注解設(shè)置默認(rèn)值

    在Spring開發(fā)中,我們經(jīng)常會遇到需要從配置文件中讀取屬性的情況,@Value注解是Spring提供的一種便捷方式,能夠讓我們輕松地將配置文件中的屬性注入到Spring Bean中,
    2024-10-10
  • Spring實(shí)現(xiàn)擁有者權(quán)限驗(yàn)證的方法示例

    Spring實(shí)現(xiàn)擁有者權(quán)限驗(yàn)證的方法示例

    這篇文章主要介紹了Spring實(shí)現(xiàn)擁有者權(quán)限驗(yàn)證的方法示例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-03-03
  • HashMap底層原理全面詳解面試絕對不慌

    HashMap底層原理全面詳解面試絕對不慌

    這篇文章主要介紹了HashMap底層實(shí)現(xiàn)原理詳解,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-08-08
  • Springboot基礎(chǔ)之RedisUtils工具類

    Springboot基礎(chǔ)之RedisUtils工具類

    本文來說下RedisUtils工具類,主要介紹了整合Redis、MyBatis,封裝RedisUtils工具類等知識,文中有非常詳細(xì)的代碼示例,對正在學(xué)習(xí)java的小伙伴們有很好的幫助,需要的朋友可以參考下
    2021-05-05
  • scala當(dāng)中的文件操作和網(wǎng)絡(luò)請求的實(shí)現(xiàn)方法

    scala當(dāng)中的文件操作和網(wǎng)絡(luò)請求的實(shí)現(xiàn)方法

    這篇文章主要介紹了scala當(dāng)中的文件操作和網(wǎng)絡(luò)請求的實(shí)現(xiàn)方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-06-06
  • java反射的作用知識點(diǎn)總結(jié)

    java反射的作用知識點(diǎn)總結(jié)

    在本篇文章里小編給大家整理的是關(guān)于java反射的作用知識點(diǎn)總結(jié),需要的朋友們可以學(xué)習(xí)下。
    2020-02-02
  • Spring Boot 配置和使用多線程池的實(shí)現(xiàn)

    Spring Boot 配置和使用多線程池的實(shí)現(xiàn)

    這篇文章主要介紹了Spring Boot 配置和使用多線程池的實(shí)現(xiàn),小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2018-06-06

最新評論