Advertisement
Guest User

Untitled

a guest
Aug 17th, 2017
374
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 44.23 KB | None | 0 0
  1. /code [root@needful ~]# cat /etc/apache2/conf.d/modsec_vendor_configs/OWASP3/rules/REQUEST-920-PROTOCOL-ENFORCEMENT.conf
  2. # ------------------------------------------------------------------------
  3. # OWASP ModSecurity Core Rule Set ver.3.0.2
  4. # Copyright (c) 2006-2016 Trustwave and contributors. All rights reserved.
  5. #
  6. # The OWASP ModSecurity Core Rule Set is distributed under
  7. # Apache Software License (ASL) version 2
  8. # Please see the enclosed LICENSE file for full details.
  9. # ------------------------------------------------------------------------
  10.  
  11. #
  12. # Some protocol violations are common in application layer attacks.
  13. # Validating HTTP requests eliminates a large number of application layer attacks.
  14. #
  15. # The purpose of this rules file is to enforce HTTP RFC requirements that state how
  16. # the client is supposed to interact with the server.
  17. # http://www.w3.org/Protocols/rfc2616/rfc2616-sec3.html
  18.  
  19.  
  20.  
  21. #
  22. # -= Paranoia Level 0 (empty) =- (apply unconditionally)
  23. #
  24.  
  25.  
  26. SecRule TX:PARANOIA_LEVEL "@lt 1" "phase:1,id:920011,nolog,pass,skipAfter:END-REQUEST-920-PROTOCOL-ENFORCEMENT"
  27. SecRule TX:PARANOIA_LEVEL "@lt 1" "phase:2,id:920012,nolog,pass,skipAfter:END-REQUEST-920-PROTOCOL-ENFORCEMENT"
  28. #
  29. # -= Paranoia Level 1 (default) =- (apply only when tx.paranoia_level is sufficiently high: 1 or higher)
  30. #
  31.  
  32. #
  33. # Validate request line against the format specified in the HTTP RFC
  34. #
  35. # -=[ Rule Logic ]=-
  36. #
  37. # Uses rule negation against the regex for positive security. The regex specifies the proper
  38. # construction of URI request lines such as:
  39. #
  40. # "http:" "//" host [ ":" port ] [ abs_path [ "?" query ]]
  41. #
  42. # It also outlines proper construction for CONNECT, OPTIONS and GET requests.
  43. #
  44. # -=[ References ]=-
  45. # http://www.w3.org/Protocols/rfc2616/rfc2616-sec3.html#sec3.2.1
  46. # http://capec.mitre.org/data/definitions/272.html
  47. #
  48. SecRule REQUEST_LINE "!^(?i:(?:[a-z]{3,10}\s+(?:\w{3,7}?://[\w\-\./]*(?::\d+)?)?/[^?#]*(?:\?[^#\s]*)?(?:#[\S]*)?|connect (?:\d{1,3}\.){3}\d{1,3}\.?(?::\d+)?|options \*)\s+[\w\./]+|get /[^?#]*(?:\?[^#\s]*)?(?:#[\S]*)?)$" "msg:'Invalid HTTP Request Line', severity:'WARNING', id:920100, ver:'OWASP_CRS/3.0.0', rev:'2', maturity:'9', accuracy:'9', logdata:'%{request_line}', phase:request, block, t:none, tag:'application-multi', tag:'language-multi', tag:'platform-multi', tag:'attack-protocol', tag:'OWASP_CRS/PROTOCOL_VIOLATION/INVALID_REQ', tag:'CAPEC-272', setvar:'tx.msg=%{rule.msg}', setvar:tx.anomaly_score=+%{tx.notice_anomaly_score}, setvar:'tx.%{rule.id}-OWASP_CRS/PROTOCOL_VIOLATION/INVALID_REQ-%{matched_var_name}=%{matched_var}'"
  49.  
  50.  
  51. #
  52. # Identify multipart/form-data name evasion attempts
  53. #
  54. # There are possible impedance mismatches between how
  55. # ModSecurity interprets multipart file names and how
  56. # a destination app server such as PHP might parse the
  57. # Content-Disposition data:
  58. #
  59. # filename-parm := "filename" "=" value
  60. #
  61. # -=[ Rule Logic ]=-
  62. # These rules check for the existence of the ' " ; = meta-characters in
  63. # either the file or file name variables.
  64. # HTML entities may lead to false positives, why they are allowed on PL1.
  65. # Negative look behind assertions allow frequently used entities &_;
  66. #
  67. # -=[ Targets, characters and html entities ]=-
  68. #
  69. # 920120: PL1 : FILES_NAMES, FILES
  70. # ['\";=] but allowed:
  71. # &[aAoOuUyY]uml); &[aAeEiIoOuU]circ; &[eEiIoOuUyY]acute;
  72. # &[aAeEiIoOuU]grave; &[cC]cedil; &[aAnNoO]tilde; & '
  73. #
  74. # 920121: PL2 : FILES_NAMES, FILES
  75. # ['\";=] : ' " ; = meta-characters
  76. #
  77. # -=[ References ]=-
  78. # https://www.owasp.org/index.php/ModSecurity_CRS_RuleID-960000
  79. # http://www.ietf.org/rfc/rfc2183.txt
  80. #
  81. SecRule FILES_NAMES|FILES "(?<!&(?:[aAoOuUyY]uml)|&(?:[aAeEiIoOuU]circ)|&(?:[eEiIoOuUyY]acute)|&(?:[aAeEiIoOuU]grave)|&(?:[cC]cedil)|&(?:[aAnNoO]tilde)|&(?:amp)|&(?:apos));|['\"=]" "msg:'Attempted multipart/form-data bypass', severity:'CRITICAL', id:920120, ver:'OWASP_CRS/3.0.0', rev:'1', maturity:'9', accuracy:'7', logdata:'%{matched_var}', phase:request, block, t:none,t:urlDecodeUni, tag:'application-multi', tag:'language-multi', tag:'platform-multi', tag:'attack-protocol', tag:'OWASP_CRS/PROTOCOL_VIOLATION/INVALID_REQ', tag:'CAPEC-272', setvar:'tx.msg=%{rule.msg}', setvar:tx.anomaly_score=+%{tx.critical_anomaly_score}, setvar:'tx.%{rule.id}-OWASP_CRS/PROTOCOL_VIOLATION/INVALID_REQ-%{matched_var_name}=%{matched_var}'"
  82.  
  83.  
  84. #
  85. # Verify that we've correctly processed the request body.
  86. #
  87. # As a rule of thumb, when failing to process a request body
  88. # you should reject the request (when deployed in blocking mode)
  89. # or log a high-severity alert (when deployed in detection-only mode).
  90. #
  91. # -=[ Rule Logic ]=-
  92. # Checks for the existence of the REQBODY_ERROR variable that is created
  93. # by the request body processor if it encounters errors.
  94. #
  95. # -=[ References ]=-
  96. # https://sourceforge.net/apps/mediawiki/mod-security/index.php?title=Reference_Manual#REQBODY_ERROR
  97. #
  98. SecRule REQBODY_ERROR "!@eq 0" "msg:'Failed to parse request body.', severity:'CRITICAL', id:920130, ver:'OWASP_CRS/3.0.0', rev:'1', maturity:'9', accuracy:'9', logdata:'%{REQBODY_ERROR_MSG}', phase:request, block, t:none, tag:'application-multi', tag:'language-multi', tag:'platform-multi', tag:'attack-protocol', tag:'OWASP_CRS/PROTOCOL_VIOLATION/INVALID_REQ', tag:'CAPEC-272', setvar:'tx.msg=%{rule.msg}', setvar:tx.anomaly_score=+%{tx.critical_anomaly_score}, setvar:'tx.%{rule.id}-OWASP_CRS/PROTOCOL_VIOLATION/INVALID_REQ-%{matched_var_name}=%{matched_var}'"
  99.  
  100.  
  101. #
  102. # Strict Multipart Parsing Checks
  103. #
  104. # -=[ Rule Logic ]=-
  105. # By default be strict with what we accept in the multipart/form-data
  106. # request body. If the rule below proves to be too strict for your
  107. # environment consider changing it to detection-only. You are encouraged
  108. # _not_ to remove it altogether.
  109. #
  110. # -=[ References ]=-
  111. # https://sourceforge.net/apps/mediawiki/mod-security/index.php?title=Reference_Manual#MULTIPART_STRICT_ERROR
  112. #
  113. SecRule MULTIPART_STRICT_ERROR "!@eq 0" "msg:'Multipart request body failed strict validation: PE %{REQBODY_PROCESSOR_ERROR}, BQ %{MULTIPART_BOUNDARY_QUOTED}, BW %{MULTIPART_BOUNDARY_WHITESPACE}, DB %{MULTIPART_DATA_BEFORE}, DA %{MULTIPART_DATA_AFTER}, HF %{MULTIPART_HEADER_FOLDING}, LF %{MULTIPART_LF_LINE}, SM %{MULTIPART_SEMICOLON_MISSING}, IQ %{MULTIPART_INVALID_QUOTING}, IH %{MULTIPART_INVALID_HEADER_FOLDING}, FLE %{MULTIPART_FILE_LIMIT_EXCEEDED}', severity:'CRITICAL', id:920140, ver:'OWASP_CRS/3.0.0', rev:'1', maturity:'8', accuracy:'7', phase:request, block, t:none, tag:'application-multi', tag:'language-multi', tag:'platform-multi', tag:'attack-protocol', tag:'OWASP_CRS/PROTOCOL_VIOLATION/INVALID_REQ', tag:'CAPEC-272', setvar:'tx.msg=%{rule.msg}', setvar:tx.anomaly_score=+%{tx.critical_anomaly_score}, setvar:'tx.%{rule.id}-OWASP_CRS/PROTOCOL_VIOLATION/INVALID_REQ-%{matched_var_name}=%{matched_var}'"
  114.  
  115.  
  116. #
  117. # Accept only digits in content length
  118. #
  119. # -=[ Rule Logic ]=-
  120. # This rule uses ModSecurity's rule negation against the regex meaning if the Content-Length header
  121. # is NOT all digits, then it will match.
  122. #
  123. # -=[ References ]=-
  124. # http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.13
  125. #
  126. SecRule REQUEST_HEADERS:Content-Length "!^\d+$" "msg:'Content-Length HTTP header is not numeric.', severity:'CRITICAL', id:920160, ver:'OWASP_CRS/3.0.0', rev:'1', maturity:'9', accuracy:'9', phase:1, block, logdata:'%{matched_var}', t:none, tag:'application-multi', tag:'language-multi', tag:'platform-multi', tag:'attack-protocol', tag:'OWASP_CRS/PROTOCOL_VIOLATION/INVALID_HREQ', tag:'CAPEC-272', setvar:'tx.msg=%{rule.msg}', setvar:tx.anomaly_score=+%{tx.critical_anomaly_score}, setvar:'tx.%{rule.id}-OWASP_CRS/PROTOCOL_VIOLATION/INVALID_HREQ-%{matched_var_name}=%{matched_var}'"
  127.  
  128.  
  129. #
  130. # Do not accept GET or HEAD requests with bodies
  131. # HTTP standard allows GET requests to have a body but this
  132. # feature is not used in real life. Attackers could try to force
  133. # a request body on an unsuspecting web applications.
  134. #
  135. # -=[ Rule Logic ]=-
  136. # This is a chained rule that first checks the Request Method. If it is a
  137. # GET or HEAD method, then it checks for the existence of a Content-Length
  138. # header. If the header exists and its payload is either not a 0 digit or not
  139. # empty, then it will match.
  140. #
  141. # -=[ References ]=-
  142. # http://www.w3.org/Protocols/rfc2616/rfc2616-sec4.html#sec4.3
  143. #
  144. SecRule REQUEST_METHOD "^(?:GET|HEAD)$" "msg:'GET or HEAD Request with Body Content.', severity:'CRITICAL', id:920170, ver:'OWASP_CRS/3.0.0', rev:'1', maturity:'9', accuracy:'9', phase:request, block, logdata:'%{matched_var}', t:none, tag:'application-multi', tag:'language-multi', tag:'platform-multi', tag:'attack-protocol', tag:'OWASP_CRS/PROTOCOL_VIOLATION/INVALID_HREQ', tag:'CAPEC-272', chain"
  145. SecRule REQUEST_HEADERS:Content-Length "!^0?$" "t:none, setvar:'tx.msg=%{rule.msg}', setvar:tx.anomaly_score=+%{tx.critical_anomaly_score}, setvar:'tx.%{rule.id}-OWASP_CRS/PROTOCOL_VIOLATION/INVALID_HREQ-%{matched_var_name}=%{matched_var}'"
  146.  
  147.  
  148. #
  149. # Require Content-Length to be provided with every POST request.
  150. #
  151. # -=[ Rule Logic ]=-
  152. # This chained rule checks if the request method is POST, if so, it checks that a Content-Length
  153. # header is also present.
  154. #
  155. # -=[ References ]=-
  156. # http://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html#sec9.5
  157. #
  158. SecRule REQUEST_METHOD "^POST$" "msg:'POST request missing Content-Length Header.', severity:'WARNING', id:920180, ver:'OWASP_CRS/3.0.0', rev:'1', maturity:'9', accuracy:'9', phase:request, block, logdata:'%{matched_var}', t:none, tag:'application-multi', tag:'language-multi', tag:'platform-multi', tag:'attack-protocol', tag:'OWASP_CRS/PROTOCOL_VIOLATION/INVALID_HREQ', tag:'CAPEC-272', chain"
  159. SecRule &REQUEST_HEADERS:Content-Length "@eq 0" "t:none, setvar:'tx.msg=%{rule.msg}', setvar:tx.anomaly_score=+%{tx.notice_anomaly_score}, setvar:'tx.%{rule.id}-OWASP_CRS/PROTOCOL_VIOLATION/INVALID_HREQ-%{matched_var_name}=%{matched_var}'"
  160.  
  161.  
  162. #
  163. # Range Header Checks
  164. #
  165. # 1. Range Header exists and begins with 0 - normal browsers don't do this.
  166. # Automated programs and bots often do not obey the HTTP RFC
  167. #
  168. # -=[ Rule Logic ]=-
  169. # This rule inspects the Range request header to see if it starts with 0.
  170. #
  171. # -=[ References ]=-
  172. # http://www.bad-behavior.ioerror.us/documentation/how-it-works/
  173. #
  174. # 2. Per RFC 2616 -
  175. # "If the last-byte-pos value is present, it MUST be greater than or equal to the first-byte-pos in that byte-range-spec,
  176. # or the byte- range-spec is syntactically invalid."
  177. # -=[ Rule Logic ]=-
  178. # This rule compares the first and second byte ranges and flags when the first value is greater than the second.
  179. #
  180. # -=[ References ]=-
  181. # http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html
  182. # http://seclists.org/fulldisclosure/2011/Aug/175
  183. #
  184. SecRule REQUEST_HEADERS:Range|REQUEST_HEADERS:Request-Range "(\d+)\-(\d+)\," "capture, phase:request, rev:'2', ver:'OWASP_CRS/3.0.0', maturity:'6', accuracy:'8', t:none, block, msg:'Range: Invalid Last Byte Value.', logdata:'%{matched_var}', severity:'WARNING', id:920190, tag:'application-multi', tag:'language-multi', tag:'platform-multi', tag:'attack-protocol', tag:'OWASP_CRS/PROTOCOL_VIOLATION/INVALID_HREQ', chain"
  185. SecRule TX:2 "!@ge %{tx.1}" "setvar:'tx.msg=%{rule.msg}', setvar:tx.anomaly_score=+%{tx.warning_anomaly_score}, setvar:tx.%{rule.id}-OWASP_CRS/PROTOCOL_VIOLATION/INVALID_HREQ-%{matched_var_name}=%{matched_var}"
  186.  
  187.  
  188. #
  189. # Broken/Malicous clients often have duplicate or conflicting headers
  190. # Automated programs and bots often do not obey the HTTP RFC
  191. #
  192. # -=[ Rule Logic ]=-
  193. # This rule inspects the Connection header and looks for duplicates of the
  194. # keep-alive and close options.
  195. #
  196. # -=[ References ]=-
  197. # http://www.bad-behavior.ioerror.us/documentation/how-it-works/
  198. #
  199. SecRule REQUEST_HEADERS:Connection "\b(keep-alive|close),\s?(keep-alive|close)\b" "phase:request, rev:'2', ver:'OWASP_CRS/3.0.0', maturity:'6', accuracy:'8', t:none, block, msg:'Multiple/Conflicting Connection Header Data Found.', logdata:'%{matched_var}', id:920210, tag:'application-multi', tag:'language-multi', tag:'platform-multi', tag:'attack-protocol', tag:'OWASP_CRS/PROTOCOL_VIOLATION/INVALID_HREQ', severity:'WARNING', setvar:'tx.msg=%{rule.msg}', setvar:tx.anomaly_score=+%{tx.warning_anomaly_score}, setvar:tx.%{rule.id}-OWASP_CRS/PROTOCOL_VIOLATION/INVALID_HREQ-%{matched_var_name}=%{matched_var}"
  200.  
  201. #
  202. # Check URL encodings
  203. #
  204. # -=[ Rule Logic ]=-
  205. # There are two different chained rules. We need to separate them as we are inspecting two
  206. # different variables - REQUEST_URI and REQUEST_BODY. For REQUEST_BODY, we only want to
  207. # run the @validateUrlEncoding operator if the content-type is application/x-www-form-urlencoding.
  208. #
  209. # -=[ References ]=-
  210. # http://www.ietf.org/rfc/rfc1738.txt
  211. #
  212. SecRule REQUEST_URI "\%((?!$|\W)|[0-9a-fA-F]{2}|u[0-9a-fA-F]{4})" "phase:request, rev:'2', ver:'OWASP_CRS/3.0.0', maturity:'6', accuracy:'8', t:none, block, msg:'URL Encoding Abuse Attack Attempt', id:920220, tag:'application-multi', tag:'language-multi', tag:'platform-multi', tag:'attack-protocol', tag:'OWASP_CRS/PROTOCOL_VIOLATION/EVASION', severity:'WARNING', chain"
  213. SecRule REQUEST_URI "@validateUrlEncoding" "setvar:'tx.msg=%{rule.msg}', setvar:tx.anomaly_score=+%{tx.warning_anomaly_score}, setvar:tx.%{rule.id}-OWASP_CRS/PROTOCOL_VIOLATION/EVASION-%{matched_var_name}=%{matched_var}"
  214.  
  215. SecRule REQUEST_HEADERS:Content-Type "^(application\/x-www-form-urlencoded|text\/xml)(?:;(?:\s?charset\s?=\s?[\w\d\-]{1,18})?)??$" "phase:request, rev:'2', ver:'OWASP_CRS/3.0.0', maturity:'6', accuracy:'8', t:none, block, msg:'URL Encoding Abuse Attack Attempt', id:920240, tag:'application-multi', tag:'language-multi', tag:'platform-multi', tag:'attack-protocol', tag:'OWASP_CRS/PROTOCOL_VIOLATION/EVASION', severity:'WARNING', chain"
  216. SecRule REQUEST_BODY|XML:/* "\%((?!$|\W)|[0-9a-fA-F]{2}|u[0-9a-fA-F]{4})" "chain"
  217. SecRule REQUEST_BODY|XML:/* "@validateUrlEncoding" "setvar:'tx.msg=%{rule.msg}', setvar:tx.anomaly_score=+%{tx.warning_anomaly_score}, setvar:tx.%{rule.id}-OWASP_CRS/PROTOCOL_VIOLATION/EVASION-%{matched_var_name}=%{matched_var}"
  218.  
  219.  
  220. #
  221. # Check UTF enconding
  222. # We only want to apply this check if UTF-8 encoding is actually used by the site, otherwise
  223. # it will result in false positives.
  224. #
  225. # -=[ Rule Logic ]=-
  226. # This chained rule first checks to see if the admin has set the TX:CRS_VALIDATE_UTF8_ENCODING
  227. # variable in the crs-setup.conf file.
  228. #
  229. SecRule TX:CRS_VALIDATE_UTF8_ENCODING "@eq 1" "phase:request, rev:'2', ver:'OWASP_CRS/3.0.0', maturity:'6', accuracy:'8', t:none, block, msg:'UTF8 Encoding Abuse Attack Attempt', id:920250, tag:'application-multi', tag:'language-multi', tag:'platform-multi', tag:'attack-protocol', tag:'OWASP_CRS/PROTOCOL_VIOLATION/EVASION', severity:'WARNING', chain"
  230. SecRule REQUEST_FILENAME|ARGS|ARGS_NAMES "@validateUtf8Encoding" "setvar:'tx.msg=%{rule.msg}', setvar:tx.anomaly_score=+%{tx.warning_anomaly_score}, setvar:tx.%{rule.id}-OWASP_CRS/PROTOCOL_VIOLATION/EVASION-%{matched_var_name}=%{matched_var}"
  231.  
  232.  
  233. #
  234. # Disallow use of full-width unicode as decoding evasions my be possible.
  235. #
  236. # -=[ Rule Logic ]=-
  237. # This rule looks for full-width encoding by looking for %u followed by 2 'f'
  238. # characters and then 2 hex characters. It is a vulnerability that affected
  239. # IIS circa 2007.
  240. # The rule will trigger on %uXXXX formatted chars that are full or half
  241. # width, as explained above. This %uXXXX format is passed as a raw parameter
  242. # and is (seemingly only) accepted by IIS (5.0, 6.0, 7.0, and 8.0). Other
  243. # webservers will only process unicode chars presented as hex UTF-8 bytes.
  244. #
  245. # -=[ References ]=-
  246. # http://www.kb.cert.org/vuls/id/739224
  247. # https://www.checkpoint.com/defense/advisories/public/2007/cpai-2007-201.html
  248. # https://github.com/SpiderLabs/owasp-modsecurity-crs/issues/719
  249. #
  250. SecRule REQUEST_URI|REQUEST_BODY "\%u[fF]{2}[0-9a-fA-F]{2}" "msg:'Unicode Full/Half Width Abuse Attack Attempt', id:920260, severity:'WARNING', rev:'2', ver:'OWASP_CRS/3.0.0', maturity:'6', accuracy:'8', phase:request, t:none, tag:'application-multi', tag:'language-multi', tag:'platform-iis', tag:'platform-windows', tag:'attack-protocol', block, setvar:'tx.msg=%{rule.msg}', setvar:tx.anomaly_score=+%{tx.warning_anomaly_score}, setvar:tx.%{rule.id}-OWASP_CRS/PROTOCOL_VIOLATION/EVASION-%{matched_var_name}=%{matched_var}"
  251.  
  252.  
  253. #
  254. # Restrict type of characters sent
  255. #
  256. # This is a rule with multiple stricter siblings that grows more
  257. # restrictive in higher paranoia levels.
  258. #
  259. # -=[ Rule Logic ]=-
  260. # This rule uses the @validateByteRange operator to restrict the request
  261. # payloads.
  262. #
  263. # -=[ Targets and ASCII Ranges ]=-
  264. #
  265. # 920270: PL1 : REQUEST_URI, REQUEST_HEADERS, ARGS and ARGS_NAMES
  266. # ASCII 1-255 : Full ASCII range without null character
  267. #
  268. # 920271: PL2 : REQUEST_URI, REQUEST_HEADERS, ARGS and ARGS_NAMES
  269. # ASCII 9,10,13,32-126,128-255 : Full visible ASCII range, tab, newline
  270. #
  271. # 920272: PL3 : REQUEST_URI, REQUEST_HEADERS, ARGS, ARGS_NAMES and REQUEST_BODY
  272. # ASCII 32-36,38-126 : Visible lower ASCII range without percent symbol
  273. #
  274. # 920273: PL4 : ARGS, ARGS_NAMES and REQUEST_BODY
  275. # ASCII 38,44-46,48-58,61,65-90,95,97-122
  276. # A-Z a-z 0-9 = - _ . , : &
  277. #
  278. # 920274: PL4 : REQUEST_HEADERS without User-Agent, Referer and Cookie
  279. # ASCII 32,34,38,42-59,61,65-90,95,97-122
  280. # A-Z a-z 0-9 = - _ . , : & " * + / SPACE
  281. #
  282. # REQUEST_URI and REQUEST_HEADERS User-Agent, Referer and Cookie are very hard
  283. # to restrict beyond the limits in 920272.
  284. #
  285. # 920274 generally has few positives. However, it would detect rare attacks
  286. # on Accept request headers and friends.
  287.  
  288. SecRule REQUEST_URI|REQUEST_HEADERS|ARGS|ARGS_NAMES "@validateByteRange 1-255" "phase:request, rev:'2', ver:'OWASP_CRS/3.0.0', maturity:'9', accuracy:'9', block, msg:'Invalid character in request (null character)', id:920270, severity:'CRITICAL', t:none,t:urlDecodeUni, tag:'application-multi', tag:'language-multi', tag:'platform-multi', tag:'attack-protocol', tag:'OWASP_CRS/PROTOCOL_VIOLATION/EVASION', setvar:'tx.msg=%{rule.msg}', setvar:tx.anomaly_score=+%{tx.error_anomaly_score}, setvar:tx.%{rule.id}-OWASP_CRS/PROTOCOL_VIOLATION/EVASION-%{matched_var_name}=%{matched_var}"
  289.  
  290.  
  291. #
  292. # Do not accept requests without common headers.
  293. # All normal web browsers include Host, User-Agent and Accept headers.
  294. # Implies either an attacker or a legitimate automation client.
  295. #
  296.  
  297. #
  298. # Missing/Empty Host Header
  299. #
  300. # -=[ Rule Logic ]=-
  301. # These rules will first check to see if a Host header is present.
  302. # The second check is to see if a Host header exists but is empty.
  303. #
  304. SecRule &REQUEST_HEADERS:Host "@eq 0" "msg:'Request Missing a Host Header', severity:'WARNING', phase:request, rev:'2', ver:'OWASP_CRS/3.0.0', maturity:'9', accuracy:'9', t:none, pass, id:920280, tag:'application-multi', tag:'language-multi', tag:'platform-multi', tag:'attack-protocol', tag:'OWASP_CRS/PROTOCOL_VIOLATION/MISSING_HEADER_HOST', tag:'WASCTC/WASC-21', tag:'OWASP_TOP_10/A7', tag:'PCI/6.5.10', setvar:'tx.msg=%{rule.msg}', setvar:tx.anomaly_score=+%{tx.warning_anomaly_score}, setvar:tx.%{rule.id}-OWASP_CRS/PROTOCOL_VIOLATION/MISSING_HEADER-%{matched_var_name}=%{matched_var}, skipAfter:END_HOST_CHECK"
  305.  
  306.  
  307. SecRule REQUEST_HEADERS:Host "^$" "msg:'Empty Host Header', severity:'WARNING', phase:request, rev:'2', ver:'OWASP_CRS/3.0.0', maturity:'9', accuracy:'9', t:none, pass, id:920290, tag:'application-multi', tag:'language-multi', tag:'platform-multi', tag:'attack-protocol', tag:'OWASP_CRS/PROTOCOL_VIOLATION/MISSING_HEADER_HOST', setvar:'tx.msg=%{rule.msg}', setvar:tx.anomaly_score=+%{tx.warning_anomaly_score}, setvar:tx.%{rule.id}-OWASP_CRS/PROTOCOL_VIOLATION/MISSING_HEADER-%{matched_var_name}=%{matched_var}"
  308.  
  309. SecMarker END_HOST_CHECK
  310.  
  311.  
  312. #
  313. # Empty Accept Header
  314. #
  315. # -=[ Rule Logic ]=-
  316. # This rule checks if an Accept header exists, but has an empty value.
  317. # This is only allowed in combination with the OPTIONS method.
  318. # Additionally, there are some clients sending empty Accept headers.
  319. # They are covered in another chained rule checking the User-Agent.
  320. # This technique demands a separate rule to detect an empty
  321. # Accept header if there is no user agent. This is checked via
  322. # the separate rule 920311.
  323. #
  324. # Exclude some common broken clients sending empty Accept header:
  325. # "Business/6.6.1.2 CFNetwork/758.5.3 Darwin/15.6.0" (CRS issue #515)
  326. # "Entreprise/6.5.0.177 CFNetwork/758.4.3 Darwin/15.5.0" (CRS issue #366)
  327. #
  328. # -=[ References ]=-
  329. # https://github.com/SpiderLabs/owasp-modsecurity-crs/issues/366
  330. #
  331.  
  332. SecRule REQUEST_HEADERS:Accept "^$" "msg:'Request Has an Empty Accept Header', chain, phase:request, rev:'2', ver:'OWASP_CRS/3.0.0', maturity:'9', accuracy:'8', t:none, pass, severity:'NOTICE', id:920310, tag:'application-multi', tag:'language-multi', tag:'platform-multi', tag:'attack-protocol', tag:'OWASP_CRS/PROTOCOL_VIOLATION/MISSING_HEADER_ACCEPT'"
  333. SecRule REQUEST_METHOD "!^OPTIONS$" "chain"
  334. SecRule REQUEST_HEADERS:User-Agent "!@pm AppleWebKit Android Business Enterprise Entreprise" "t:none, setvar:'tx.msg=%{rule.msg}', setvar:tx.anomaly_score=+%{tx.notice_anomaly_score}, setvar:tx.%{rule.id}-OWASP_CRS/PROTOCOL_VIOLATION/MISSING_HEADER-%{matched_var_name}=%{matched_var}"
  335.  
  336. #
  337. # This rule is a sibling of rule 920310.
  338. #
  339. SecRule REQUEST_HEADERS:Accept "^$" "msg:'Request Has an Empty Accept Header', chain, phase:request, rev:'2', ver:'OWASP_CRS/3.0.0', maturity:'9', accuracy:'8', t:none, pass, severity:'NOTICE', id:920311, tag:'application-multi', tag:'language-multi', tag:'platform-multi', tag:'attack-protocol', tag:'OWASP_CRS/PROTOCOL_VIOLATION/MISSING_HEADER_ACCEPT'"
  340. SecRule REQUEST_METHOD "!^OPTIONS$" "chain"
  341. SecRule &REQUEST_HEADERS:User-Agent "@eq 0" "t:none, setvar:'tx.msg=%{rule.msg}', setvar:tx.anomaly_score=+%{tx.notice_anomaly_score}, setvar:tx.%{rule.id}-OWASP_CRS/PROTOCOL_VIOLATION/MISSING_HEADER-%{matched_var_name}=%{matched_var}"
  342.  
  343.  
  344. #
  345. # Empty User-Agent Header
  346. #
  347. # -=[ Rule Logic ]=-
  348. # This rules will check to see if the User-Agent header is empty.
  349. #
  350. # Note that there is a second rule, 920320, which will check for
  351. # the existence of the User-Agent header.
  352. #
  353.  
  354. SecRule REQUEST_HEADERS:User-Agent "^$" "msg:'Empty User Agent Header', severity:'NOTICE', phase:request, t:none, pass, id:920330, rev:'1', ver:'OWASP_CRS/3.0.0', maturity:'9', accuracy:'9', tag:'application-multi', tag:'language-multi', tag:'platform-multi', tag:'attack-protocol', tag:'OWASP_CRS/PROTOCOL_VIOLATION/EMPTY_HEADER_UA', setvar:'tx.msg=%{rule.msg}', setvar:tx.anomaly_score=+%{tx.notice_anomaly_score}, setvar:tx.%{rule.id}-OWASP_CRS/PROTOCOL_VIOLATION/MISSING_HEADER-%{matched_var_name}=%{matched_var}"
  355.  
  356. #
  357. # Missing Content-Type Header with Request Body
  358. #
  359. # -=[ Rule Logic]=-
  360. # This rule will first check to see if the value of the Content-Length header is
  361. # non-equal to 0. The chained rule is then checking the existence of the
  362. # Content-Type header. The RFCs do not state there must be a
  363. # Content-Type header. However, a request missing a Content-Header is a
  364. # strong indication of a non-compliant browser.
  365. #
  366. # -=[ References ]=-
  367. # http://httpwg.org/specs/rfc7231.html#header.content-type
  368.  
  369. SecRule REQUEST_HEADERS:Content-Length "!^0$" "msg:'Request Containing Content, but Missing Content-Type header', chain, phase:request, rev:'3', ver:'OWASP_CRS/3.0.0', maturity:'9', accuracy:'9', t:none, block, tag:'application-multi', tag:'language-multi', tag:'platform-multi', tag:'attack-protocol', id:920340, severity:'NOTICE'"
  370. SecRule &REQUEST_HEADERS:Content-Type "@eq 0" "t:none, setvar:'tx.msg=%{rule.msg}', setvar:tx.anomaly_score=+%{tx.notice_anomaly_score}, setvar:tx.%{rule.id}-OWASP_CRS/PROTOCOL_VIOLATION/MISSING_HEADER-%{matched_var_name}=%{matched_var}"
  371.  
  372. # Check that the host header is not an IP address
  373. # This is not an HTTP RFC violation but it is indicative of automated client access.
  374. # Many web-based worms propagate by scanning IP address blocks.
  375. #
  376. # -=[ Rule Logic ]=-
  377. # This rule triggers if the Host header contains all digits (and possible port)
  378. #
  379. # -=[ References ]=-
  380. # http://technet.microsoft.com/en-us/magazine/2005.01.hackerbasher.aspx
  381. ##
  382. #
  383. #SecRule REQUEST_HEADERS:Host "^[\d.:]+$" # "msg:'Host header is a numeric IP address',# phase:request,# rev:'2',# ver:'OWASP_CRS/3.0.0',# maturity:'9',# accuracy:'9',# t:none,# block,# logdata:'%{matched_var}',# severity:'WARNING',# id:920350,# tag:'application-multi',# tag:'language-multi',# tag:'platform-multi',# tag:'attack-protocol',# tag:'OWASP_CRS/PROTOCOL_VIOLATION/IP_HOST',# tag:'WASCTC/WASC-21',# tag:'OWASP_TOP_10/A7',# tag:'PCI/6.5.10',# setvar:'tx.msg=%{rule.msg}',# setvar:tx.anomaly_score=+%{tx.warning_anomaly_score},# setvar:tx.%{rule.id}-OWASP_CRS/POLICY/IP_HOST-%{matched_var_name}=%{matched_var}"
  384. #
  385.  
  386. # In most cases, you should expect a certain volume of each a request on your
  387. # website. For example, a request with 400 arguments, can be suspicious.
  388. # This file creates limitations on the request.
  389. #
  390. # TODO Look at the rules in this file, and define the sizes you'd like to enforce.
  391. # Note that most of the rules are commented out by default.
  392. # Uncomment the rules you need
  393. #
  394.  
  395.  
  396. #
  397. # Maximum number of arguments in request limited
  398. #
  399. SecRule &TX:MAX_NUM_ARGS "@eq 1" "chain, phase:request, t:none, block, msg:'Too many arguments in request', id:920380, severity:'CRITICAL', rev:'2', ver:'OWASP_CRS/3.0.0', maturity:'9', accuracy:'9', tag:'application-multi', tag:'language-multi', tag:'platform-multi', tag:'attack-protocol', tag:'OWASP_CRS/POLICY/SIZE_LIMIT'"
  400. SecRule &ARGS "@gt %{tx.max_num_args}" "t:none, setvar:'tx.msg=%{rule.msg}', setvar:tx.anomaly_score=+%{tx.critical_anomaly_score}, setvar:tx.%{rule.id}-OWASP_CRS/POLICY/SIZE_LIMIT-%{matched_var_name}=%{matched_var}"
  401.  
  402. ## -- Arguments limits --
  403. #
  404. # Limit argument name length
  405. #
  406. SecRule &TX:ARG_NAME_LENGTH "@eq 1" "chain, phase:request, t:none, block, msg:'Argument name too long', id:920360, severity:'CRITICAL', rev:'2', ver:'OWASP_CRS/3.0.0', maturity:'9', accuracy:'9', tag:'application-multi', tag:'language-multi', tag:'platform-multi', tag:'attack-protocol', tag:'OWASP_CRS/POLICY/SIZE_LIMIT'"
  407. SecRule ARGS_NAMES "@gt %{tx.arg_name_length}" "t:none, t:length, setvar:'tx.msg=%{rule.msg}', setvar:tx.anomaly_score=+%{tx.critical_anomaly_score}, setvar:tx.%{rule.id}-OWASP_CRS/POLICY/SIZE_LIMIT-%{matched_var_name}=%{matched_var}"
  408.  
  409. #
  410. # Limit argument value length
  411. #
  412. SecRule &TX:ARG_LENGTH "@eq 1" "chain, phase:request, t:none, block, msg:'Argument value too long', id:920370, severity:'CRITICAL', rev:'2', ver:'OWASP_CRS/3.0.0', maturity:'9', accuracy:'9', tag:'application-multi', tag:'language-multi', tag:'platform-multi', tag:'attack-protocol', tag:'OWASP_CRS/POLICY/SIZE_LIMIT'"
  413. SecRule ARGS "@gt %{tx.arg_length}" "t:none, t:length, setvar:'tx.msg=%{rule.msg}', setvar:tx.anomaly_score=+%{tx.critical_anomaly_score}, setvar:tx.%{rule.id}-OWASP_CRS/POLICY/SIZE_LIMIT-%{matched_var_name}=%{matched_var}"
  414.  
  415. #
  416. # Limit arguments total length
  417. #
  418. SecRule &TX:TOTAL_ARG_LENGTH "@eq 1" "chain, phase:request, t:none, block, msg:'Total arguments size exceeded', id:920390, severity:'CRITICAL', rev:'2', ver:'OWASP_CRS/3.0.0', maturity:'9', accuracy:'9', tag:'application-multi', tag:'language-multi', tag:'platform-multi', tag:'attack-protocol', tag:'OWASP_CRS/POLICY/SIZE_LIMIT'"
  419. SecRule ARGS_COMBINED_SIZE "@gt %{tx.total_arg_length}" "t:none, setvar:'tx.msg=%{rule.msg}', setvar:tx.anomaly_score=+%{tx.critical_anomaly_score}, setvar:tx.%{rule.id}-OWASP_CRS/POLICY/SIZE_LIMIT-%{matched_var_name}=%{matched_var}"
  420.  
  421.  
  422. #
  423. # -- File upload limits --
  424. #
  425. # Individual file size is limited
  426. SecRule &TX:MAX_FILE_SIZE "@eq 1" "chain, phase:request, t:none, block, msg:'Uploaded file size too large', id:920400, severity:'CRITICAL', rev:'2', ver:'OWASP_CRS/3.0.0', maturity:'9', accuracy:'9', tag:'application-multi', tag:'language-multi', tag:'platform-multi', tag:'attack-protocol', tag:'OWASP_CRS/POLICY/SIZE_LIMIT'"
  427. SecRule REQUEST_HEADERS:Content-Type "@beginsWith multipart/form-data" "chain"
  428. SecRule REQUEST_HEADERS:Content-Length "@gt %{tx.max_file_size}" "t:none, setvar:'tx.msg=%{rule.msg}', setvar:tx.anomaly_score=+%{tx.critical_anomaly_score}, setvar:tx.%{rule.id}-OWASP_CRS/POLICY/SIZE_LIMIT-%{matched_var_name}=%{matched_var}"
  429.  
  430. #
  431. # Combined file size is limited
  432. #
  433. SecRule &TX:COMBINED_FILE_SIZES "@eq 1" "chain, phase:request, t:none, block, msg:'Total uploaded files size too large', id:920410, severity:'CRITICAL', rev:'2', ver:'OWASP_CRS/3.0.0', maturity:'9', accuracy:'9', tag:'application-multi', tag:'language-multi', tag:'platform-multi', tag:'attack-protocol', tag:'OWASP_CRS/POLICY/SIZE_LIMIT'"
  434. SecRule FILES_COMBINED_SIZE "@gt %{tx.combined_file_sizes}" "t:none, setvar:'tx.msg=%{rule.msg}', setvar:tx.anomaly_score=+%{tx.critical_anomaly_score}, setvar:tx.%{rule.id}-OWASP_CRS/POLICY/SIZE_LIMIT-%{matched_var_name}=%{matched_var}"
  435.  
  436.  
  437.  
  438. #
  439. # Restrict which content-types we accept.
  440. #
  441. SecRule REQUEST_METHOD "!^(?:GET|HEAD|PROPFIND|OPTIONS)$" "phase:request, chain, t:none, block, msg:'Request content type is not allowed by policy', rev:'2', ver:'OWASP_CRS/3.0.0', maturity:'9', accuracy:'9', id:920420, severity:'CRITICAL', logdata:'%{matched_var}', tag:'application-multi', tag:'language-multi', tag:'platform-multi', tag:'attack-protocol', tag:'OWASP_CRS/POLICY/ENCODING_NOT_ALLOWED', tag:'WASCTC/WASC-20', tag:'OWASP_TOP_10/A1', tag:'OWASP_AppSensor/EE2', tag:'PCI/12.1'"
  442. SecRule REQUEST_HEADERS:Content-Type "^([^;\s]+)" "chain, capture"
  443. SecRule TX:0 "!^%{tx.allowed_request_content_type}$" "t:none, ctl:forceRequestBodyVariable=On, setvar:'tx.msg=%{rule.msg}', setvar:tx.anomaly_score=+%{tx.critical_anomaly_score}, setvar:tx.%{rule.id}-OWASP_CRS/POLICY/CONTENT_TYPE_NOT_ALLOWED-%{matched_var_name}=%{matched_var}"
  444.  
  445. #
  446. # Restrict protocol versions.
  447. #
  448. SecRule REQUEST_PROTOCOL "!@within %{tx.allowed_http_versions}" "phase:request, t:none, block, msg:'HTTP protocol version is not allowed by policy', severity:'CRITICAL', rev:'2', ver:'OWASP_CRS/3.0.0', maturity:'9', accuracy:'9', id:920430, tag:'application-multi', tag:'language-multi', tag:'platform-multi', tag:'attack-protocol', tag:'OWASP_CRS/POLICY/PROTOCOL_NOT_ALLOWED', tag:'WASCTC/WASC-21', tag:'OWASP_TOP_10/A6', tag:'PCI/6.5.10', logdata:'%{matched_var}', setvar:'tx.msg=%{rule.msg}', setvar:tx.anomaly_score=+%{tx.critical_anomaly_score}, setvar:tx.%{rule.id}-OWASP_CRS/POLICY/PROTOCOL_NOT_ALLOWED-%{matched_var_name}=%{matched_var}"
  449.  
  450. #
  451. # Restrict file extension
  452. #
  453. SecRule REQUEST_BASENAME "\.(.*)$" "chain, capture, phase:request, t:none,t:urlDecodeUni,t:lowercase, block, msg:'URL file extension is restricted by policy', severity:'CRITICAL', rev:'2', ver:'OWASP_CRS/3.0.0', maturity:'9', accuracy:'9', id:920440, logdata:'%{TX.0}', tag:'application-multi', tag:'language-multi', tag:'platform-multi', tag:'attack-protocol', tag:'OWASP_CRS/POLICY/EXT_RESTRICTED', tag:'WASCTC/WASC-15', tag:'OWASP_TOP_10/A7', tag:'PCI/6.5.10',logdata:'%{TX.0}', setvar:tx.extension=.%{tx.1}/"
  454. SecRule TX:EXTENSION "@within %{tx.restricted_extensions}" "t:none, setvar:'tx.msg=%{rule.msg}', setvar:tx.anomaly_score=+%{tx.critical_anomaly_score}, setvar:tx.%{rule.id}-OWASP_CRS/POLICY/EXT_RESTRICTED-%{matched_var_name}=%{matched_var}"
  455.  
  456. #
  457. # Restricted HTTP headers
  458. #
  459. # -=[ Rule Logic ]=-
  460. # The use of certain headers is restricted. They are listed in the variable
  461. # TX.restricted_headers.
  462. #
  463. # The headers are transformed into lowercase before the match. In order to
  464. # make sure that only complete header names are matching, the names in
  465. # TX.restricted_headers are wrapped in slashes. This guarantees that the
  466. # header Range (-> /range/) is not matching the restricted header
  467. # /content-range/ for example.
  468. #
  469. # This is a chained rule, where the first rule fills a set of variables of the
  470. # form TX.header_name_<HEADER_NAME>. The second rule is then executed for all
  471. # variables of the form TX.header_name_<HEADER_NAME>.
  472. #
  473. # As a consequence of the construction of the rule, the alert message and the
  474. # alert data will not display the original header name Content-Range, but
  475. # /content-range/ instead.
  476. #
  477. #
  478. # -=[ References ]=-
  479. # https://access.redhat.com/security/vulnerabilities/httpoxy (Header Proxy)
  480. #
  481. SecRule REQUEST_HEADERS_NAMES "@rx ^(.*)$" "msg:'HTTP header is restricted by policy (%{MATCHED_VAR})', severity:'CRITICAL', phase:request, t:none, block, rev:'2', ver:'OWASP_CRS/3.0.0', maturity:'9', accuracy:'9', id:920450, capture, logdata:' Restricted header detected: %{matched_var}', tag:'application-multi', tag:'language-multi', tag:'platform-multi', tag:'attack-protocol', tag:'OWASP_CRS/POLICY/HEADER_RESTRICTED', tag:'WASCTC/WASC-21', tag:'OWASP_TOP_10/A7', tag:'PCI/12.1', tag:'WASCTC/WASC-15', tag:'OWASP_TOP_10/A7', tag:'PCI/12.1', t:lowercase, setvar:'tx.header_name_%{tx.0}=/%{tx.0}/', chain"
  482. SecRule TX:/^HEADER_NAME_/ "@within %{tx.restricted_headers}" "setvar:'tx.msg=%{rule.msg}', setvar:tx.anomaly_score=+%{tx.critical_anomaly_score}, setvar:'tx.%{rule.id}-OWASP_CRS/POLICY/HEADERS_RESTRICTED-%{matched_var_name}=%{matched_var}'"
  483.  
  484.  
  485. SecRule TX:PARANOIA_LEVEL "@lt 2" "phase:1,id:920013,nolog,pass,skipAfter:END-REQUEST-920-PROTOCOL-ENFORCEMENT"
  486. SecRule TX:PARANOIA_LEVEL "@lt 2" "phase:2,id:920014,nolog,pass,skipAfter:END-REQUEST-920-PROTOCOL-ENFORCEMENT"
  487. #
  488. # -= Paranoia Level 2 =- (apply only when tx.paranoia_level is sufficiently high: 2 or higher)
  489. #
  490.  
  491. #
  492. # -=[ Rule Logic ]=-
  493. #
  494. # Check the number of range fields in the Range request header.
  495. #
  496. # An excessive number of Range request headers can be used to DoS a server.
  497. # The original CVE proposed an arbitrary upper limit of 5 range fields.
  498. #
  499. # Several clients are known to request PDF fields with up to 34 range
  500. # fields. Therefore the standard rule does not cover PDF files. This is
  501. # performed in two separate (stricter) siblings of this rule.
  502. #
  503. # 920200: PL2: Limit of 5 range header fields for all filenames outside of PDFs
  504. # 920201: PL2: Limit of 34 range header fields for PDFs
  505. # 920202: PL4: Limit of 5 range header fields for PDFs
  506. #
  507. # -=[ References ]=-
  508. # https://httpd.apache.org/security/CVE-2011-3192.txt
  509.  
  510. SecRule REQUEST_HEADERS:Range|REQUEST_HEADERS:Request-Range "^bytes=((\d+)?\-(\d+)?\s*,?\s*){6}" "phase:request, capture, rev:'2', ver:'OWASP_CRS/3.0.0', maturity:'6', accuracy:'8', t:none, block, msg:'Range: Too many fields (6 or more)', logdata:'%{matched_var}', severity:'WARNING', id:920200, tag:'application-multi', tag:'language-multi', tag:'platform-multi', tag:'attack-protocol', tag:'OWASP_CRS/PROTOCOL_VIOLATION/INVALID_HREQ', tag:'paranoia-level/2', chain"
  511. SecRule REQUEST_BASENAME "!@endsWith .pdf" "setvar:'tx.msg=%{rule.msg}', setvar:tx.anomaly_score=+%{tx.warning_anomaly_score}, setvar:tx.%{rule.id}-OWASP_CRS/PROTOCOL_VIOLATION/INVALID_HREQ-%{matched_var_name}=%{matched_var}"
  512.  
  513. #
  514. # This is a sibling of rule 920200
  515. #
  516.  
  517. SecRule REQUEST_BASENAME "@endsWith .pdf" "phase:request, capture, rev:'2', ver:'OWASP_CRS/3.0.0', maturity:'6', accuracy:'8', t:none, block, msg:'Range: Too many fields for pdf request (35 or more)', logdata:'%{matched_var}', severity:'WARNING', id:920201, tag:'application-multi', tag:'language-multi', tag:'platform-multi', tag:'attack-protocol', tag:'OWASP_CRS/PROTOCOL_VIOLATION/INVALID_HREQ', tag:'paranoia-level/2', chain"
  518. SecRule REQUEST_HEADERS:Range|REQUEST_HEADERS:Request-Range "^bytes=((\d+)?\-(\d+)?\s*,?\s*){35}" "setvar:'tx.msg=%{rule.msg}', setvar:tx.anomaly_score=+%{tx.warning_anomaly_score}, setvar:tx.%{rule.id}-OWASP_CRS/PROTOCOL_VIOLATION/INVALID_HREQ-%{matched_var_name}=%{matched_var}"
  519.  
  520.  
  521. SecRule ARGS "\%((?!$|\W)|[0-9a-fA-F]{2}|u[0-9a-fA-F]{4})" "phase:request, rev:'2', ver:'OWASP_CRS/3.0.0', maturity:'6', accuracy:'8', t:none, block, msg:'Multiple URL Encoding Detected', id:920230, tag:'application-multi', tag:'language-multi', tag:'platform-multi', tag:'attack-protocol', tag:'OWASP_CRS/PROTOCOL_VIOLATION/EVASION', tag:'paranoia-level/2', severity:'WARNING', setvar:'tx.msg=%{rule.msg}', setvar:tx.anomaly_score=+%{tx.warning_anomaly_score}, setvar:tx.%{rule.id}-OWASP_CRS/PROTOCOL_VIOLATION/EVASION-%{matched_var_name}=%{matched_var}"
  522.  
  523.  
  524. #
  525. # Missing Accept Header
  526. #
  527. # -=[ Rule Logic ]=-
  528. # This rule generates a notice if the Accept header is missing.
  529. #
  530. SecRule &REQUEST_HEADERS:Accept "@eq 0" "msg:'Request Missing an Accept Header', chain, phase:request, rev:'3', ver:'OWASP_CRS/3.0.0', maturity:'9', accuracy:'8', t:none, pass, severity:'NOTICE', id:920300, tag:'application-multi', tag:'language-multi', tag:'platform-multi', tag:'attack-protocol', tag:'OWASP_CRS/PROTOCOL_VIOLATION/MISSING_HEADER_ACCEPT', tag:'WASCTC/WASC-21', tag:'OWASP_TOP_10/A7', tag:'PCI/6.5.10', tag:'paranoia-level/2'"
  531. SecRule REQUEST_METHOD "!^OPTIONS$" "chain"
  532. SecRule REQUEST_HEADERS:User-Agent "!@pm AppleWebKit Android" "t:none, setvar:'tx.msg=%{rule.msg}', setvar:tx.anomaly_score=+%{tx.notice_anomaly_score}, setvar:tx.%{rule.id}-OWASP_CRS/PROTOCOL_VIOLATION/MISSING_HEADER-%{matched_var_name}=%{matched_var}"
  533.  
  534. #
  535. # PL2: This is a stricter sibling of 920270.
  536. #
  537. SecRule REQUEST_URI|REQUEST_HEADERS|ARGS|ARGS_NAMES "@validateByteRange 9,10,13,32-126,128-255" "phase:request, rev:'2', ver:'OWASP_CRS/3.0.0', maturity:'9', accuracy:'9', block, msg:'Invalid character in request (non printable characters)', id:920271, severity:'CRITICAL', t:none,t:urlDecodeUni, tag:'application-multi', tag:'language-multi', tag:'platform-multi', tag:'attack-protocol', tag:'OWASP_CRS/PROTOCOL_VIOLATION/EVASION', tag:'paranoia-level/2', setvar:'tx.msg=%{rule.msg}', setvar:tx.anomaly_score=+%{tx.critical_anomaly_score}, setvar:tx.%{rule.id}-OWASP_CRS/PROTOCOL_VIOLATION/EVASION-%{matched_var_name}=%{matched_var}"
  538.  
  539.  
  540. #
  541. # Missing User-Agent Header
  542. #
  543. # -=[ Rule Logic ]=-
  544. # This rules will check to see if there is a User-Agent header or not.
  545. #
  546.  
  547. SecRule &REQUEST_HEADERS:User-Agent "@eq 0" "msg:'Missing User Agent Header', severity:'NOTICE', phase:request, rev:'1', ver:'OWASP_CRS/3.0.0', maturity:'9', accuracy:'9', t:none, pass, id:920320, tag:'application-multi', tag:'language-multi', tag:'platform-multi', tag:'attack-protocol', tag:'OWASP_CRS/PROTOCOL_VIOLATION/MISSING_HEADER_UA', tag:'WASCTC/WASC-21', tag:'OWASP_TOP_10/A7', tag:'PCI/6.5.10', tag:'paranoia-level/2', setvar:'tx.msg=%{rule.msg}', setvar:tx.anomaly_score=+%{tx.notice_anomaly_score}, setvar:tx.%{rule.id}-OWASP_CRS/PROTOCOL_VIOLATION/MISSING_HEADER-%{matched_var_name}=%{matched_var}"
  548.  
  549.  
  550. #
  551. # PL2: This is a stricter sibling of 920120.
  552. #
  553. SecRule FILES_NAMES|FILES "['\";=]" "msg:'Attempted multipart/form-data bypass', severity:'CRITICAL', id:920121, ver:'OWASP_CRS/3.0.0', rev:'1', maturity:'9', accuracy:'7', logdata:'%{matched_var}', phase:request, block, t:none,t:urlDecodeUni, tag:'application-multi', tag:'language-multi', tag:'platform-multi', tag:'attack-protocol', tag:'OWASP_CRS/PROTOCOL_VIOLATION/INVALID_REQ', tag:'CAPEC-272', tag:'paranoia-level/2', setvar:'tx.msg=%{rule.msg}', setvar:tx.anomaly_score=+%{tx.critical_anomaly_score}, setvar:'tx.%{rule.id}-OWASP_CRS/PROTOCOL_VIOLATION/INVALID_REQ-%{matched_var_name}=%{matched_var}'"
  554.  
  555.  
  556. SecRule TX:PARANOIA_LEVEL "@lt 3" "phase:1,id:920015,nolog,pass,skipAfter:END-REQUEST-920-PROTOCOL-ENFORCEMENT"
  557. SecRule TX:PARANOIA_LEVEL "@lt 3" "phase:2,id:920016,nolog,pass,skipAfter:END-REQUEST-920-PROTOCOL-ENFORCEMENT"
  558. #
  559. # -= Paranoia Level 3 =- (apply only when tx.paranoia_level is sufficiently high: 3 or higher)
  560. #
  561.  
  562. #
  563. # PL 3: This is a stricter sibling of 920270. Ascii range: Printable characters in the low range
  564. #
  565. SecRule REQUEST_URI|REQUEST_HEADERS|ARGS|ARGS_NAMES|REQUEST_BODY "@validateByteRange 32-36,38-126" "phase:request, rev:'2', ver:'OWASP_CRS/3.0.0', maturity:'9', accuracy:'9', block, msg:'Invalid character in request (outside of printable chars below ascii 127)', id:920272, severity:'CRITICAL', t:none,t:urlDecodeUni, tag:'application-multi', tag:'language-multi', tag:'platform-multi', tag:'attack-protocol', tag:'OWASP_CRS/PROTOCOL_VIOLATION/EVASION', tag:'paranoia-level/3', setvar:'tx.msg=%{rule.msg}', setvar:tx.anomaly_score=+%{tx.critical_anomaly_score}, setvar:tx.%{rule.id}-OWASP_CRS/PROTOCOL_VIOLATION/EVASION-%{matched_var_name}=%{matched_var}"
  566.  
  567.  
  568.  
  569. SecRule TX:PARANOIA_LEVEL "@lt 4" "phase:1,id:920017,nolog,pass,skipAfter:END-REQUEST-920-PROTOCOL-ENFORCEMENT"
  570. SecRule TX:PARANOIA_LEVEL "@lt 4" "phase:2,id:920018,nolog,pass,skipAfter:END-REQUEST-920-PROTOCOL-ENFORCEMENT"
  571. #
  572. # -= Paranoia Level 4 =- (apply only when tx.paranoia_level is sufficiently high: 4 or higher)
  573. #
  574.  
  575. #
  576. # This is a stricter sibling of rule 920200
  577. #
  578.  
  579. SecRule REQUEST_BASENAME "@endsWith .pdf" "phase:request, capture, rev:'2', ver:'OWASP_CRS/3.0.0', maturity:'6', accuracy:'8', t:none, block, msg:'Range: Too many fields for pdf request (6 or more)', logdata:'%{matched_var}', severity:'WARNING', id:920202, tag:'application-multi', tag:'language-multi', tag:'platform-multi', tag:'attack-protocol', tag:'OWASP_CRS/PROTOCOL_VIOLATION/INVALID_HREQ', tag:'paranoia-level/4', chain"
  580. SecRule REQUEST_HEADERS:Range|REQUEST_HEADERS:Request-Range "^bytes=((\d+)?\-(\d+)?\s*,?\s*){6}" "setvar:'tx.msg=%{rule.msg}', setvar:tx.anomaly_score=+%{tx.warning_anomaly_score}, setvar:tx.%{rule.id}-OWASP_CRS/PROTOCOL_VIOLATION/INVALID_HREQ-%{matched_var_name}=%{matched_var}"
  581.  
  582.  
  583. #
  584. # This is a stricter sibling of 920270.
  585. #
  586. SecRule ARGS|ARGS_NAMES|REQUEST_BODY "@validateByteRange 38,44-46,48-58,61,65-90,95,97-122" "phase:request, rev:'2', ver:'OWASP_CRS/3.0.0', maturity:'9', accuracy:'9', block, msg:'Invalid character in request (outside of very strict set)', id:920273, severity:'CRITICAL', t:none,t:urlDecodeUni, tag:'application-multi', tag:'language-multi', tag:'platform-multi', tag:'attack-protocol', tag:'OWASP_CRS/PROTOCOL_VIOLATION/EVASION', tag:'paranoia-level/4', setvar:'tx.msg=%{rule.msg}', setvar:tx.anomaly_score=+%{tx.critical_anomaly_score}, setvar:tx.%{rule.id}-OWASP_CRS/PROTOCOL_VIOLATION/EVASION-%{matched_var_name}=%{matched_var}"
  587.  
  588. #
  589. # This is a stricter sibling of 920270.
  590. #
  591. SecRule REQUEST_HEADERS|!REQUEST_HEADERS:User-Agent|!REQUEST_HEADERS:Referer|!REQUEST_HEADERS:Cookie "@validateByteRange 32,34,38,42-59,61,65-90,95,97-122" "phase:request, rev:'2', ver:'OWASP_CRS/3.0.0', maturity:'9', accuracy:'9', block, msg:'Invalid character in request headers (outside of very strict set)', id:920274, severity:'CRITICAL', t:none,t:urlDecodeUni, tag:'application-multi', tag:'language-multi', tag:'platform-multi', tag:'attack-protocol', tag:'OWASP_CRS/PROTOCOL_VIOLATION/EVASION', tag:'paranoia-level/4', setvar:'tx.msg=%{rule.msg}', setvar:tx.anomaly_score=+%{tx.critical_anomaly_score}, setvar:tx.%{rule.id}-OWASP_CRS/PROTOCOL_VIOLATION/EVASION-%{matched_var_name}=%{matched_var}"
  592.  
  593.  
  594. # -=[ Abnormal Character Escapes ]=-
  595. #
  596. # [ Rule Logic ]
  597. # Consider the following payload: arg=cat+/e\tc/pa\ssw\d
  598. # Here, \s and \d were only used to obfuscate the string passwd and a lot of
  599. # parsers will silently ignore the non-necessary escapes. The case with \t is
  600. # a bit different though, as \t is a natural escape for the TAB character,
  601. # so we will avoid this (and \n, \r, etc.).
  602. #
  603. # This rule aims to detect non-necessary, abnormal esacpes. You could say it is
  604. # a nice # way to forbid the backslash character where it is not needed.
  605. #
  606. # This is a new rule at paranoia level 4. We expect quite a few false positives
  607. # for this rule and we will later evaluate if the rule makes any sense at all.
  608. # The rule is redundant with 920273 and 920274 in PL4. But if the rule proofs
  609. # to be useful and false positives remain at a reasonable level, then it might
  610. # be shifted to PL3 in a future release, where it would be the only rule
  611. # covering the backslash escape.
  612. #
  613. # The rule construct is overly complex due to the fact that matching the
  614. # backslash character with \b did not work. \Q\\\E does match the backslash
  615. # character though. This is thus the base of the rule. We forbid the backslash
  616. # when followed by a list of basic ascii characters - unless the backslash
  617. # is preceded by another backslash character, which is being checked via a
  618. # negative look-behind construct. If that is the case, the backslash character
  619. # is allowed.
  620. #
  621. SecRule REQUEST_URI|REQUEST_HEADERS|ARGS|ARGS_NAMES "(?<!\Q\\\E)\Q\\\E[cdeghijklmpqwxyz123456789]" "phase:request, id:920460, rev:'1', accuracy:'1', maturity:'1', ver:'OWASP_CRS/3.0.0', block, log, severity:'CRITICAL', capture, tag:'application-multi', tag:'language-multi', tag:'platform-multi', tag:'attack-protocol', tag:'paranoia-level/4', t:none,t:urlDecodeUni,t:htmlEntityDecode,t:lowercase, ctl:auditLogParts=+E, logdata:'Matched Data: %{TX.0} found within %{MATCHED_VAR_NAME}: %{MATCHED_VAR}', setvar:'tx.msg=%{rule.msg}', setvar:'tx.http_violation_score=+%{tx.critical_anomaly_score}', setvar:tx.anomaly_score=+%{tx.critical_anomaly_score}, setvar:tx.%{rule.id}-OWASP_CRS/WEB_ATTACK/ABNORMAL-ESCAPE-%{matched_var_name}=%{matched_var}"
  622.  
  623.  
  624. #
  625. # -= Paranoia Levels Finished =-
  626. #
  627. SecMarker "END-REQUEST-920-PROTOCOL-ENFORCEMENT"
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement