[DreamHack] My Best Friend Write-up

2025. 6. 8. 21:29보안/웹

728x90

들어가면 이런 화면이 나오고 아무거나 쳐보면

내가 친 응답이 나온다. 코드를 보자

import express from 'express';
import axios from 'axios';
import path from 'path';

const app = express();

const FLAG = 'null{REDACTED}';

app.use(express.json());
app.use(express.urlencoded({ extended: true }));

app.get('/', (req, res) => {
  return res.sendFile(path.join(__dirname, "..", "greet.html"));
});

/**
 * @description Private API
 */
app.get('/api', (req, res) => {
  if (req.ip !== '::1') return res.send('No');

  const isAdmin = Number(req.query.admin);

  console.log('isAdmin', isAdmin);

  if (isAdmin !== 0) {
    return res.send(FLAG);
  }
  return res.send(`${req.query.msg} ❤️`);
});

app.post('/greet', async (req, res) => {
  const msg = String(req.body.msg);
  if (msg.includes('admin') || msg.includes('\\') || msg.includes('%') || msg.includes('?') || msg.includes(';') || msg.includes('#') || msg.includes('[') || msg.includes(']')) return res.json({ result: 'Not allowed character' });

  const resp = await axios.get(`http://localhost:3000/api?msg=${msg}&admin=0`);

  return res.json({ result: resp.data });
});

app.listen(3000);

if 문 안에 있는 문자들이 들어가면 필터링 되고 , admin=0이라는 기본값이 설정되어 있어 이 값을 0이 아닌 다른 수로 바꿔줘야 flag가 나온다.

admin=1로 하려면 if문의 조건에 필터링되기 때문에 우회를 해야 한다.

처음엔 includes 함수를 검색해보니 대소문자 구분이 없다해서 그걸로 우회하는건가 했는데 안됐다.

주석처리를 하려해도 #이 필터링이라 안됐고 , 이것저것 해보다가 개행문자로 필터링하는 방식을 떠올려냈다.

\n 이나 \t로 필터링하여 admin 사이에 넣어 필터링을 우회할 수 있다.

 

728x90

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

[DreamHack] Random Test Write-up  (0) 2025.06.16
[DreamHack] baby-Case Write-up  (3) 2025.06.09
[DreamHack] Test Your Luck Write-up  (0) 2025.06.08
[DreamHack] Replace Trick! Write-up  (0) 2025.01.06
[DreamHack] Find The Lost Flag Write-up  (1) 2025.01.06