ModSecurity Rules for SQL Injection
ModSecurity Rules for SQL Injection
Open-source WAF implementation with ModSecurity:
# ModSecurity Core Rule Set (CRS) configuration
SecRuleEngine On
SecRequestBodyAccess On
SecResponseBodyAccess Off
# SQL Injection Protection Rules
# Generic SQL injection attacks
SecRule REQUEST_COOKIES|!REQUEST_COOKIES:/__utm/|REQUEST_COOKIES_NAMES|ARGS_NAMES|ARGS|XML:/* \
"@detectSQLi" \
"id:1001,\
phase:2,\
block,\
msg:'SQL Injection Attack Detected',\
logdata:'Matched Data: %{MATCHED_VAR} found within %{MATCHED_VAR_NAME}',\
severity:'CRITICAL',\
tag:'application-multi',\
tag:'language-multi',\
tag:'platform-multi',\
tag:'attack-sqli',\
tag:'OWASP_CRS',\
tag:'OWASP_CRS/WEB_ATTACK/SQL_INJECTION',\
setvar:'tx.sql_injection_score=+%{tx.critical_anomaly_score}',\
setvar:'tx.anomaly_score_pl1=+%{tx.critical_anomaly_score}'"
# SQL injection via libinjection
SecRule REQUEST_COOKIES|!REQUEST_COOKIES:/__utm/|REQUEST_COOKIES_NAMES|ARGS_NAMES|ARGS|XML:/* \
"@detectSQLi" \
"id:1002,\
phase:2,\
block,\
capture,\
msg:'SQL Injection libinjection',\
logdata:'Matched Data: %{MATCHED_VAR} found within %{MATCHED_VAR_NAME}',\
severity:'CRITICAL',\
multiMatch,\
tag:'application-multi',\
tag:'language-multi',\
tag:'platform-multi',\
tag:'attack-sqli',\
setvar:'tx.sql_injection_score=+%{tx.critical_anomaly_score}',\
setvar:'tx.anomaly_score_pl1=+%{tx.critical_anomaly_score}'"
# Custom rule for specific application patterns
SecRule ARGS:search|ARGS:filter|ARGS:query \
"@rx (?i)(?:(?:s(?:ys\.(?:user_(?:(?:t(?:ab(?:_column|le)|rigger)|object|view)s|c(?:onstraints|atalog))|all_tables|tab)|elect\s.{0,40}(?:substring|ascii|user))|m(?:sys(?:(?:\.all_|ac)users|_schema)|aster\.\.sysdatabases)|c(?:onnection_id|urrent_user)|database\s?\()|table_name\b)" \
"id:1003,\
phase:2,\
block,\
msg:'SQL Injection - Database enumeration attempt',\
severity:'CRITICAL',\
setvar:'tx.sql_injection_score=+%{tx.critical_anomaly_score}',\
setvar:'tx.anomaly_score_pl1=+%{tx.critical_anomaly_score}'"
# Outbound SQL error detection
SecRule RESPONSE_BODY \
"@rx (?i)(?:(?:s(?:qlserver|yntax)|(?:oracl|mysq)e)|ORA-|SQL syntax|Microsoft SQL|PostgreSQL)" \
"id:1004,\
phase:4,\
block,\
msg:'SQL Information Leakage',\
logdata:'Matched Data: %{MATCHED_VAR}',\
severity:'ERROR',\
tag:'attack-disclosure',\
setvar:'tx.outbound_anomaly_score_pl1=+%{tx.error_anomaly_score}'"