From f723870f18823f0789f6e38edc293379fd99f454 Mon Sep 17 00:00:00 2001 From: Felipe Zimmerle Date: Fri, 22 Jul 2016 13:10:18 -0300 Subject: [PATCH] Fix case sensitive variable resolution in in memory backend Variables are case insensitive --- .../backend/in_memory-per_process.cc | 4 +- .../backend/in_memory-per_process.h | 2 +- .../collection-case-insensitive.json | 62 +++++++++++++++++++ 3 files changed, 66 insertions(+), 2 deletions(-) create mode 100644 test/test-cases/regression/collection-case-insensitive.json diff --git a/src/collection/backend/in_memory-per_process.cc b/src/collection/backend/in_memory-per_process.cc index b2cea9ba..dc17b148 100644 --- a/src/collection/backend/in_memory-per_process.cc +++ b/src/collection/backend/in_memory-per_process.cc @@ -99,7 +99,9 @@ void InMemoryPerProcess::resolveMultiMatches(const std::string& var, if (x.first.at(keySize) != ':') { continue; } - if (x.first.compare(0, keySize, var) != 0) { + std::string fu = toupper(x.first); + std::string fvar = toupper(var); + if (fu.compare(0, keySize, fvar) != 0) { continue; } l->insert(l->begin(), new Variable(x.first, x.second)); diff --git a/src/collection/backend/in_memory-per_process.h b/src/collection/backend/in_memory-per_process.h index 97b85c24..9e6c4282 100644 --- a/src/collection/backend/in_memory-per_process.h +++ b/src/collection/backend/in_memory-per_process.h @@ -59,7 +59,7 @@ struct MyHash{ // You might need a better hash function than this size_t h = 0; std::for_each(Keyval.begin(), Keyval.end(), [&](char c) { - h += c; + h += tolower(c); }); return h; } diff --git a/test/test-cases/regression/collection-case-insensitive.json b/test/test-cases/regression/collection-case-insensitive.json new file mode 100644 index 00000000..384eaec7 --- /dev/null +++ b/test/test-cases/regression/collection-case-insensitive.json @@ -0,0 +1,62 @@ +[ + { + "enabled":1, + "version_min":300000, + "version_max":0, + "title":"Testing collection :: Case insensitive (1/1)", + "client":{ + "ip":"200.249.12.31", + "port":2313 + }, + "server":{ + "ip":"200.249.12.31", + "port":80 + }, + "request":{ + "headers":{ + "User-Agent":"Mozilla\/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.1.5) Gecko\/20091102 Firefox\/3.5.5 (.NET CLR 3.5.30729)", + "Accept":"text\/html,application\/xhtml+xml,application\/xml;q=0.9,*\/*;q=0.8", + "Accept-Language":"en-us,en;q=0.5", + "Accept-Encoding":"gzip,deflate", + "Accept-Charset":"ISO-8859-1,utf-8;q=0.7,*;q=0.7", + "Keep-Alive":"300", + "Connection":"keep-alive", + "Cookie":"PHPSESSID=rAAAAAAA2t5uvjq435r4q7ib3vtdjq120", + "Pragma":"no-cache", + "Cache-Control":"no-cache" + }, + "uri":"\/test.pl?param1= test ¶m2=test2", + "method":"GET", + "http_version":1.1, + "body":"" + }, + "response":{ + "headers":{ + "Content-Type":"text\/xml; charset=utf-8\n\r", + "Content-Length":"length\n\r" + }, + "body":[ + "\n\r", + "\n\r", + " \n\r", + " \n\r", + " string<\/EnlightenResult>\n\r", + " <\/EnlightenResponse>\n\r", + " <\/soap:Body>\n\r", + "<\/soap:Envelope>\n\r" + ] + }, + "expected":{ + "audit_log":"", + "debug_log":"Target value: \"matched_var:PHPSESSID=rAAAAAAA2t5uvjq435r4q7ib3vtdjq120\" \\(Variable: TX:something\\)", + "error_log":"" + }, + "rules":[ + "SecRuleEngine On", + "SecDebugLog \/tmp\/modsec_debug.log", + "SecDebugLogLevel 9", + "SecRule REQUEST_headers \"@contains PHPSESSID\" \"id:1,t:lowercase,t:none,setvar:TX.something=matched_var:%{matched_var}%\"", + "SecRule TX \"@contains to_test\" \"id:2,t:lowercase,t:none\"" + ] + } +] \ No newline at end of file