diff --git a/apache2/modsecurity.c b/apache2/modsecurity.c index 3a914c1d..37035ca4 100644 --- a/apache2/modsecurity.c +++ b/apache2/modsecurity.c @@ -295,6 +295,10 @@ apr_status_t modsecurity_tx_init(modsec_rec *msr) { msr_log(msr, 1, "Initialisation: Error occurred while parsing QUERY_STRING arguments."); return -1; } + + if (invalid_count) { + msr->urlencoded_error = 1; + } } msr->arguments_to_sanitize = apr_table_make(msr->mp, 16); diff --git a/apache2/modsecurity.h b/apache2/modsecurity.h index bef39bc7..db8f1852 100644 --- a/apache2/modsecurity.h +++ b/apache2/modsecurity.h @@ -257,6 +257,8 @@ struct modsec_rec { apr_table_t *request_headers_to_sanitize; apr_table_t *response_headers_to_sanitize; apr_table_t *request_cookies; + + unsigned int urlencoded_error; unsigned int is_relevant; diff --git a/apache2/msc_reqbody.c b/apache2/msc_reqbody.c index aa71756d..b74b1aba 100644 --- a/apache2/msc_reqbody.c +++ b/apache2/msc_reqbody.c @@ -423,6 +423,10 @@ static apr_status_t modsecurity_request_body_end_urlencoded(modsec_rec *msr, cha *error_msg = apr_pstrdup(msr->mp, "Initialisation: Error occurred while parsing BODY arguments."); return -1; } + + if (invalid_count) { + msr->urlencoded_error = 1; + } return 1; } diff --git a/apache2/re_variables.c b/apache2/re_variables.c index b8325d55..46705e6d 100644 --- a/apache2/re_variables.c +++ b/apache2/re_variables.c @@ -1414,6 +1414,18 @@ static int var_multipart_unmatched_boundary_generate(modsec_rec *msr, msre_var * } } +/* URLENCODED_ERROR */ + +static int var_urlencoded_error_generate(modsec_rec *msr, msre_var *var, msre_rule *rule, + apr_table_t *vartab, apr_pool_t *mptmp) +{ + if (msr->urlencoded_error) { + return var_simple_generate(var, vartab, mptmp, "1"); + } else { + return var_simple_generate(var, vartab, mptmp, "0"); + } +} + /* TIME */ static int var_time_generate(modsec_rec *msr, msre_var *var, msre_rule *rule, @@ -2972,6 +2984,17 @@ void msre_engine_register_default_variables(msre_engine *engine) { VAR_CACHE, PHASE_RESPONSE_HEADERS ); + + /* URLENCODED_ERROR */ + msre_engine_variable_register(engine, + "URLENCODED_ERROR", + VAR_SIMPLE, + 0, 0, + NULL, + var_urlencoded_error_generate, + VAR_DONT_CACHE, /* flag */ + PHASE_REQUEST_HEADERS + ); /* USER */ msre_engine_variable_register(engine,