-
[Clear]TSG CTF 2021 Welcome to TSG CTF! WriteupCTF/TSG CTF 2021 2021. 10. 5. 07:25
이름만 들어서는 sanity check 문제 같지만, 나름 WEB 카테고리의 문제이다.
주어진 URL에 접속하면 위와같은 페이지가 나타난다. 플래그를 입력하면 일치여부를 판단해주는 것 같다.
주어진 소스에서 플래그 출력조건을 분석해보면,
const {promises: fs} = require('fs'); const fastify = require('fastify'); const flag = process.env.FLAG || 'DUMMY{DUMMY}'; const app = fastify(); app.get('/', async (_, res) => { res.type('text/html').send(await fs.readFile('index.html')); }); app.post('/', (req, res) => { if (typeof req.body === 'object' && req.body[flag] === true) { ##### ......... (1) return res.send(`Nice! flag is ${flag}`); } return res.send(`You failed...`); }); app.listen(34705, '0.0.0.0');
(1)에 의해 사용자 입력값 요청 패킷의 body 의 type이 object이면서 req.body[flag] 즉, req.body['TSGCTF{~~~'] 의 값이 True여야 한다. 현재 플래그의 상태의 상태를 모르므로, 처음에는 혹시 js에서 객체의 property가 오직 하나일때 property name을 모르더라도 접근할수있는 방법이 있을까? 라는 방향성으로 공부해봤는데 별다른 소득이 없었다.
다만, 여러 시도를 해보다가 얻은정보는 에러 발생 시 상세 에러 메시지를 출력해준다는 것이었다.
body에 아무 값을 입력하지 않았을 때
Body cannot be empty when content-type is set to 'application/json'
라는 에러 메시지가 반환되어서, content-type도 같이 삭제해보면 어떨까? 라는 생각을 하게되었고
그 결과 에러메시지 내에서 플래그 정보를 획득 할 수 있었다.
원리로는, null의 type이 object이기 때문에 첫 번째 조건을 만족하며 그 이후의 null[flag] === true 조건의 만족 여부를 판단하는 과정에서 읽으려는 object가 null이므로 에러메시지를 반환하는 과정에서 property명이 노출되는 것이다.
FLAG = TSGCTF{M4king_We6_ch4l1en9e_i5_1ik3_playing_Jenga}
반응형