Mod_security is a popular Apache plugin that serves as a Web Application Firewall, screening requests coming in to the webserver based on a set of configurable rules.
The “best rules” for mod_security are often requested, although there is not a ruleset that is absolutely the best. Every website and application has slightly different circumstances, which will require some fine-tuning of the rules to make sure they are strict enough to be protective, but not so strict as to disallow normal users.
We recommend the rules below, which help to screen command injection and other forms of web-based attacks. You should copy the entire text of these rules (or whichever rules you would like to activate) into your modsec2.user.conf configuration file, or the configuration file your mod_security installation has setup for user-configurable rules.
SecRule ARGS {php} “severity:4,log,deny,id:6624001″
SecRule ARGS eval “severity:4,log,deny,id:6624002″
SecRule ARGS base64_decode “severity:4,log,deny,id:6624003″
SecRule REQUEST_URI|ARGS|REQUEST_BODY “base64_decode” “severity:4,log,deny,msg:’Access Denied’id:’6624009′”
SecRule REQUEST_URI|ARGS|REQUEST_BODY “eval” “severity:4,log,deny,msg:’Access Denied’id:’6624010′”
SecRule REQUEST_URI|ARGS|REQUEST_BODY “{php}” “severity:4,log,deny,msg:’Access Denied’id:’6624011′”
SecPcreMatchLimit 150000
SecPcreMatchLimitRecursion 150000
SecRequestBodyAccess On
SecRule FILES_TMPNAMES “@inspectFile /etc/cxs/cxscgi.sh” \
“log,auditlog,deny,severity:2,phase:2,t:none,id:’1010101′”
SecTmpDir /tmp
# Deprecated due to security issues so it should be off: http://blog.modsecurity.org/2008/08/transformation.html
SecCacheTransformations Off
# Check Content-Length and reject all non numeric ones
SecRule REQUEST_HEADERS:Content-Length “!^\d+$” “deny,log,auditlog,msg:’Content-Length HTTP header is not numeric’, severity:’2′,id:’960016′”
# Do not accept GET or HEAD requests with bodies
SecRule REQUEST_METHOD “^(?:GET|HEAD)$” “chain,phase:2,t:none,deny,log,auditlog,status:400,msg:’GET or HEAD requests with bodies’, severity:’2′,id:’960011′,tag:’PROTOCOL_VIOLATION/EVASION’”
SecRule REQUEST_HEADERS:Content-Length “!^0?$” t:none
# Require Content-Length to be provided with every POST request.
SecRule REQUEST_METHOD “^POST$” “chain,phase:2,t:none,deny,log,auditlog,status:400,msg:’POST request must have a Content-Length header’,id:’960012′,tag:’PROTOCOL_VIOLATION/EVASION’,severity:’4′”
SecRule &REQUEST_HEADERS:Content-Length “@eq 0″ t:none
# Don’t accept transfer encodings we know we don’t know how to handle
SecRule REQUEST_HEADERS:Transfer-Encoding “!^$” “phase:2,t:none,deny,log,auditlog,status:501,msg:’ModSecurity does not support transfer encodings’,id:’960013′,tag:’PROTOCOL_VIOLATION/EVASION’,severity:’3′”
# Check decodings
SecRule REQUEST_FILENAME|ARGS|ARGS_NAMES|REQUEST_HEADERS|!REQUEST_HEADERS:Referer “@validateUrlEncoding” \
“chain, deny,log,auditlog,msg:’Access Denied’,id:’950107′,severity:’4′”
SecRule REQUEST_FILENAME|ARGS|ARGS_NAMES|REQUEST_HEADERS|!REQUEST_HEADERS:Referer “\%(?![0-9a-fA-F]{2}|u[0-9a-fA-F]{4})”
SecRule REQUEST_FILENAME|ARGS|ARGS_NAMES|REQUEST_HEADERS|!REQUEST_HEADERS:Referer “@validateUtf8Encoding” “deny,log,auditlog,msg:’Access Denied’,id:’950801′,severity:’4′”
# Proxy access attempt
SecRule REQUEST_URI_RAW ^\w+:/ “phase:2,t:none,deny,log,auditlog,status:400,msg:’Proxy access attempt’, severity:’2′,id:’960014′,tag:’PROTOCOL_VIOLATION/PROXY_ACCESS’”
# Restrict type of characters sent
SecRule REQUEST_FILENAME|REQUEST_HEADERS_NAMES|REQUEST_HEADERS|!REQUEST_HEADERS:Referer \
“@validateByteRange 1-255″ \
“log,auditlog,msg:’Request Missing an Accept Header’, severity:’2′,id:’960015′,t:urlDecodeUni,phase:1″
SecRule ARGS|ARGS_NAMES “@validateByteRange 1-255″ \
“deny,log,auditlog,msg:’Invalid character in request’,id:’960901′,severity:’4′,t:urlDecodeUni,phase:2″
# allow request methods
SecRule REQUEST_METHOD “!^((?:(?:POS|GE)T|OPTIONS|HEAD))$” \
“phase:2,t:none,log,auditlog,status:501,msg:’Method is not allowed by policy’, severity:’2′,id:’960032′,tag:’POLICY/METHOD_NOT_ALLOWED’”
# Restrict file extension:
# removed exe so that frontpage will work
# Restricted HTTP headers
SecRule REQUEST_HEADERS_NAMES “\.(?:Lock-Token|Translate|If)$” \
“deny,log,auditlog,msg:’HTTP header is restricted by policy’,id:’960038′,severity:’4′”
SecRule HTTP_User-Agent “(?:\b(?:m(?:ozilla\/4\.0 \(compatible\)|etis)|webtrends security analyzer|pmafind)\b|n(?:-stealth|sauditor|essus|ikto)|b(?:lack ?widow|rutus|ilbo)|(?:jaascoi|paro)s|internet explorer|webinspect|\.nasl)” \
“deny,log,auditlog,msg:’Request Indicates a Security Scanner Scanned the Site’,id:’990002′,severity:’2′”
SecRule REQUEST_HEADERS_NAMES “\bacunetix-product\b” \
“deny,log,auditlog,msg:’Request Indicates a Security Scanner Scanned the Site’,id:’990901′,severity:’2′”
SecRule REQUEST_FILENAME “^/nessustest” \
“deny,log,auditlog,msg:’Request Indicates a Security Scanner Scanned the Site’,id:’990902′,severity:’2′”
SecRule REQUEST_HEADERS:User-Agent “(?:m(?:ozilla\/(?:4\.0 \(compatible; advanced email extractor|2\.0 \(compatible; newt activex; win32\))|ailto:craftbot\@yahoo\.com)|e(?:mail(?:(?:collec|harves|magne)t|(?: extracto|reape)r|siphon|wolf)|(?:collecto|irgrabbe)r|xtractorpro|o browse)|a(?:t(?:tache|hens)|utoemailspider|dsarobot)|w(?:eb(?:emailextrac| by mail)|3mir)|f(?:astlwspider|loodgate)|p(?:cbrowser|ackrat|surf)|(?:digout4uagen|takeou)t|(?:chinacla|be)w|hhjhj@yahoo|rsync|shai|zeus)” \
“deny,log,auditlog,msg:’Rogue web site crawler’,id:’990012′,severity:’2′”
SecRule REQUEST_HEADERS:User-Agent “(?:\b(?:(?:indy librar|snoop)y|microsoft url control|lynx)\b|d(?:ownload demon|isco)|w(?:3mirror|get)|l(?:ibwww|wp)|p(?:avuk|erl)|cu(?:sto|rl)|big brother|autohttp|netants|eCatch)” \
“chain,log,auditlog,msg:’Request Indicates an automated program explored the site’,id:’990011′,severity:’5′”
SecRule REQUEST_HEADERS:User-Agent “!^apache.*perl”
# Blind SQL injection
SecRule REQUEST_FILENAME|ARGS|ARGS_NAMES|REQUEST_HEADERS|XML:/*|!REQUEST_HEADERS:Referer “@pm sys.user_triggers sys.user_objects @@spid msysaces instr sys.user_views sys.tab charindex sys.user_catalog constraint_type locate select msysobjects attnotnull sys.user_tables sys.user_tab_columns sys.user_constraints waitfor mysql.user sys.all_tables msysrelationships msyscolumns msysqueries” \
“phase:2,t:none,t:urlDecodeUni,t:htmlEntityDecode,t:lowercase,t:replaceComments,t:compressWhiteSpace,pass,nolog,skip:1,id:’1040401′”
SecAction phase:2,pass,nolog,skipAfter:959007,id:1040402
SecRule REQUEST_FILENAME|ARGS|ARGS_NAMES|REQUEST_HEADERS|!REQUEST_HEADERS:Referer “(?:\b(?:(?:s(?:ys\.(?:user_(?:(?:t(?:ab(?:_column|le)|rigger)|object|view)s|c(?:onstraints|atalog))|all_tables|tab)|elect\b.{0,40}\b(?:substring|ascii|user))|m(?:sys(?:(?:queri|ac)e|relationship|column|object)s|ysql.user)|c(?:onstraint_type|harindex)|attnotnull)\b|(?:locate|instr)\W+\()|\@\@spid\b)” \
“phase:2,capture,t:none,t:htmlEntityDecode,t:lowercase,t:replaceComments,t:compressWhiteSpace,ctl:auditLogParts=+E,log,auditlog,msg:’Blind SQL Injection Attack’,id:’950007′,tag:’WEB_ATTACK/SQL_INJECTION’,logdata:’%{TX.0}’,severity:’2′,id:’9600016′”
SecRule REQUEST_FILENAME|ARGS|REQUEST_HEADERS|!REQUEST_HEADERS:Referer “\b(?:(?:s(?:ys(?:(?:(?:process|tabl)e|filegroup|object)s|c(?:o(?:nstraint|lumn)s|at)|dba|ibm)|ubstr(?:ing)?)|user_(?:(?:(?:constrain|objec)t|tab(?:_column|le)|ind_column|user)s|password|group)|a(?:tt(?:rel|typ)id|ll_objects)|object_(?:(?:nam|typ)e|id)|pg_(?:attribute|class)|column_(?:name|id)|(?:dba|mb)_users|xtype\W+\bchar|rownum)\b|t(?:able_name\b|extpos\W+\())” \
“phase:2,capture,t:none,t:urlDecodeUni,t:htmlEntityDecode,t:lowercase,t:replaceComments,t:compressWhiteSpace,ctl:auditLogParts=+E,log,auditlog,msg:’Blind SQL Injection Attack’,id:’959007′,tag:’WEB_ATTACK/SQL_INJECTION’,logdata:’%{TX.0}’,severity:’2′,id:’9600116′”
SecRule REQUEST_FILENAME|ARGS|REQUEST_HEADERS|XML:/*|!REQUEST_HEADERS:Referer “@pm substr xtype textpos all_objects rownum sysfilegroups sysprocesses user_group sysobjects user_tables systables pg_attribute user_users user_password column_id attrelid user_tab_columns table_name pg_class user_constraints user_objects object_type dba_users sysconstraints mb_users column_name atttypid object_id substring syscat user_ind_columns sysibm syscolumns sysdba object_name” \
“phase:2,t:none,t:urlDecodeUni,t:htmlEntityDecode,t:replaceComments,t:compressWhiteSpace,t:lowercase,pass,nolog,skip:1,id:’9600118′”
SecAction phase:2,pass,nolog,skipAfter:959904,id:’9600123′
SecRule REQUEST_FILENAME|ARGS “\b(?:(?:s(?:ys(?:(?:(?:process|tabl)e|filegroup|object)s|c(?:o(?:nstraint|lumn)s|at)|dba|ibm)|ubstr(?:ing)?)|user_(?:(?:(?:constrain|objec)t|tab(?:_column|le)|ind_column|user)s|password|group)|a(?:tt(?:rel|typ)id|ll_objects)|object_(?:(?:nam|typ)e|id)|pg_(?:attribute|class)|column_(?:name|id)|(?:dba|mb)_users|xtype\W+\bchar|rownum)\b|t(?:able_name\b|extpos\W+\())” \
“phase:2,capture,t:none,t:htmlEntityDecode,t:replaceComments,t:compressWhiteSpace,t:lowercase,ctl:auditLogParts=+E,log,auditlog,msg:’Blind SQL Injection Attack’,id:’950904′,tag:’WEB_ATTACK/SQL_INJECTION’,logdata:’%{TX.0}’,severity:’2′”
SecRule REQUEST_HEADERS|XML:/*|!REQUEST_HEADERS:Referer “\b(?:(?:s(?:ys(?:(?:(?:process|tabl)e|filegroup|object)s|c(?:o(?:nstraint|lumn)s|at)|dba|ibm)|ubstr(?:ing)?)|user_(?:(?:(?:constrain|objec)t|tab(?:_column|le)|ind_column|user)s|password|group)|a(?:tt(?:rel|typ)id|ll_objects)|object_(?:(?:nam|typ)e|id)|pg_(?:attribute|class)|column_(?:name|id)|(?:dba|mb)_users|xtype\W+\bchar|rownum)\b|t(?:able_name\b|extpos\W+\())” \
“phase:2,capture,t:none,t:urlDecodeUni,t:htmlEntityDecode,t:replaceComments,t:compressWhiteSpace,t:lowercase,ctl:auditLogParts=+E,log,auditlog,msg:’Blind SQL Injection Attack’,id:’959904′,tag:’WEB_ATTACK/SQL_INJECTION’,logdata:’%{TX.0}’,severity:’2′”
# SQL injection
SecRule REQUEST_FILENAME|ARGS|ARGS_NAMES|REQUEST_HEADERS|XML:/*|!REQUEST_HEADERS:Referer “@pm insert xp_enumdsn infile openrowset nvarchar autonomous_transaction print data_type or outfile inner shutdown tbcreator @@version xp_filelist sp_prepare sql_longvarchar xp_regenumkeys xp_loginconfig xp_dirtree ifnull sp_addextendedproc xp_regaddmultistring delete sp_sqlexec and sp_oacreate sp_execute cast xp_ntsec xp_regdeletekey drop varchar xp_execresultset having utl_file xp_regenumvalues xp_terminate xp_availablemedia xp_regdeletevalue dumpfile isnull sql_variant select ‘sa’ xp_regremovemultistring xp_makecab ‘msdasql’ xp_cmdshell openquery sp_executesql ‘sqloledb’ dbms_java ‘dbo’ utl_http sp_makewebtask benchmark xp_regread xp_regwrite” \
“phase:2,t:none,t:urlDecodeUni,t:htmlEntityDecode,t:replaceComments,t:compressWhiteSpace,t:lowercase,pass,nolog,skip:1,id:’9600121′”
SecAction phase:2,pass,nolog,id:999501,skipAfter:959001,id:’9600125′
SecRule REQUEST_FILENAME|ARGS|ARGS_NAMES “(?:\b(?:(?:s(?:elect\b(?:.{1,100}?\b(?:(?:length|count|top)\b.{1,100}?\bfrom|from\b.{1,100}?\bwhere)|.*?\b(?:d(?:ump\b.*\bfrom|ata_type)|(?:to_(?:numbe|cha)|inst)r))|p_(?:(?:addextendedpro|sqlexe)c|(?:oacreat|prepar)e|execute(?:sql)?|makewebtask)|ql_(?:longvarchar|variant))|xp_(?:reg(?:re(?:movemultistring|ad)|delete(?:value|key)|enum(?:value|key)s|addmultistring|write)|e(?:xecresultset|numdsn)|(?:terminat|dirtre)e|availablemedia|loginconfig|cmdshell|filelist|makecab|ntsec)|u(?:nion\b.{1,100}?\bselect|tl_(?:file|http))|group\b.*\bby\b.{1,100}?\bhaving|d(?:elete\b\W*?\bfrom|bms_java)|load\b\W*?\bdata\b.*\binfile|(?:n?varcha|tbcreato)r)\b|i(?:n(?:to\b\W*?\b(?:dump|out)file|sert\b\W*?\binto|ner\b\W*?\bjoin)\b|(?:f(?:\b\W*?\(\W*?\bbenchmark|null\b)|snull\b)\W*?\()|a(?:nd\b ?(?:\d{1,10}|[\’\”][^=]{1,10}[\’\”]) ?[=<>]+|utonomous_transaction\b)|o(?:r\b ?(?:\d{1,10}|[\’\”][^=]{1,10}[\’\”]) ?[=<>]+|pen(?:rowset|query)\b)|having\b ?(?:\d{1,10}|[\’\”][^=]{1,10}[\’\”]) ?[=<>]+|print\b\W*?\@\@|cast\b\W*?\()|(?:;\W*?\b(?:shutdown|drop)|\@\@version)\b|’(?:s(?:qloledb|a)|msdasql|dbo)’)” \
“phase:2,capture,t:none,t:htmlEntityDecode,t:replaceComments,t:compressWhiteSpace,t:lowercase,ctl:auditLogParts=+E,log,auditlog,msg:’SQL Injection Attack’,id:’950001′,tag:’WEB_ATTACK/SQL_INJECTION’,logdata:’%{TX.0}’,severity:’2′”
SecRule REQUEST_HEADERS|XML:/*|!REQUEST_HEADERS:Referer “(?:\b(?:(?:s(?:elect\b(?:.{1,100}?\b(?:(?:length|count|top)\b.{1,100}?\bfrom|from\b.{1,100}?\bwhere)|.*?\b(?:d(?:ump\b.*\bfrom|ata_type)|(?:to_(?:numbe|cha)|inst)r))|p_(?:(?:addextendedpro|sqlexe)c|(?:oacreat|prepar)e|execute(?:sql)?|makewebtask)|ql_(?:longvarchar|variant))|xp_(?:reg(?:re(?:movemultistring|ad)|delete(?:value|key)|enum(?:value|key)s|addmultistring|write)|e(?:xecresultset|numdsn)|(?:terminat|dirtre)e|availablemedia|loginconfig|cmdshell|filelist|makecab|ntsec)|u(?:nion\b.{1,100}?\bselect|tl_(?:file|http))|group\b.*\bby\b.{1,100}?\bhaving|d(?:elete\b\W*?\bfrom|bms_java)|load\b\W*?\bdata\b.*\binfile|(?:n?varcha|tbcreato)r)\b|i(?:n(?:to\b\W*?\b(?:dump|out)file|sert\b\W*?\binto|ner\b\W*?\bjoin)\b|(?:f(?:\b\W*?\(\W*?\bbenchmark|null\b)|snull\b)\W*?\()|a(?:nd\b ?(?:\d{1,10}|[\’\”][^=]{1,10}[\’\”]) ?[=<>]+|utonomous_transaction\b)|o(?:r\b ?(?:\d{1,10}|[\’\”][^=]{1,10}[\’\”]) ?[=<>]+|pen(?:rowset|query)\b)|having\b ?(?:\d{1,10}|[\’\”][^=]{1,10}[\’\”]) ?[=<>]+|print\b\W*?\@\@|cast\b\W*?\()|(?:;\W*?\b(?:shutdown|drop)|\@\@version)\b|’(?:s(?:qloledb|a)|msdasql|dbo)’)” \
“phase:2,capture,t:none,t:urlDecodeUni,t:htmlEntityDecode,t:replaceComments,t:compressWhiteSpace,t:lowercase,ctl:auditLogParts=+E,log,auditlog,msg:’SQL Injection Attack’,id:’959001′,tag:’WEB_ATTACK/SQL_INJECTION’,logdata:’%{TX.0}’,severity:’2′”
SecRule REQUEST_FILENAME|ARGS|ARGS_NAMES “\b(\d+) ?= ?\1\b|[\’\”](\w+)[\’\”] ?= ?[\’\”]\2\b” \
“phase:2,capture,t:none,t:htmlEntityDecode,t:replaceComments,t:compressWhiteSpace,t:lowercase,ctl:auditLogParts=+E,log,auditlog,msg:’SQL Injection Attack’,id:’950901′,tag:’WEB_ATTACK/SQL_INJECTION’,logdata:’%{TX.0}’,severity:’2′”
SecRule REQUEST_HEADERS|XML:/*|!REQUEST_HEADERS:Referer “\b(\d+) ?= ?\1\b|[\’\”](\w+)[\’\”] ?= ?[\’\”]\2\b” \
“phase:2,capture,t:none,t:urlDecodeUni,t:htmlEntityDecode,t:replaceComments,t:compressWhiteSpace,t:lowercase,ctl:auditLogParts=+E,log,auditlog,msg:’SQL Injection Attack’,id:’959901′,tag:’WEB_ATTACK/SQL_INJECTION’,logdata:’%{TX.0}’,severity:’2′”
SecRule REQUEST_FILENAME|ARGS|REQUEST_HEADERS|XML:/*|!REQUEST_HEADERS:Referer “@pm user_objects object_type substr all_objects mb_users column_name rownum atttypid substring object_id user_group user_tables pg_attribute user_users column_id user_password attrelid object_name table_name pg_class” \
“phase:2,t:none,t:urlDecodeUni,t:htmlEntityDecode,t:replaceComments,t:compressWhiteSpace,t:lowercase,pass,nolog,skip:1,id:’95990013′”
SecAction phase:2,pass,nolog,skipAfter:959906,id:’9600127′
SecRule REQUEST_FILENAME|ARGS “\b(?:user_(?:(?:object|table|user)s|password|group)|a(?:tt(?:rel|typ)id|ll_objects)|object_(?:(?:nam|typ)e|id)|pg_(?:attribute|class)|column_(?:name|id)|substr(?:ing)?|table_name|mb_users|rownum)\b” \
“phase:2,capture,t:none,t:htmlEntityDecode,t:replaceComments,t:compressWhiteSpace,t:lowercase,ctl:auditLogParts=+E,log,auditlog,msg:’SQL Injection Attack’,id:’950906′,tag:’WEB_ATTACK/SQL_INJECTION’,logdata:’%{TX.0}’,severity:’2′”
SecRule REQUEST_HEADERS|XML:/*|!REQUEST_HEADERS:Referer “\b(?:user_(?:(?:object|table|user)s|password|group)|a(?:tt(?:rel|typ)id|ll_objects)|object_(?:(?:nam|typ)e|id)|pg_(?:attribute|class)|column_(?:name|id)|substr(?:ing)?|table_name|mb_users|rownum)\b” \
“phase:2,capture,t:none,t:urlDecodeUni,t:htmlEntityDecode,t:replaceComments,t:compressWhiteSpace,t:lowercase,ctl:auditLogParts=+E,log,auditlog,msg:’SQL Injection Attack’,id:’959906′,tag:’WEB_ATTACK/SQL_INJECTION’,logdata:’%{TX.0}’,severity:’2′”
SecRule REQUEST_FILENAME|ARGS|ARGS_NAMES|!REQUEST_HEADERS:via “\b(?:coalesce\b|root\@)” \
“phase:2,capture,t:none,t:htmlEntityDecode,t:replaceComments,t:compressWhiteSpace,t:lowercase,ctl:auditLogParts=+E,log,auditlog,msg:’SQL Injection Attack’,id:’950908′,tag:’WEB_ATTACK/SQL_INJECTION’,logdata:’%{TX.0}’,severity:’2′”
SecRule REQUEST_HEADERS|XML:/*|!REQUEST_HEADERS:Referer|!REQUEST_HEADERS:via “\b(?:coalesce\b|root\@)” \
“phase:2,capture,t:none,t:urlDecodeUni,t:htmlEntityDecode,t:replaceComments,t:compressWhiteSpace,t:lowercase,ctl:auditLogParts=+E,log,auditlog,msg:’SQL Injection Attack’,id:’959908′,tag:’WEB_ATTACK/SQL_INJECTION’,logdata:’%{TX.0}’,severity:’2′”
# file injection
SecRule REQUEST_FILENAME|ARGS|ARGS_NAMES|REQUEST_HEADERS|XML:/* “@pm .www_acl .htpasswd .htaccess boot.ini httpd.conf /etc/ .htgroup global.asa .wwwacl” \
“phase:2,t:none,t:urlDecodeUni,t:htmlEntityDecode,t:lowercase,pass,nolog,skip:1,id:’95990015′”
SecAction phase:2,pass,nolog,skipAfter:959005,id:’9600131′
SecRule REQUEST_FILENAME|ARGS|ARGS_NAMES “(?:\b(?:\.(?:ht(?:access|passwd|group)|www_?acl)|global\.asa|httpd\.conf|boot\.ini)\b|\/etc\/)” \
“phase:2,capture,t:none,t:htmlEntityDecode,t:lowercase,ctl:auditLogParts=+E,deny,log,auditlog,status:501,msg:’Access Denied’,id:’950005′,tag:’WEB_ATTACK/FILE_INJECTION’,logdata:’%{TX.0}’,severity:’2′”
SecRule REQUEST_HEADERS|XML:/* “(?:\b(?:\.(?:ht(?:access|passwd|group)|www_?acl)|global\.asa|httpd\.conf|boot\.ini)\b|\/etc\/)” \
“phase:2,capture,t:none,t:urlDecodeUni,t:htmlEntityDecode,t:lowercase,ctl:auditLogParts=+E,deny,log,auditlog,status:501,msg:’Access Denied’,id:’959005′,tag:’WEB_ATTACK/FILE_INJECTION’,logdata:’%{TX.0}’,severity:’2′”
# Command access
SecRule REQUEST_FILENAME “\b(?:n(?:map|et|c)|w(?:guest|sh)|cmd(?:32)?|telnet|rcmd|ftp)\.exe\b” \
“phase:2,capture,t:none,t:htmlEntityDecode,t:lowercase,ctl:auditLogParts=+E,deny,log,auditlog,status:501,msg:’System Command Access’,id:’950002′,tag:’WEB_ATTACK/FILE_INJECTION’,logdata:’%{TX.0}’,severity:’2′”
# Command injection
SecRule ARGS “@pm uname wguest.exe /perl /nasm rcmd.exe nc tclsh /xterm finger tftp chown /echo nmap.exe ping /passwd /chsh ps /uname telnet.exe /ftp ls tclsh8 lsof /ping echo cmd.exe /kill python traceroute /ps perl passwd wsh.exe /rm /cpp chgrp /telnet localgroup kill /chgrp /finger nasm /ls nc.exe id /chmod /nc /g++ /id /chown cmd /nmap chsh /gcc net.exe /python /lsof ftp.exe ftp xterm mail /mail tracert nmap rm cd chmod cpp telnet cmd32.exe gcc g++” \
“phase:2,t:none,t:htmlEntityDecode,t:lowercase,pass,nolog,skip:1,id:’95990017′”
SecAction phase:2,pass,nolog,skipAfter:950006,id:’9600133′
SecRule ARGS “(?:\b(?:(?:n(?:et(?:\b\W+?\blocalgroup|\.exe)|(?:map|c)\.exe)|t(?:racer(?:oute|t)|elnet\.exe|clsh8?|ftp)|(?:w(?:guest|sh)|rcmd|ftp)\.exe|echo\b\W*?\by+)\b|c(?:md(?:(?:32)?\.exe\b|\b\W*?\/c)|d(?:\b\W*?[\\\/]|\W*?\.\.)|hmod.{0,40}?\+.{0,3}x))|[\;\|\`]\W*?\b(?:(?:c(?:h(?:grp|mod|own|sh)|md|pp)|p(?:asswd|ython|erl|ing|s)|n(?:asm|map|c)|f(?:inger|tp)|(?:kil|mai)l|(?:xte)?rm|ls(?:of)?|telnet|uname|echo|id)\b|g(?:\+\+|cc\b))|\/(?:c(?:h(?:grp|mod|own|sh)|pp)|p(?:asswd|ython|erl|ing|s)|n(?:asm|map|c)|f(?:inger|tp)|(?:kil|mai)l|g(?:\+\+|cc)|(?:xte)?rm|ls(?:of)?|telnet|uname|echo|id)(?:[\’\”\|\;\`\-\s]|$))” \
“phase:2,capture,t:none,t:htmlEntityDecode,t:lowercase,ctl:auditLogParts=+E,deny,log,auditlog,status:501,msg:’System Command Injection’,id:’950006′,tag:’WEB_ATTACK/COMMAND_INJECTION’,logdata:’%{TX.0}’,severity:’2′”
SecRule REQUEST_HEADERS|XML:/*|!REQUEST_HEADERS:’/^(Cookie|Referer|X-OS-Prefs)$/’|REQUEST_COOKIES|REQUEST_COOKIES_NAMES \
“@pm uname wguest.exe /perl /nasm rcmd.exe nc tclsh /xterm finger tftp chown /echo nmap.exe ping /passwd /chsh ps /uname telnet.exe /ftp ls tclsh8 lsof /ping echo cmd.exe /kill python traceroute /ps perl passwd wsh.exe /rm /cpp chgrp /telnet localgroup kill /chgrp /finger nasm /ls nc.exe id /chmod /nc /g++ /id /chown cmd /nmap chsh /gcc net.exe /python /lsof ftp.exe ftp xterm mail /mail tracert nmap rm cd chmod cpp telnet cmd32.exe gcc g++” \
“phase:2,t:none,t:urlDecodeUni,t:htmlEntityDecode,t:lowercase,pass,nolog,skip:1,id:’95990019′”
SecAction pass,nolog,skipAfter:959006,id:’9600135′
SecRule REQUEST_HEADERS|XML:/*|!REQUEST_HEADERS:’/^(Cookie|Referer|X-OS-Prefs)$/’|REQUEST_COOKIES|REQUEST_COOKIES_NAMES \
“(?:\b(?:(?:n(?:et(?:\b\W+?\blocalgroup|\.exe)|(?:map|c)\.exe)|t(?:racer(?:oute|t)|elnet\.exe|clsh8?|ftp)|(?:w(?:guest|sh)|rcmd|ftp)\.exe|echo\b\W*?\by+)\b|c(?:md(?:(?:32)?\.exe\b|\b\W*?\/c)|d(?:\b\W*?[\\\/]|\W*?\.\.)|hmod.{0,40}?\+.{0,3}x))|[\;\|\`]\W*?\b(?:(?:c(?:h(?:grp|mod|own|sh)|md|pp)|p(?:asswd|ython|erl|ing|s)|n(?:asm|map|c)|f(?:inger|tp)|(?:kil|mai)l|(?:xte)?rm|ls(?:of)?|telnet|uname|echo|id)\b|g(?:\+\+|cc\b))|\/(?:c(?:h(?:grp|mod|own|sh)|pp)|p(?:asswd|ython|erl|ing|s)|n(?:asm|map|c)|f(?:inger|tp)|(?:kil|mai)l|g(?:\+\+|cc)|(?:xte)?rm|ls(?:of)?|telnet|uname|echo|id)(?:[\’\”\|\;\`\-\s]|$))” \
“phase:2,capture,t:none,t:urlDecodeUni,t:htmlEntityDecode,t:lowercase,ctl:auditLogParts=+E,deny,log,auditlog,status:501,msg:’System Command Injection’,id:’959006′,tag:’WEB_ATTACK/COMMAND_INJECTION’,logdata:’%{TX.0}’,severity:’2′”
SecRule ARGS \
“(?:(?:[\;\|\`]\W*?\bcc|\bwget)\b|\/cc(?:[\’\”\|\;\`\-\s]|$))” \
“phase:2,capture,t:none,t:htmlEntityDecode,t:lowercase,ctl:auditLogParts=+E,deny,log,auditlog,status:501,msg:’System Command Injection’,id:’950907′,tag:’WEB_ATTACK/COMMAND_INJECTION’,logdata:’%{TX.0}’,severity:’2′”
SecRule “REQUEST_HEADERS|XML:/*|!REQUEST_HEADERS:’/^(Cookie|Referer|X-OS-Prefs|User-Agent)$/’|REQUEST_COOKIES|REQUEST_COOKIES_NAMES” \
“(?:(?:[\;\|\`]\W*?\bcc|\bwget)\b|\/cc(?:[\’\”\|\;\`\-\s]|$))” \
“phase:2,capture,t:none,t:urlDecodeUni,t:htmlEntityDecode,t:lowercase,ctl:auditLogParts=+E,deny,log,auditlog,status:501,msg:’System Command Injection’,id:’959907′,tag:’WEB_ATTACK/COMMAND_INJECTION’,logdata:’%{TX.0}’,severity:’2′”
# SSI injection
SecRule REQUEST_FILENAME|ARGS|ARGS_NAMES “<!–\W*?#\W*?(?:e(?:cho|xec)|printenv|include|cmd)” \
“phase:2,capture,t:none,t:htmlEntityDecode,t:lowercase,ctl:auditLogParts=+E,deny,log,auditlog,status:501,msg:’SSI injection Attack’,id:’950011′,tag:’WEB_ATTACK/SSI_INJECTION’,logdata:’%{TX.0}’,severity:’2′”
SecRule REQUEST_HEADERS|XML:/* “<!–\W*?#\W*?(?:e(?:cho|xec)|printenv|include|cmd)” \
“phase:2,capture,t:none,t:urlDecodeUni,t:htmlEntityDecode,t:lowercase,ctl:auditLogParts=+E,deny,log,auditlog,status:501,msg:’SSI injection Attack’,id:’959011′,tag:’WEB_ATTACK/SSI_INJECTION’,logdata:’%{TX.0}’,severity:’2′”
# PHP injection
SecRule REQUEST_FILENAME|ARGS|ARGS_NAMES|REQUEST_HEADERS|XML:/* “@pm <?fgets move_uploaded_file $_session readfile ftp_put ftp_fget gzencode ftp_nb_put bzopen readdir $_post fopen gzread ftp_nb_fput ftp_nb_fget ftp_get $_get scandir fscanf readgzfile fread proc_open fgetc fgetss ftp_fput ftp_nb_get session_start fwrite gzwrite gzopen gzcompress” \
“phase:2,t:none,t:urlDecodeUni,t:htmlEntityDecode,t:lowercase,pass,nolog,skip:1,id:’95990026′”
SecAction pass,nolog,skipAfter:959013,id:’9600137′
SecRule REQUEST_FILENAME|ARGS|ARGS_NAMES “(?:(?:\b(?:f(?:tp_(?:nb_)?f?(?:ge|pu)t|get(?:s?s|c)|scanf|write|open|read)|gz(?:(?:encod|writ)e|compress|open|read)|s(?:ession_start|candir)|read(?:(?:gz)?file|dir)|move_uploaded_file|(?:proc_|bz)open)|\$_(?:(?:pos|ge)t|session))\b|<\?(?!xml))” \
“phase:2,capture,t:none,t:htmlEntityDecode,t:lowercase,ctl:auditLogParts=+E,deny,log,auditlog,status:501,msg:’PHP Injection Attack’,id:’950013′,tag:’WEB_ATTACK/PHP_INJECTION’,tag:’WEB_ATTACK/HTTP_RESPONSSE_SPLITTING’,logdata:’%{TX.0}’,severity:’2′”
SecRule REQUEST_HEADERS|XML:/* “(?:(?:\b(?:f(?:tp_(?:nb_)?f?(?:ge|pu)t|get(?:s?s|c)|scanf|write|open|read)|gz(?:(?:encod|writ)e|compress|open|read)|s(?:ession_start|candir)|read(?:(?:gz)?file|dir)|move_uploaded_file|(?:proc_|bz)open)|\$_(?:(?:pos|ge)t|session))\b|<\?(?!xml))” \
“phase:2,capture,t:none,t:urlDecodeUni,t:htmlEntityDecode,t:lowercase,ctl:auditLogParts=+E,deny,log,auditlog,status:501,msg:’PHP Injection Attack’,id:’959013′,tag:’WEB_ATTACK/PHP_INJECTION’,tag:’WEB_ATTACK/HTTP_RESPONSSE_SPLITTING’,logdata:’%{TX.0}’,severity:’2′”