[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.js 의 sanitize
함수에서 필터링을 진행한다.
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 |