[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 |