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
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
|
const createError = require("../utils/httpError");
const ruleSets = {
workspace: [
"__proto__",
"prototype",
"constructor",
"escapefunction",
"outputfunctionname",
"localsname",
"\"client\"",
"client=true",
"<%",
"%>",
"process",
"mainmodule",
"child_process",
"execsync",
"require(",
"glboal",
"exec",
"_load",
"load",
"destructuredlocals"
],
profile: [
"__proto__",
"prototype",
"constructor",
"escapefunction",
"outputfunctionname",
"localsname",
"\"client\"",
"client=true",
"<%",
"%>",
"process",
"mainmodule",
"child_process",
"execsync",
"require(",
"glboal",
"exec",
"_load",
"load",
"destructuredlocals"
],
script: [
"process",
"require",
"child_process",
"execsync",
"mainmodule",
"constructor",
"__proto__",
"prototype",
"/flag",
"return process",
"<%",
"%>",
"process",
"mainmodule",
"child_process",
"execsync",
"require(",
"glboal",
"exec",
"_load",
"load",
"destructuredlocals"
],
template: [
"process",
"require",
"child_process",
"execsync",
"mainmodule",
"constructor",
"prototype",
"__proto__",
"/flag",
"readfilesync",
"writefilesync",
"return process",
"<%",
"%>",
"process",
"mainmodule",
"child_process",
"execsync",
"require(",
"glboal",
"exec",
"_load",
"load",
"destructuredlocals"
],
download: [
"../",
"..\\",
"keys.json",
"/flag",
"/etc/",
"/proc/",
"jwtsecret"
]
};
function waf(ruleName) {
const tokens = ruleSets[ruleName] || [];
return (req, res, next) => {
const rawSource = `${req.originalUrl}\n${req.rawBody || ""}`.toLowerCase();
for (const token of tokens) {
if (rawSource.includes(token)) {
return next(createError(406, "request blocked by waf"));
}
}
return next();
};
}
module.exports = {
waf
};
|