mirror of
https://github.com/owasp-modsecurity/ModSecurity.git
synced 2025-11-17 01:51:52 +03:00
Added support for MATCHED_VAR and MATCHED_VAR_NAME. See #123.
This commit is contained in:
@@ -304,6 +304,9 @@ apr_status_t modsecurity_tx_init(modsec_rec *msr) {
|
||||
msr->tcache = apr_hash_make(msr->mp);
|
||||
if (msr->tcache == NULL) return -1;
|
||||
|
||||
msr->matched_var = (msc_string *)apr_pcalloc(msr->mp, sizeof(msc_string));
|
||||
if (msr->matched_var == NULL) return -1;
|
||||
|
||||
msr->highest_severity = 255; /* high, invalid value */
|
||||
|
||||
return 1;
|
||||
|
||||
@@ -324,7 +324,7 @@ struct modsec_rec {
|
||||
apr_time_t time_checkpoint_2;
|
||||
apr_time_t time_checkpoint_3;
|
||||
|
||||
const char *matched_var;
|
||||
msc_string *matched_var;
|
||||
int highest_severity;
|
||||
|
||||
/* upload */
|
||||
|
||||
@@ -1342,7 +1342,11 @@ static int execute_operator(msre_var *var, msre_rule *rule, modsec_rec *msr,
|
||||
log_escape(msr->mp, full_varname));
|
||||
}
|
||||
|
||||
msr->matched_var = apr_pstrdup(msr->mp, var->name);
|
||||
/* Save the last matched var data */
|
||||
msr->matched_var->name = apr_pstrdup(msr->mp, var->name);
|
||||
msr->matched_var->name_len = strlen(msr->matched_var->name);
|
||||
msr->matched_var->value = apr_pmemdup(msr->mp, var->value, var->value_len);
|
||||
msr->matched_var->value_len = var->value_len;
|
||||
|
||||
/* Keep track of the highest severity matched so far */
|
||||
if ((acting_actionset->severity > 0) && (acting_actionset->severity < msr->highest_severity))
|
||||
|
||||
@@ -769,39 +769,40 @@ static apr_status_t msre_action_sanitiseMatched_execute(modsec_rec *msr, apr_poo
|
||||
const apr_array_header_t *tarr;
|
||||
const apr_table_entry_t *telts;
|
||||
int i, type = 0;
|
||||
msc_string *mvar = msr->matched_var;
|
||||
|
||||
if (msr->matched_var == NULL) return 0;
|
||||
if (mvar->name_len == 0) return 0;
|
||||
|
||||
/* IMP1 We need to extract the variable name properly here,
|
||||
* taking into account it may have been escaped.
|
||||
*/
|
||||
if (strncmp(msr->matched_var, "ARGS:", 5) == 0) {
|
||||
sargname = apr_pstrdup(msr->mp, msr->matched_var + 5);
|
||||
if ((mvar->name_len > 5) && (strncmp(mvar->name, "ARGS:", 5) == 0)) {
|
||||
sargname = apr_pstrdup(msr->mp, mvar->name + 5);
|
||||
type = SANITISE_ARG;
|
||||
} else
|
||||
if (strncmp(msr->matched_var, "ARGS_NAMES:", 11) == 0) {
|
||||
sargname = apr_pstrdup(msr->mp, msr->matched_var + 11);
|
||||
if ((mvar->name_len > 11) && (strncmp(mvar->name, "ARGS_NAMES:", 11) == 0)) {
|
||||
sargname = apr_pstrdup(msr->mp, mvar->name + 11);
|
||||
type = SANITISE_ARG;
|
||||
} else
|
||||
if (strncmp(msr->matched_var, "REQUEST_HEADERS:", 16) == 0) {
|
||||
sargname = apr_pstrdup(msr->mp, msr->matched_var + 16);
|
||||
if ((mvar->name_len > 16) && (strncmp(mvar->name, "REQUEST_HEADERS:", 16) == 0)) {
|
||||
sargname = apr_pstrdup(msr->mp, mvar->name + 16);
|
||||
type = SANITISE_REQUEST_HEADER;
|
||||
} else
|
||||
if (strncmp(msr->matched_var, "REQUEST_HEADERS_NAMES:", 22) == 0) {
|
||||
sargname = apr_pstrdup(msr->mp, msr->matched_var + 22);
|
||||
if ((mvar->name_len > 22) && (strncmp(mvar->name, "REQUEST_HEADERS_NAMES:", 22) == 0)) {
|
||||
sargname = apr_pstrdup(msr->mp, mvar->name + 22);
|
||||
type = SANITISE_REQUEST_HEADER;
|
||||
} else
|
||||
if (strncmp(msr->matched_var, "RESPONSE_HEADERS:", 17) == 0) {
|
||||
sargname = apr_pstrdup(msr->mp, msr->matched_var + 17);
|
||||
if ((mvar->name_len > 17) && (strncmp(mvar->name, "RESPONSE_HEADERS:", 17) == 0)) {
|
||||
sargname = apr_pstrdup(msr->mp, mvar->name + 17);
|
||||
type = SANITISE_RESPONSE_HEADER;
|
||||
} else
|
||||
if (strncmp(msr->matched_var, "RESPONSE_HEADERS_NAMES:", 23) == 0) {
|
||||
sargname = apr_pstrdup(msr->mp, msr->matched_var + 23);
|
||||
if ((mvar->name_len > 23) && (strncmp(mvar->name, "RESPONSE_HEADERS_NAMES:", 23) == 0)) {
|
||||
sargname = apr_pstrdup(msr->mp, mvar->name + 23);
|
||||
type = SANITISE_RESPONSE_HEADER;
|
||||
}
|
||||
else {
|
||||
msr_log(msr, 3, "sanitiseMatched: Don't know how to handle variable: %s",
|
||||
msr->matched_var);
|
||||
mvar->name);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
@@ -843,8 +843,23 @@ static int var_ip_generate(modsec_rec *msr, msre_var *var, msre_rule *rule,
|
||||
static int var_matched_var_generate(modsec_rec *msr, msre_var *var, msre_rule *rule,
|
||||
apr_table_t *vartab, apr_pool_t *mptmp)
|
||||
{
|
||||
return var_simple_generate(var, vartab, mptmp,
|
||||
apr_pstrdup(mptmp, msr->matched_var));
|
||||
return var_simple_generate_ex(var, vartab, mptmp,
|
||||
apr_pmemdup(mptmp,
|
||||
msr->matched_var->value,
|
||||
msr->matched_var->value_len),
|
||||
msr->matched_var->value_len);
|
||||
}
|
||||
|
||||
/* MATCHED_VAR_NAME */
|
||||
|
||||
static int var_matched_var_name_generate(modsec_rec *msr, msre_var *var, msre_rule *rule,
|
||||
apr_table_t *vartab, apr_pool_t *mptmp)
|
||||
{
|
||||
return var_simple_generate_ex(var, vartab, mptmp,
|
||||
apr_pmemdup(mptmp,
|
||||
msr->matched_var->name,
|
||||
msr->matched_var->name_len),
|
||||
msr->matched_var->name_len);
|
||||
}
|
||||
|
||||
/* SESSION */
|
||||
@@ -2312,6 +2327,17 @@ void msre_engine_register_default_variables(msre_engine *engine) {
|
||||
PHASE_REQUEST_HEADERS
|
||||
);
|
||||
|
||||
/* MATCHED_VAR_NAME */
|
||||
msre_engine_variable_register(engine,
|
||||
"MATCHED_VAR_NAME",
|
||||
VAR_SIMPLE,
|
||||
0, 0,
|
||||
NULL,
|
||||
var_matched_var_name_generate,
|
||||
VAR_DONT_CACHE,
|
||||
PHASE_REQUEST_HEADERS
|
||||
);
|
||||
|
||||
/* MODSEC_BUILD */
|
||||
msre_engine_variable_register(engine,
|
||||
"MODSEC_BUILD",
|
||||
|
||||
Reference in New Issue
Block a user