国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Thymeleaf SSTI模板注入分析

這篇具有很好參考價(jià)值的文章主要介紹了Thymeleaf SSTI模板注入分析。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

環(huán)境搭建

先搭建一個(gè)SpringMVC項(xiàng)目,參考這篇文章,或者參考我以前的spring內(nèi)存馬分析那篇文章
https://blog.csdn.net/weixin_65287123/article/details/136648903

SpringMVC路由

簡(jiǎn)單寫(xiě)個(gè)servlet

package com.example.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.UnsupportedEncodingException;
import java.util.Base64;

@Controller
public class TestController {
    @GetMapping("/")
    public String Welcome(String type) throws UnsupportedEncodingException {
        System.out.println(type);
        if(!type.equals("")) {
            return "hello";
        }
        return "index";
    }
    @ResponseBody
    @RequestMapping("/readobject")
    public String frontdoor(String payload) throws IOException, ClassNotFoundException {
        byte[] base64decodedBytes = Base64.getDecoder().decode(payload);
        ByteArrayInputStream bais = new ByteArrayInputStream(base64decodedBytes);
        ObjectInputStream ois = new ObjectInputStream(bais);
        ois.readObject();
        ois.close();
        return "right";
    }
}

這樣就是訪問(wèn)到index.jsp
Thymeleaf SSTI模板注入分析
路由解析流程主要就是ModelView以及最后Render。return處打個(gè)斷點(diǎn),看怎么處理的
先進(jìn)入invokeAndHandle,調(diào)用invokeForRequest方法,這個(gè)操作會(huì)獲取到我們傳進(jìn)去的視圖名稱
Thymeleaf SSTI模板注入分析Thymeleaf SSTI模板注入分析
往下走,這個(gè)mavContainer就是一個(gè)ModelAndViewContainer容器對(duì)象
Thymeleaf SSTI模板注入分析
進(jìn)入handleReturnValue方法
Thymeleaf SSTI模板注入分析
跟進(jìn)另一個(gè)handleReturnValueThymeleaf SSTI模板注入分析
略過(guò)dispatch的調(diào)試環(huán)節(jié),直接定位到render處
Thymeleaf SSTI模板注入分析
往下走進(jìn)入ThymeleafView的render方法,然后走到這
Thymeleaf SSTI模板注入分析
這個(gè)方法是重點(diǎn),后面會(huì)說(shuō)到,退出這個(gè)方法后,流程就結(jié)束了

Thymeleaf模板注入成因

其實(shí)就是上面的renderFragment函數(shù)。這里直接講3.0.12版本后的方法,因?yàn)?.0.12后加了一層check,需要繞過(guò),之前版本的就是直接SPEL表達(dá)式就可以RCE,__${T%20(java.lang.Runtime).getRuntime().exec(%22calc%22)}__::.x
poc如上,接下來(lái)我們將一步步解釋為什么poc是上述形式,先改一下controller

 @GetMapping("/")
    public String Welcome(String type) throws UnsupportedEncodingException {
        System.out.println(type);
        if(!type.equals("")) {
            return "hello/"+type+"/challenge";
        }
        return "index";
    }

type傳入我們的payload,renderFragment方法里獲取我們的payload
Thymeleaf SSTI模板注入分析
往下走,這里會(huì)判斷viewTemplateName是否包含::Thymeleaf SSTI模板注入分析
這里需要介紹一個(gè)東西

Thymeleaf 是與 java 配合使用的一款服務(wù)端模板引擎,也是 Spring 官方支持的一款服務(wù)端模板引擎。而 SSTI 最初是由 [James Kettle](https://portswigger.net/research/server-side-template-injection) 提出研究,[Emilio Pinna](https://github.com/epinna/tplmap) 對(duì)他的研究進(jìn)行了補(bǔ)充,不過(guò)這些作者都沒(méi)有對(duì) Thymeleaf 進(jìn)行 SSTI 相關(guān)的漏洞研究工作,后來(lái) Aleksei Tiurin 在 ACUNETIX 的官方博客上發(fā)表了關(guān)于 Thymeleaf SSTI 的[文章](https://www.acunetix.com/blog/web-security-zone/exploiting-ssti-in-thymeleaf/),因此 Thymeleaf SSTI 逐漸被安全研究者關(guān)注。
為了更方便讀者理解這個(gè) Bypass,因此在這里簡(jiǎn)單說(shuō)一遍一些基礎(chǔ)性的內(nèi)容,如果了解的,可以直接跳到 0x03 的內(nèi)容。
Thymeleaf 表達(dá)式可以有以下類型:

- ${...}:變量表達(dá)式 —— 通常在實(shí)際應(yīng)用,一般是OGNL表達(dá)式或者是 Spring EL,如果集成了Spring的話,可以在上下文變量(context variables )中執(zhí)行
- *{...}: 選擇表達(dá)式 —— 類似于變量表達(dá)式,區(qū)別在于選擇表達(dá)式是在當(dāng)前選擇的對(duì)象而不是整個(gè)上下文變量映射上執(zhí)行。
- #{...}: Message (i18n) 表達(dá)式 —— 允許從外部源(比如.properties文件)檢索特定于語(yǔ)言環(huán)境的消息
- @{...}: 鏈接 (URL) 表達(dá)式 —— 一般用在應(yīng)用程序中設(shè)置正確的 URL/路徑(URL重寫(xiě))。
- ~{...}:片段表達(dá)式 —— Thymeleaf 3.x 版本新增的內(nèi)容,分段段表達(dá)式是一種表示標(biāo)記片段并將其移動(dòng)到模板周圍的簡(jiǎn)單方法。 正是由于這些表達(dá)式,片段可以被復(fù)制,或者作為參數(shù)傳遞給其他模板等等

實(shí)際上,Thymeleaf 出現(xiàn) SSTI 問(wèn)題的主要原因也正是因?yàn)檫@個(gè)片段表達(dá)式,我們知道片段表達(dá)式語(yǔ)法如下:

1. ~{templatename::selector},會(huì)在/WEB-INF/templates/目錄下尋找名為templatename的模版中定義的fragment

重點(diǎn)是片段表達(dá)式。假如有一個(gè)html代碼

<!DOCTYPE html> 
<html xmlns:th="http://www.thymeleaf.org"> 
<body> <div th:fragment="banquan"> &copy; 2021 ThreeDream yyds</div> 
</body> 
</html>

我們需要在另一個(gè)template模板文件引用上述的fragment

<div th:insert="~{footer :: banquan}"></div>

這就是片段表達(dá)式,片段表達(dá)式后面必須要有一個(gè)名字,這也對(duì)應(yīng)payload中的.x,這個(gè).x就是名稱,那個(gè).也可以去掉改為任意的字符串.
繼續(xù)往下走,fragmentExpression處進(jìn)行了一個(gè)拼接,剛好是片段表達(dá)式形式的拼接
Thymeleaf SSTI模板注入分析
跟進(jìn)parser.parseExpression這個(gè)方法Thymeleaf SSTI模板注入分析
繼續(xù)跟進(jìn),這里進(jìn)入preprocess函數(shù)Thymeleaf SSTI模板注入分析
注意上方的Pattern,Pattern.compile("\\_\\_(.*?)\\_\\_", 32);
這個(gè)剛好就能識(shí)別payload的形式,然后由于是片段表達(dá)式,所以有最后的.x
Thymeleaf SSTI模板注入分析
往下走進(jìn)入execute方法解析匹配到的payload,解析過(guò)程就不說(shuō)了,就是正常的SPEL表達(dá)式解析,說(shuō)一下3.12版本后的一個(gè)checker

  public static boolean containsSpELInstantiationOrStatic(final String expression) {

        /*
         * Checks whether the expression contains instantiation of objects ("new SomeClass") or makes use of
         * static methods ("T(SomeClass)") as both are forbidden in certain contexts in restricted mode.
         */

        final int explen = expression.length();
        int n = explen;
        int ni = 0; // index for computing position in the NEW_ARRAY
        int si = -1;
        char c;
        while (n-- != 0) {

            c = expression.charAt(n);

            // When checking for the "new" keyword, we need to identify that it is not a part of a larger
            // identifier, i.e. there is whitespace after it and no character that might be a part of an
            // identifier before it.
            if (ni < NEW_LEN
                    && c == NEW_ARRAY[ni]
                    && (ni > 0 || ((n + 1 < explen) && Character.isWhitespace(expression.charAt(n + 1))))) {
                ni++;
                if (ni == NEW_LEN && (n == 0 || !Character.isJavaIdentifierPart(expression.charAt(n - 1)))) {
                    return true; // we found an object instantiation
                }
                continue;
            }

            if (ni > 0) {
                // We 'restart' the matching counter just in case we had a partial match
                n += ni;
                ni = 0;
                if (si < n) {
                    // This has to be restarted too
                    si = -1;
                }
                continue;
            }

            ni = 0;

            if (c == ')') {
                si = n;
            } else if (si > n && c == '('
                        && ((n - 1 >= 0) && (expression.charAt(n - 1) == 'T'))
                        && ((n - 1 == 0) || !Character.isJavaIdentifierPart(expression.charAt(n - 2)))) {
                return true;
            } else if (si > n && !(Character.isJavaIdentifierPart(c) || c == '.')) {
                si = -1;
            }

        }

        return false;

    }

進(jìn)入這個(gè)方法,他會(huì)識(shí)別new關(guān)鍵字,不允許存在new關(guān)鍵字,并且不允許存在T(.*)這種形式的字符串,因此就得bypass了,而方法也很簡(jiǎn)單,fuzz一下就知道是T ()加一個(gè)空格就行了。后續(xù)的一系列利用都是針對(duì)sepl表達(dá)式的研究了文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-849111.html

到了這里,關(guān)于Thymeleaf SSTI模板注入分析的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • Ctfshow web入門(mén) SSTI 模板注入篇 web361-web372 詳細(xì)題解 全

    Ctfshow web入門(mén) SSTI 模板注入篇 web361-web372 詳細(xì)題解 全

    筆記分享 一、代碼塊 二、常用方法 三、SSTI-jinja2執(zhí)行命令的六種方式 最后附上我的思維導(dǎo)圖 開(kāi)始做題 進(jìn)去是個(gè)這玩意。非常明顯的SSTI模板注入的特征。 題目有提到名字就是考點(diǎn)。 測(cè)試一下是jinja2模板 payload:(以下這些都可以) 開(kāi)始過(guò)濾了,測(cè)試了一下過(guò)濾了數(shù)字,1和

    2024年02月13日
    瀏覽(30)
  • SSTI模板注入-中括號(hào)、args、下劃線、單雙引號(hào)、os、request、花括號(hào)被過(guò)濾繞過(guò)(ctfshow web入門(mén)369)

    SSTI模板注入-中括號(hào)、args、下劃線、單雙引號(hào)、os、request、花括號(hào)被過(guò)濾繞過(guò)(ctfshow web入門(mén)369)

    由于request被過(guò)濾,我們就不能再使用傳參的方式進(jìn)行傳遞命令以及被過(guò)濾的,下劃線中括號(hào)花括號(hào)都被過(guò)濾,這樣的話我們就只能使用{%%}來(lái)進(jìn)行設(shè)置變量以及拼接方法的方式來(lái)進(jìn)行利用SSTI漏洞。 本章內(nèi)容,咱們就先研究怎么做出ctfshow web入門(mén)369這道題目,然后再講解

    2024年02月08日
    瀏覽(64)
  • SSTI模板注入-中括號(hào)、args、下劃線、單雙引號(hào)、os、request、花括號(hào)、數(shù)字被過(guò)濾繞過(guò)(ctfshow web入門(mén)370)

    SSTI模板注入-中括號(hào)、args、下劃線、單雙引號(hào)、os、request、花括號(hào)、數(shù)字被過(guò)濾繞過(guò)(ctfshow web入門(mén)370)

    由于request被過(guò)濾,我們就不能再使用傳參的方式進(jìn)行傳遞命令以及被過(guò)濾的,下劃線中括號(hào)花括號(hào)都被過(guò)濾,這樣的話我們就只能使用{%%}來(lái)進(jìn)行設(shè)置變量以及拼接方法的方式來(lái)進(jìn)行利用SSTI漏洞。 但是ctfshow web入門(mén)370關(guān)相對(duì)于ctfshow web入門(mén)369關(guān)多過(guò)濾數(shù)字,就是我們不

    2024年02月04日
    瀏覽(27)
  • Day66:WEB攻防-Java安全&SPEL表達(dá)式&SSTI模版注入&XXE&JDBC&MyBatis注入

    Day66:WEB攻防-Java安全&SPEL表達(dá)式&SSTI模版注入&XXE&JDBC&MyBatis注入

    目錄 JavaSec搭建 Hello-Java-Sec搭建 Java安全-SQL注入-JDBCMyBatis JDBC:Java語(yǔ)言連接數(shù)據(jù)庫(kù)操作 MyBatis( mybatis是一個(gè)優(yōu)秀的基于java的持久層框架,它內(nèi)部封裝了 jdbc) 代碼審計(jì)案例:inxedu后臺(tái)MyBatis注入 Java安全-XXE注入-ReaderBuilder 配置XML允許引入外部解析實(shí)體 白盒測(cè)試-XXE Java安全-SSTI模版

    2024年04月25日
    瀏覽(16)
  • 【Spring Boot】Thymeleaf模板引擎 — Thymeleaf入門(mén)

    主要介紹什么是Thymeleaf以及Spring Boot如何集成使用Thymeleaf模板,最后介紹Spring Boot支持的Thymeleaf的一些常用的配置參數(shù)。 Thymeleaf是一款非常優(yōu)秀的服務(wù)器端頁(yè)面模板引擎,適用于Web和獨(dú)立環(huán)境,具有豐富的標(biāo)簽語(yǔ)言和函數(shù),能夠處理HTML、XML、JavaScript甚至文本。 Thymeleaf相較于

    2024年02月05日
    瀏覽(24)
  • thymeleaf模板引擎

    thymeleaf模板引擎

    ThymeleafProperties 配置類 1.默認(rèn)編碼 2.前綴 3.后綴 相當(dāng)于視圖解析器? ? 這是學(xué)SpringBoot的必經(jīng)之路,非常重要?。。。ǔ悄闶菍W(xué)前端的) ? 只改了前端代碼點(diǎn)一下這個(gè)就可以刷新? ? 傳值過(guò)來(lái)了? th:text=\\\"${msg}\\\"爆紅,但是可以顯示,F(xiàn)ile-Settings-Editor-Inspection ?取消“Expression

    2024年02月14日
    瀏覽(20)
  • 【SpringBoot】| Thymeleaf 模板引擎

    【SpringBoot】| Thymeleaf 模板引擎

    目錄 Thymeleaf 模板引擎 1. 第一個(gè)例子 2. 表達(dá)式 ①標(biāo)準(zhǔn)變量表達(dá)式 ②選擇變量表達(dá)式(星號(hào)變量表達(dá)式) ③鏈接表達(dá)式(URL表達(dá)式) 3. Thymeleaf的屬性 ①th:action ②th:method ③th:href ④th:src ⑤th:text ⑥th:style ⑦th:each (重點(diǎn)) ⑧條件判斷 if-unless ⑨switch-case 判斷語(yǔ)句 ⑩th:inline內(nèi)聯(lián)

    2024年02月08日
    瀏覽(21)
  • SpringBoot Thymeleaf模板引擎

    SpringBoot Thymeleaf模板引擎

    前端交給我們的頁(yè)面,是 html 頁(yè)面。如果是我們以前開(kāi)發(fā),我們需要把他們轉(zhuǎn)成jsp頁(yè)面,jsp好處就是當(dāng)我們查出一些數(shù)據(jù)轉(zhuǎn)發(fā)到JSP頁(yè)面以后,我們可以用jsp輕松實(shí)現(xiàn)數(shù)據(jù)的顯示,及交互等。 jsp支持非常強(qiáng)大的功能,包括能寫(xiě)Java代碼,但是呢,我們現(xiàn)在的這種情況,SpringBoot這

    2024年02月13日
    瀏覽(56)
  • SpringBoot整合模板引擎Thymeleaf(4)

    SpringBoot整合模板引擎Thymeleaf(4)

    本文原創(chuàng)作者:谷哥的小弟 作者博客地址:http://blog.csdn.net/lfdfhl 在之前的教程中,我們介紹了Thymeleaf的基礎(chǔ)知識(shí)。在此,以案例形式詳細(xì)介紹Thymeleaf的基本使用。 要點(diǎn)概述: 1、在static下創(chuàng)建css文件夾用于存放css文件 2、在static下創(chuàng)建img文件夾用于存放圖片文件 請(qǐng)?jiān)趐om.xml文

    2024年02月10日
    瀏覽(19)
  • 038-安全開(kāi)發(fā)-JavaEE應(yīng)用&SpringBoot框架&MyBatis注入&Thymeleaf模版

    038-安全開(kāi)發(fā)-JavaEE應(yīng)用&SpringBoot框架&MyBatis注入&Thymeleaf模版

    1、JavaEE-SpringBoot-WebAPP路由 2、JavaEE-SpringBoot-Mybatis注入 3、JavaEE-SpringBoot-ThymeleafSSTI 演示案例: ?SpringBoot-Web應(yīng)用-路由響應(yīng) ?SpringBoot-數(shù)據(jù)庫(kù)應(yīng)用-Mybatis ?SpringBoot-模版引擎-Thymeleaf Spring Boot是由Pivotal團(tuán)隊(duì)提供的一套 開(kāi)源框架 ,可以簡(jiǎn)化spring應(yīng)用的創(chuàng)建及部署。它提供了豐富的

    2024年03月09日
    瀏覽(25)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包