-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathclasswork9.js
More file actions
63 lines (52 loc) · 1.67 KB
/
Copy pathclasswork9.js
File metadata and controls
63 lines (52 loc) · 1.67 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
const express = require('express');
const router = express.Router();
let requestCount = {};
// Clean up old entries every minute
setInterval(() => {
const now = Date.now();
Object.keys(requestCount).forEach(ip => {
if (now - requestCount[ip].timestamp > 60000) {
delete requestCount[ip];
}
});
}, 60000);
router.all('/', (req, res) => {
const ip = req.ip;
const bypassToken = req.headers['x-bypass-token'];
const userAgent = req.headers['user-agent'];
if (userAgent && userAgent.toLowerCase().includes('mozilla')) {
return res.status(403).json({
error: 'Browser access blocked',
hint: 'Use API client'
});
}
// Initialize rate tracking
if (!requestCount[ip]) {
requestCount[ip] = { count: 0, timestamp: Date.now() };
}
const now = Date.now();
// Reset counter if window expired
if (now - requestCount[ip].timestamp > 60000) {
requestCount[ip] = { count: 0, timestamp: now };
}
requestCount[ip].count++;
// Rate limit: 3 requests per minute
if (requestCount[ip].count > 3) {
if (bypassToken !== 'bypass-rate-limit-2025') {
return res.status(429).json({
error: 'Rate limit exceeded (3 requests per minute)',
hint: 'Look for a special header to bypass rate limiting',
attempts: requestCount[ip].count,
windowReset: '60 seconds from first request'
});
}
}
res.json({
flag: 'FLAG_CLASSWORK9=FLAG{rate_limit_bypass_token_owned}',
message: '✅ Challenge 9 completed! Rate limit bypass found!',
bypassUsed: bypassToken === 'bypass-rate-limit-2025',
requestCount: requestCount[ip].count,
nextChallenge: '/classwork10'
});
});
module.exports = router;