forked from owasp-modsecurity/ModSecurity
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathverify_svnr.cc
115 lines (93 loc) · 2.57 KB
/
verify_svnr.cc
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
#include "src/operators/verify_svnr.h"
#include <string>
#include "src/operators/operator.h"
#include "modsecurity/rule.h"
#include "modsecurity/rule_message.h"
#include "modsecurity/rules_set_properties.h"
namespace modsecurity {
namespace operators {
int VerifySVNR::convert_to_int(const char c) {
int n;
if ((c>='0') && (c<='9'))
n = c - '0';
else
n = 0;
return n;
}
bool VerifySVNR::verify(const char *svnrnumber, int len) {
int var_len = len;
int sum = 0;
unsigned int i = 0, svnr_len = 10;
int svnr[11];
char s_svnr[11];
while ((*svnrnumber != '\0') && ( var_len > 0))
{
// Always true on the original code.
//if (*svnrnumber != '-' || *svnrnumber != '.')
{
if (i < svnr_len && isdigit(*svnrnumber))
{
s_svnr[i] = *svnrnumber;
svnr[i] = convert_to_int(*svnrnumber);
i++;
}
}
svnrnumber++;
var_len--;
}
if (i != svnr_len)
{
return 0;
}
else
{
for (i = 0; i< svnr_len; i++)
{
if (strncmp(s_svnr,bad_svnr[i],svnr_len) == 0)
{
return 0;
}
}
}
//Laufnummer mit 3, 7, 9
//Geburtsdatum mit 5, 8, 4, 2, 1, 6
sum = svnr[0] * 3 + svnr[1] * 7 + svnr[2] * 9 + svnr[4] * 5 + svnr[5] * 8 + svnr[6] * 4 + svnr[7] * 2 + svnr[8] * 1 + svnr[9] * 6;
sum %= 11;
if(sum == 10){
sum = 0;
}
if (sum == svnr[3])
{
return true;
}
return false;
}
bool VerifySVNR::evaluate(Transaction *t, RuleWithActions *rule,
const std::string& input, std::shared_ptr<RuleMessage> ruleMessage) {
std::list<SMatch> matches;
bool is_svnr = false;
int i;
if (m_param.empty()) {
return is_svnr;
}
for (i = 0; i < input.size() - 1 && is_svnr == false; i++) {
matches = m_re->searchAll(input.substr(i, input.size()));
for (const auto & j : matches) {
is_svnr = verify(j.str().c_str(), j.str().size());
if (is_svnr) {
logOffset(ruleMessage, j.offset(), j.str().size());
if (rule && t && rule->hasCaptureAction()) {
t->m_collections.m_tx_collection->storeOrUpdateFirst(
"0", j.str());
ms_dbg_a(t, 7, "Added VerifySVNR match TX.0: " + \
j.str());
}
goto out;
}
}
}
out:
return is_svnr;
}
} // namespace operators
} // namespace modsecurity