真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

NexusRepositoryManager3幾次表達(dá)式解析漏洞的示例分析

小編給大家分享一下Nexus Repository Manager 3幾次表達(dá)式解析漏洞的示例分析,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!

公司專(zhuān)注于為企業(yè)提供成都網(wǎng)站設(shè)計(jì)、網(wǎng)站建設(shè)、外貿(mào)網(wǎng)站建設(shè)、微信公眾號(hào)開(kāi)發(fā)、電子商務(wù)商城網(wǎng)站建設(shè),微信小程序定制開(kāi)發(fā),軟件按需搭建網(wǎng)站等一站式互聯(lián)網(wǎng)企業(yè)服務(wù)。憑借多年豐富的經(jīng)驗(yàn),我們會(huì)仔細(xì)了解各客戶的需求而做出多方面的分析、設(shè)計(jì)、整合,為客戶設(shè)計(jì)出具風(fēng)格及創(chuàng)意性的商業(yè)解決方案,成都創(chuàng)新互聯(lián)更提供一系列網(wǎng)站制作和網(wǎng)站推廣的服務(wù)。

Nexus Repository Manager 3最近曝出兩個(gè)el表達(dá)式解析漏洞,編號(hào)為CVE-2020-10199,CVE-2020-10204,都是由Github Secutiry Lab團(tuán)隊(duì)的@pwntester發(fā)現(xiàn)。由于之前Nexus3的漏洞沒(méi)有去跟蹤,所以當(dāng)時(shí)diff得很頭疼,并且Nexus3 bug與安全修復(fù)都是混在一起,更不容易猜到哪個(gè)可能是漏洞位置了。后面與@r00t4dm師傅一起復(fù)現(xiàn)出了CVE-2020-10204,CVE-2020-10204是CVE-2018-16621的繞過(guò),之后又有師傅弄出了CVE-2020-10199,這三個(gè)漏洞的根源是一樣的,其實(shí)并不止這三處,官方可能已經(jīng)修復(fù)了好幾處這樣的漏洞,由于歷史不太好追溯回去,所以加了可能,通過(guò)后面的分析,就能看到了。還有之前的CVE-2019-7238,這是一個(gè)jexl表達(dá)式解析,一并在這里分析下,以及對(duì)它的修復(fù)問(wèn)題,之前看到有的分析文章說(shuō)這個(gè)漏洞是加了個(gè)權(quán)限來(lái)修復(fù),可能那時(shí)是真的只加了個(gè)權(quán)限吧,不過(guò)我測(cè)試用的較新的版本,加了權(quán)限貌似也沒(méi)用,在Nexus3高版本已經(jīng)使用了jexl白名單的沙箱。

測(cè)試環(huán)境

文中會(huì)用到三個(gè)Nexus3環(huán)境:

nexus-3.14.0-04

nexus-3.21.1-01

nexus-3.21.2-03

nexus-3.14.0-04用于測(cè)試jexl表達(dá)式解析,nexus-3.21.1-01用于測(cè)試jexl表達(dá)式解析與el表達(dá)式解析以及diff,nexus-3.21.2-03用于測(cè)試el表達(dá)式解析以及diff

漏洞diff

CVE-2020-10199、CVE-2020-10204漏洞的修復(fù)界限是3.21.1與3.21.2,但是github開(kāi)源的代碼分支好像不對(duì)應(yīng),所以只得去下載壓縮包來(lái)對(duì)比了。在官方下載了nexus-3.21.1-01與nexus-3.21.2-03,但是beyond對(duì)比需要目錄名一樣,文件名一樣,而不同版本的代碼有的文件與文件名都不一樣。我是先分別反編譯了對(duì)應(yīng)目錄下的所有jar包,然后用腳本將nexus-3.21.1-01中所有的文件與文件名中含有3.21.1-01的替換為了3.21.2-03,同時(shí)刪除了META文件夾,這個(gè)文件夾對(duì)漏洞diff沒(méi)什么用并且影響diff分析,所以都刪除了,下面是處理后的效果:

Nexus Repository Manager 3幾次表達(dá)式解析漏洞的示例分析

如果沒(méi)有調(diào)試和熟悉之前的Nexus3漏洞,直接去看diff可能會(huì)看得很頭疼,沒(méi)有目標(biāo)的diff。

路由以及對(duì)應(yīng)的處理類(lèi)

一般路由

抓下nexus3發(fā)的包,隨意的點(diǎn)點(diǎn)點(diǎn),可以看到大多數(shù)請(qǐng)求都是POST類(lèi)型的,URI都是/service/extdirect:

Nexus Repository Manager 3幾次表達(dá)式解析漏洞的示例分析

post內(nèi)容如下:

{"action":"coreui_Repository","method":"getBrowseableFormats","data":null,"type":"rpc","tid":7}

可以看下其他請(qǐng)求,json中都有action與method這兩個(gè)key,在代碼中搜索下coreui_Repository這個(gè)關(guān)鍵字:

Nexus Repository Manager 3幾次表達(dá)式解析漏洞的示例分析

可以看到這樣的地方,展開(kāi)看下代碼:

Nexus Repository Manager 3幾次表達(dá)式解析漏洞的示例分析

通過(guò)注解方式注入了action,上面post的method->getBrowseableFormats也在中,通過(guò)注解注入了對(duì)應(yīng)的method:

Nexus Repository Manager 3幾次表達(dá)式解析漏洞的示例分析

所以之后這樣的請(qǐng)求,我們就很好定位路由與對(duì)應(yīng)的處理類(lèi)了

API路由

Nexus3的API也出現(xiàn)了漏洞,來(lái)看下怎么定位API的路由,在后臺(tái)能看到Nexus3提供的所有API。

Nexus Repository Manager 3幾次表達(dá)式解析漏洞的示例分析

點(diǎn)幾個(gè)看下包,有GET、POST、DELETE、PUT等類(lèi)型的請(qǐng)求:

Nexus Repository Manager 3幾次表達(dá)式解析漏洞的示例分析

沒(méi)有了之前的action與method,這里用URI來(lái)定位,直接搜索/service/rest/beta/security/content-selectors定位不到,所以縮短關(guān)鍵字,用/beta/security/content-selectors來(lái)定位:

Nexus Repository Manager 3幾次表達(dá)式解析漏洞的示例分析

Nexus Repository Manager 3幾次表達(dá)式解析漏洞的示例分析

通過(guò)@Path注解來(lái)注入U(xiǎn)RI,對(duì)應(yīng)的處理方式也使用了對(duì)應(yīng)的@GET、@POST來(lái)注解

可能還有其他類(lèi)型的路由,不過(guò)也可以使用上面類(lèi)似的方式進(jìn)行搜索來(lái)定位。還有Nexus的權(quán)限問(wèn)題,可以看到上面有的請(qǐng)求通過(guò)@RequiresPermissions來(lái)設(shè)置了權(quán)限,不過(guò)還是以實(shí)際的測(cè)試權(quán)限為準(zhǔn),有的在到達(dá)之前也進(jìn)行了權(quán)限校驗(yàn),有的操作雖然在web頁(yè)面的admin頁(yè)面,不過(guò)本不需要admin權(quán)限,可能無(wú)權(quán)限或者只需要普通權(quán)限。

buildConstraintViolationWithTemplate造成的幾次Java EL漏洞

在跟蹤調(diào)試了CVE-2018-16621與CVE-2020-10204之后,感覺(jué)buildConstraintViolationWithTemplate這個(gè)keyword可以作為這個(gè)漏洞的根源,因?yàn)閺恼{(diào)用??梢钥闯鲞@個(gè)函數(shù)的調(diào)用處于Nexus包與hibernate-validator包的分界,并且計(jì)算器的彈出也是在它之后進(jìn)入hibernate-validator的處理流程,即buildConstraintViolationWithTemplate(xxx).addConstraintViolation(),最終在hibernate-validator包中的ElTermResolver中通過(guò)valueExpression.getValue(context)完成了表達(dá)式的執(zhí)行,與@r00t4dm師傅也說(shuō)到了這個(gè):

Nexus Repository Manager 3幾次表達(dá)式解析漏洞的示例分析

于是反編譯了Nexus3所有jar包,然后搜索這個(gè)關(guān)鍵詞(使用的修復(fù)版本搜索,主要是看有沒(méi)有遺漏的地方?jīng)]修復(fù);Nexue3有開(kāi)源部分代碼,也可以直接在源碼搜索):

F:\compare-file\nexus-3.21.2-03-win64\nexus-3.21.2-03\system\com\sonatype\nexus\plugins\nexus-healthcheck-base\3.21.2-03\nexus-healthcheck-base-3.21.2-03\com\sonatype\nexus\clm\validator\ClmAuthenticationValidator.java:
   26           return this.validate(ClmAuthenticationType.valueOf(iqConnectionXo.getAuthenticationType(), ClmAuthenticationType.USER), iqConnectionXo.getUsername(), iqConnectionXo.getPassword(), context);
   27        } else {
   28:          context.buildConstraintViolationWithTemplate("unsupported annotated object " + value).addConstraintViolation();
   29           return false;
   30        }
   ..
   35        case 1:
   36           if (StringUtils.isBlank(username)) {
   37:             context.buildConstraintViolationWithTemplate("User Authentication method requires the username to be set.").addPropertyNode("username").addConstraintViolation();
   38           }
   39  
   40           if (StringUtils.isBlank(password)) {
   41:             context.buildConstraintViolationWithTemplate("User Authentication method requires the password to be set.").addPropertyNode("password").addConstraintViolation();
   42           }
   43  
   ..
   52           }
   53  
   54:          context.buildConstraintViolationWithTemplate("To proceed with PKI Authentication, clear the username and password fields. Otherwise, please select User Authentication.").addPropertyNode("authenticationType").addConstraintViolation();
   55           return false;
   56        default:
   57:          context.buildConstraintViolationWithTemplate("unsupported authentication type " + authenticationType).addConstraintViolation();
   58           return false;
   59        }F:\compare-file\nexus-3.21.2-03-win64\nexus-3.21.2-03\system\org\hibernate\validator\hibernate-validator\6.1.0.Final\hibernate-validator-6.1.0.Final\org\hibernate\validator\internal\constraintvalidators\hv\ScriptAssertValidator.java:34        if (!validationResult && !this.reportOn.isEmpty()) {35           constraintValidatorContext.disableDefaultConstraintViolation();36:          constraintValidatorContext.buildConstraintViolationWithTemplate(this.message).addPropertyNode(this.reportOn).addConstraintViolation();37        }38  F:\compare-file\nexus-3.21.2-03-win64\nexus-3.21.2-03\system\org\hibernate\validator\hibernate-validator\6.1.0.Final\hibernate-validator-6.1.0.Final\org\hibernate\validator\internal\engine\constraintvalidation\ConstraintValidatorContextImpl.java:
   55     }
   56  
   57:    public ConstraintViolationBuilder buildConstraintViolationWithTemplate(String messageTemplate) {
   58        return new ConstraintValidatorContextImpl.ConstraintViolationBuilderImpl(messageTemplate, this.getCopyOfBasePath());
   59     }F:\compare-file\nexus-3.21.2-03-win64\nexus-3.21.2-03\system\org\sonatype\nexus\nexus-cleanup\3.21.0-02\nexus-cleanup-3.21.0-02\org\sonatype\nexus\cleanup\storage\config\CleanupPolicyAssetNamePatternValidator.java:18           } catch (RegexCriteriaValidator.InvalidExpressionException var4) {19              context.disableDefaultConstraintViolation();20:             context.buildConstraintViolationWithTemplate(var4.getMessage()).addConstraintViolation();21              return false;22           }F:\compare-file\nexus-3.21.2-03-win64\nexus-3.21.2-03\system\org\sonatype\nexus\nexus-cleanup\3.21.2-03\nexus-cleanup-3.21.2-03\org\sonatype\nexus\cleanup\storage\config\CleanupPolicyAssetNamePatternValidator.java:
   18           } catch (RegexCriteriaValidator.InvalidExpressionException var4) {
   19              context.disableDefaultConstraintViolation();
   20:             context.buildConstraintViolationWithTemplate(this.getEscapeHelper().stripJavaEl(var4.getMessage())).addConstraintViolation();
   21              return false;
   22           }F:\compare-file\nexus-3.21.2-03-win64\nexus-3.21.2-03\system\org\sonatype\nexus\nexus-scheduling\3.21.2-03\nexus-scheduling-3.21.2-03\org\sonatype\nexus\scheduling\constraints\CronExpressionValidator.java:
   29        } catch (IllegalArgumentException var4) {
   30           context.disableDefaultConstraintViolation();
   31:          context.buildConstraintViolationWithTemplate(this.getEscapeHelper().stripJavaEl(var4.getMessage())).addConstraintViolation();
   32           return false;
   33        }F:\compare-file\nexus-3.21.2-03-win64\nexus-3.21.2-03\system\org\sonatype\nexus\nexus-security\3.21.2-03\nexus-security-3.21.2-03\org\sonatype\nexus\security\privilege\PrivilegesExistValidator.java:
   42           if (!privilegeId.matches("^[a-zA-Z0-9\\-]{1}[a-zA-Z0-9_\\-\\.]*$")) {
   43              context.disableDefaultConstraintViolation();
   44:             context.buildConstraintViolationWithTemplate("Invalid privilege id: " + this.getEscapeHelper().stripJavaEl(privilegeId) + ". " + "Only letters, digits, underscores(_), hyphens(-), and dots(.) are allowed and may not start with underscore or dot.").addConstraintViolation();   45              return false;   46           }   ..   55        } else {   56           context.disableDefaultConstraintViolation();   57:          context.buildConstraintViolationWithTemplate("Missing privileges: " + missing).addConstraintViolation();   58           return false;   59        }F:\compare-file\nexus-3.21.2-03-win64\nexus-3.21.2-03\system\org\sonatype\nexus\nexus-security\3.21.2-03\nexus-security-3.21.2-03\org\sonatype\nexus\security\role\RoleNotContainSelfValidator.java:   49              if (this.containsRole(id, roleId, processedRoleIds)) {   50                 context.disableDefaultConstraintViolation();   51:                context.buildConstraintViolationWithTemplate(this.message).addConstraintViolation();   52                 return false;   53              }F:\compare-file\nexus-3.21.2-03-win64\nexus-3.21.2-03\system\org\sonatype\nexus\nexus-security\3.21.2-03\nexus-security-3.21.2-03\org\sonatype\nexus\security\role\RolesExistValidator.java:   42        } else {   43           context.disableDefaultConstraintViolation();   44:          context.buildConstraintViolationWithTemplate("Missing roles: " + missing).addConstraintViolation();
   45           return false;
   46        }F:\compare-file\nexus-3.21.2-03-win64\nexus-3.21.2-03\system\org\sonatype\nexus\nexus-validation\3.21.2-03\nexus-validation-3.21.2-03\org\sonatype\nexus\validation\ConstraintViolationFactory.java:
   75        public boolean isValid(ConstraintViolationFactory.HelperBean bean, ConstraintValidatorContext context) {
   76           context.disableDefaultConstraintViolation();
   77:          ConstraintViolationBuilder builder = context.buildConstraintViolationWithTemplate(this.getEscapeHelper().stripJavaEl(bean.getMessage()));
   78           NodeBuilderCustomizableContext nodeBuilder = null;
   79           String[] var8;

后面作者也發(fā)布了漏洞分析,確實(shí)用了buildConstraintViolationWithTemplate作為了漏洞的根源,利用這個(gè)關(guān)鍵點(diǎn)做的污點(diǎn)跟蹤分析。

從上面的搜索結(jié)果中可以看到,el表達(dá)式導(dǎo)致的那三個(gè)CVE關(guān)鍵點(diǎn)也在其中,同時(shí)還有其他幾個(gè)地方,有幾個(gè)使用了this.getEscapeHelper().stripJavaEl做了清除,還有幾個(gè),看起來(lái)似乎也可以,心里一陣狂喜?然而,其他幾個(gè)沒(méi)有做清除的地方雖然能通過(guò)路由進(jìn)入,但是利用不了,后面會(huì)挑選其中的一個(gè)做下分析。所以在開(kāi)始說(shuō)了官方可能修復(fù)了幾個(gè)類(lèi)似的地方,猜想有兩種可能:

官方自己察覺(jué)到了那幾個(gè)地方也會(huì)存在el解析漏洞,所以做了清除

有其他漏洞發(fā)現(xiàn)者提交了那幾個(gè)做了清除的漏洞點(diǎn),因?yàn)槟菐讉€(gè)地方可以利用;但是沒(méi)清除的那幾個(gè)地方由于沒(méi)法利用,所以發(fā)現(xiàn)者并沒(méi)有提交,官方也沒(méi)有去做清除

不過(guò)感覺(jué)后一種可能性更大,畢竟官方不太可能有的地方做清除,有的地方不做清除,要做也是一起做清除工作。

CVE-2018-16621分析

這個(gè)漏洞對(duì)應(yīng)上面的搜索結(jié)果是RolesExistValidator,既然搜索到了關(guān)鍵點(diǎn),自己來(lái)手動(dòng)逆向回溯下看能不能回溯到有路由處理的地方,這里用簡(jiǎn)單的搜索回溯下。

關(guān)鍵點(diǎn)在RolesExistValidator的isValid,調(diào)用了buildConstraintViolationWithTemplate。搜索下有沒(méi)有調(diào)用RolesExistValidator的地方:

Nexus Repository Manager 3幾次表達(dá)式解析漏洞的示例分析

在RolesExist中有調(diào)用,這種寫(xiě)法一般會(huì)把RolesExist當(dāng)作注解來(lái)使用,并且進(jìn)行校驗(yàn)時(shí)會(huì)調(diào)用RolesExistValidator.isValid()。繼續(xù)搜索RolesExist:

Nexus Repository Manager 3幾次表達(dá)式解析漏洞的示例分析

有好幾處直接使用了RolesExist對(duì)roles屬性進(jìn)行注解,可以一個(gè)一個(gè)去回溯,不過(guò)按照Role這個(gè)關(guān)鍵字RoleXO可能性更大,所以先看這個(gè)(UserXO也可以的),繼續(xù)搜索RoleXO:

Nexus Repository Manager 3幾次表達(dá)式解析漏洞的示例分析

會(huì)有很多其他干擾的,比如第一個(gè)紅色標(biāo)注RoleXOResponse,這種可以忽略,我們找直接使用RoleXO的地方。在RoleComponent中,看到第二個(gè)紅色標(biāo)注這種注解大概就知道,這里能進(jìn)入路由了。第三個(gè)紅色標(biāo)注使用了roleXO,并且有roles關(guān)鍵字,上面RolesExist也是對(duì)roles進(jìn)行注解的,所以這里猜測(cè)是對(duì)roleXO進(jìn)行屬性注入。有的地方反編譯出來(lái)的代碼不好理解,可以結(jié)合源碼看:

Nexus Repository Manager 3幾次表達(dá)式解析漏洞的示例分析

可以看到這里就是將提交的參數(shù)注入給了roleXO,RoleComponent對(duì)應(yīng)的路由如下:

Nexus Repository Manager 3幾次表達(dá)式解析漏洞的示例分析

通過(guò)上面的分析,我們大概知道了能進(jìn)入到最終的RolesExistValidator,不過(guò)中間可能還有很多條件需要滿足,需要構(gòu)造payload然后一步一步測(cè)。這個(gè)路由對(duì)應(yīng)的web頁(yè)面位置如下:

Nexus Repository Manager 3幾次表達(dá)式解析漏洞的示例分析

測(cè)試(這里使用的3.21.1版本,CVE-2018-16621是之前的漏洞,在3.21.1早修復(fù)了,不過(guò)3.21.1又被繞過(guò)了,所以下面使用的是繞過(guò)的情況,將$換成$\\x去繞過(guò),繞過(guò)在后面兩個(gè)CVE再說(shuō)):

Nexus Repository Manager 3幾次表達(dá)式解析漏洞的示例分析

修復(fù)方式:

Nexus Repository Manager 3幾次表達(dá)式解析漏洞的示例分析

加上了getEscapeHelper().stripJavaEL對(duì)el表達(dá)式做了清除,將${替換為了{(lán),之后的兩個(gè)CVE就是對(duì)這個(gè)修復(fù)方式的繞過(guò):

Nexus Repository Manager 3幾次表達(dá)式解析漏洞的示例分析

CVE-2020-10204分析

這就是上面說(shuō)到的對(duì)之前stripJavaEL修復(fù)的繞過(guò),這里就不細(xì)分析了,利用$\\x格式就不會(huì)被替換掉(使用3.21.1版本測(cè)試):

Nexus Repository Manager 3幾次表達(dá)式解析漏洞的示例分析

CVE-2020-10199分析

這個(gè)漏洞對(duì)應(yīng)上面搜索結(jié)果是ConstraintViolationFactory:

Nexus Repository Manager 3幾次表達(dá)式解析漏洞的示例分析

buildConstraintViolationWith(標(biāo)號(hào)1)出現(xiàn)在了HelperValidator(標(biāo)號(hào)2)的isValid中,HelperValidator又被注解在HelperAnnotation(標(biāo)號(hào)3、4)之上,HelperAnnotation注解在了HelperBean(標(biāo)號(hào)5)之上,在ConstraintViolationFactory.createViolation方法中使用到了HelperBean(標(biāo)號(hào)6、7)。按照這個(gè)思路要找調(diào)用了ConstraintViolationFactory.createViolation的地方。

也來(lái)手動(dòng)逆向回溯下看能不能回溯到有路由處理的地方。

搜索ConstraintViolationFactory:

Nexus Repository Manager 3幾次表達(dá)式解析漏洞的示例分析

有好幾個(gè),這里使用第一個(gè)BowerGroupRepositoriesApiResource分析,點(diǎn)進(jìn)去看就能看出它是一個(gè)API路由:

Nexus Repository Manager 3幾次表達(dá)式解析漏洞的示例分析

ConstraintViolationFactory被傳遞給了super,在BowerGroupRepositoriesApiResource并沒(méi)有調(diào)用ConstraintViolationFactory的其他函數(shù),不過(guò)它的兩個(gè)方法,也是調(diào)用了super對(duì)應(yīng)的方法。它的super是AbstractGroupRepositoriesApiResource類(lèi):

Nexus Repository Manager 3幾次表達(dá)式解析漏洞的示例分析

BowerGroupRepositoriesApiResource構(gòu)造函數(shù)中調(diào)用的super,在AbstractGroupRepositoriesApiResource賦值了ConstraintViolationFactory(標(biāo)號(hào)1),ConstraintViolationFactory的使用(標(biāo)號(hào)2),調(diào)用了createViolation(在后面可以看到memberNames參數(shù)),這也是之前要到達(dá)漏洞點(diǎn)所需要的,這個(gè)調(diào)用處于validateGroupMembers中(標(biāo)號(hào)3),validateGroupMembers的調(diào)用在createRepository(標(biāo)號(hào)4)和updateRepository(標(biāo)號(hào)5)中都進(jìn)行了調(diào)用,而這兩個(gè)方法通過(guò)上面的注解也可以看出,通過(guò)外部傳遞請(qǐng)求能到達(dá)。

BowerGroupRepositoriesApiResource的路由為/beta/repositories/bower/group,在后臺(tái)API找到它來(lái)進(jìn)行調(diào)用(使用3.21.1測(cè)試):

Nexus Repository Manager 3幾次表達(dá)式解析漏洞的示例分析

還有AbstractGroupRepositoriesApiResource的其他幾個(gè)子類(lèi)也是可以的:

Nexus Repository Manager 3幾次表達(dá)式解析漏洞的示例分析

CleanupPolicyAssetNamePatternValidator未做清除點(diǎn)分析

對(duì)應(yīng)上面搜索結(jié)果的CleanupPolicyAssetNamePatternValidator,可以看到這里并沒(méi)有做StripEL清除操作:

Nexus Repository Manager 3幾次表達(dá)式解析漏洞的示例分析

這個(gè)變量是通過(guò)報(bào)錯(cuò)拋出放到buildConstraintViolationWithTemplate中的,要是報(bào)錯(cuò)信息中包含了value值,那么這里就是可以利用的。

搜索CleanupPolicyAssetNamePatternValidator:

Nexus Repository Manager 3幾次表達(dá)式解析漏洞的示例分析

在CleanupPolicyAssetNamePattern類(lèi)注解中使用了,繼續(xù)搜索CleanupPolicyAssetNamePattern:

Nexus Repository Manager 3幾次表達(dá)式解析漏洞的示例分析

在CleanupPolicyCriteria中的屬性regex被CleanupPolicyAssetNamePattern注解了,繼續(xù)搜索CleanupPolicyCriteria:

Nexus Repository Manager 3幾次表達(dá)式解析漏洞的示例分析

Nexus Repository Manager 3幾次表達(dá)式解析漏洞的示例分析

在CleanupPolicyComponent中的to CleanupPolicy方法中有調(diào)用,其中的cleanupPolicyXO.getCriteria也正好是CleanupPolicyCriteria對(duì)象。toCleanupPolicy在CleanupPolicyComponent的可通過(guò)路由進(jìn)入的create、previewCleanup方法又調(diào)用了toCleanupPolicy。

構(gòu)造payload測(cè)試:

Nexus Repository Manager 3幾次表達(dá)式解析漏洞的示例分析

然而這里并不能利用,value值不會(huì)被包含在報(bào)錯(cuò)信息中,去看了下RegexCriteriaValidator.validate,無(wú)論如何構(gòu)造,最終也只會(huì)拋出value中的一個(gè)字符,所以這里并不能利用。

與這個(gè)類(lèi)似的是CronExpressionValidator,那里也是通過(guò)拋出異常,但是那里是可以利用的,不過(guò)被修復(fù)了,可能之前已經(jīng)有人提交過(guò)了。還有其他幾個(gè)沒(méi)做清除的地方,要么被if、else跳過(guò)了,要么不能利用。

人工去回溯查找的方式,如果關(guān)鍵字被調(diào)用的地方不多可能還好,不過(guò)要是被大量使用,可能就不是那么好處理了。不過(guò)上面幾個(gè)漏洞,可以看到通過(guò)手動(dòng)回溯查找還是可行的。

JXEL造成的漏洞(CVE-2019-7238)

可以參考下@iswin大佬之前的分析https://www.anquanke.com/post/id/171116,這里就不再去調(diào)試截圖了。這里想寫(xiě)下之前對(duì)這個(gè)漏洞的修復(fù),說(shuō)是加了權(quán)限來(lái)修復(fù),要是只加了權(quán)限,那不是還能提交一下?不過(guò),測(cè)試了下3.21.1版本,就算用admin權(quán)限也無(wú)法利用了,想去看下是不是能繞過(guò)。在3.14.0中測(cè)試,確實(shí)是可以的:

Nexus Repository Manager 3幾次表達(dá)式解析漏洞的示例分析

但是3.21.1中,就算加了權(quán)限,也是不行的。后面分別調(diào)試對(duì)比了下,以及通過(guò)下面這個(gè)測(cè)試:

JexlEngine jexl = new JexlBuilder().create();String jexlExp = "''.class.forName('java.lang.Runtime').getRuntime().exec('calc.exe')";JexlExpression e = jexl.createExpression(jexlExp);JexlContext jc = new MapContext();jc.set("foo", "aaa");e.evaluate(jc);

才知道3.14.0與上面這個(gè)測(cè)試使用的是org.apache.commons.jexl3.internal.introspection.Uberspect處理,它的getMethod方法如下:

Nexus Repository Manager 3幾次表達(dá)式解析漏洞的示例分析

而在3.21.1中Nexus設(shè)置的是org.apache.commons.jexl3.internal.introspection.SandboxJexlUberspect,這個(gè)SandboxJexlUberspect,它的get Method方法如下:

Nexus Repository Manager 3幾次表達(dá)式解析漏洞的示例分析

Nexus Repository Manager 3幾次表達(dá)式解析漏洞的示例分析

可以看出只允許調(diào)用String、Map、Collection類(lèi)型的有限幾個(gè)方法了。

總結(jié)

看完上面的內(nèi)容,相信對(duì)Nexus3的漏洞大體有了解了,不會(huì)再無(wú)從下手的感覺(jué)。嘗試看下下其他地方,例如后臺(tái)有個(gè)LDAP,可進(jìn)行jndi connect操作,不過(guò)那里調(diào)用的是context.getAttribute,雖然會(huì)遠(yuǎn)程請(qǐng)求class文件,不過(guò)并不會(huì)加載class,所以并沒(méi)有危害。

有的漏洞的根源點(diǎn)可能會(huì)在一個(gè)應(yīng)用中出現(xiàn)相似的地方,就像上面那個(gè)buildConstraintViolationWithTemplate這個(gè)keyword一樣,運(yùn)氣好說(shuō)不定一個(gè)簡(jiǎn)單的搜索都能碰到一些相似漏洞(不過(guò)我運(yùn)氣貌似差了點(diǎn),通過(guò)上面的搜索可以看到某些地方的修復(fù),說(shuō)明已經(jīng)有人先行一步了,直接調(diào)用了buildConstraintViolationWithTemplate并且可用的地方似乎已經(jīng)沒(méi)有了)

仔細(xì)看下上面幾個(gè)漏洞的payload,好像相似度很高,所以可以弄個(gè)類(lèi)似fuzz參數(shù)的工具,搜集這個(gè)應(yīng)用的歷史漏洞payload,每個(gè)參數(shù)都可以測(cè)試下對(duì)應(yīng)的payload,運(yùn)氣好可能會(huì)撞到一些相似漏洞

以上是“Nexus Repository Manager 3幾次表達(dá)式解析漏洞的示例分析”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對(duì)大家有所幫助,如果還想學(xué)習(xí)更多知識(shí),歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道!


當(dāng)前名稱(chēng):NexusRepositoryManager3幾次表達(dá)式解析漏洞的示例分析
分享地址:http://weahome.cn/article/ghioep.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部