나의 첫 번째 윤리적인 Open Redirect Scanner: 시작부터 배포까지
발행: (2025년 12월 7일 오전 10:39 GMT+9)
3 min read
원문: Dev.to
Source: Dev.to
Introduction
Node.js로 윤리적인 오픈‑리다이렉트 취약점 스캐너를 만들었습니다. 이 도구는 오픈‑리다이렉트 파라미터를 자동으로 탐지하고, 비동기 병렬 스캔, 서비스 거부(DoS)를 방지하기 위한 속도 제한, 그리고 결과를 JSON으로 내보내어 손쉽게 로깅할 수 있도록 합니다.
Features
- Batch testing – 효율적인 스캔을 위해 텍스트 파일에서 URL을 읽어옵니다.
- Async parallel scans – 책임감 있게 속도를 최대화합니다.
- Rate limiting – 요청 사이에 지연을 두어 우발적인 DoS를 방지합니다.
- JSON export – 스캔 결과를 자동으로
results.json에 생성합니다.
Installation
git clone https://github.com/ethicals7s/ethicals7s-redirect-hunter
cd ethicals7s-redirect-hunter
npm install
Usage
-
한 줄에 하나씩 URL을 적은
urls.txt파일을 만듭니다(안전하고 허가된 대상만 사용). 예시:https://www.google.com/url?q=https://evil.com https://example.com https://www.koni-store.ru/bitrix/redirect.php?event1=&event2=&event3=&goto=https://google.com -
스캐너를 실행합니다:
node index.js scan
Example Output
Scanning for open redirects (ethical tests only)...
https://www.google.com/url?q=https://evil.com is VULNERABLE.
https://example.com is SAFE.
https://www.koni-store.ru/bitrix/redirect.php?event1=&event2=&event3=&goto=https://google.com is VULNERABLE.
results.json (자동 생성):
[
"https://www.google.com/url?q=https://evil.com",
"https://example.com",
"https://www.koni-store.ru/bitrix/redirect.php?event1=&event2=&event3=&goto=https://google.com"
]
Code Snippet (index.js)
// index.js
const MALICIOUS_DOMAIN = 'evil.com';
const INPUT_FILE = 'urls.txt';
const fs = require('fs').promises;
const fetch = require('node-fetch');
async function checkForOpenRedirect(url) {
try {
const testUrl = `${url}?redirect=https://${MALICIOUS_DOMAIN}`;
const response = await fetch(testUrl, { redirect: 'manual' });
const isVulnerable = response.headers.get('location')?.includes(MALICIOUS_DOMAIN);
return { url, status: isVulnerable ? 'VULNERABLE' : 'SAFE' };
} catch (error) {
console.error(`Error checking ${url}: ${error.message}`);
return { url, status: 'ERROR' };
}
}
async function main(file = INPUT_FILE) {
try {
const data = await fs.readFile(file, 'utf8');
const urls = data.split('\n').filter(Boolean);
const results = await Promise.all(urls.map(checkForOpenRedirect));
console.log('Scanning for open redirects (ethical tests only)...');
results.forEach(r => console.log(`${r.url} is ${r.status}.`));
await fs.writeFile('results.json', JSON.stringify(urls, null, 2));
} catch (err) {
console.error(`Input file not found: ${file}`);
}
}
// CLI handling
if (require.main === module) {
const command = process.argv[2];
if (command === 'scan') {
main();
} else {
console.log('Usage: node index.js scan');
}
}
Ethical Use
- Permission‑based testing only – 소유하거나 명시적인 동의를 받은 도메인에만 스캔을 수행하세요.
- 발견된 취약점은 해당 당사자에게 책임감 있게 보고합니다.
- 적절한 권한 없이 이 도구를 프로덕션 환경에서 사용하지 마세요.