Skip to content

Commit 61bb69b

Browse files
committed
[New Rule] Web Server Potential SQL Injection Request
1 parent f0e9281 commit 61bb69b

File tree

1 file changed

+214
-0
lines changed

1 file changed

+214
-0
lines changed
Lines changed: 214 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,214 @@
1+
[metadata]
2+
creation_date = "2025/11/19"
3+
integration = ["nginx", "apache", "apache_tomcat", "iis", "network_traffic"]
4+
maturity = "production"
5+
updated_date = "2025/11/19"
6+
7+
[rule]
8+
author = ["Elastic"]
9+
description = """
10+
This rule detects potential SQL injection attempts in web server requests by identifying common SQL injection patterns
11+
in URLs. Such activity may indicate reconnaissance or exploitation attempts by attackers trying to manipulate backend
12+
databases or extract sensitive information.
13+
"""
14+
from = "now-61m"
15+
interval = "1h"
16+
language = "esql"
17+
license = "Elastic License v2"
18+
name = "Web Server Potential SQL Injection Request"
19+
risk_score = 21
20+
rule_id = "7f7a0ee1-7b6f-466a-85b4-110fb105f5e2"
21+
severity = "low"
22+
tags = [
23+
"Domain Scope: Single",
24+
"Domain: Web",
25+
"Domain: Network",
26+
"OS: Linux",
27+
"OS: macOS",
28+
"OS: Windows",
29+
"Use Case: Threat Detection",
30+
"Tactic: Reconnaissance",
31+
"Tactic: Credential Access",
32+
"Data Source: Network Packet Capture",
33+
"Data Source: Nginx",
34+
"Data Source: Apache",
35+
"Data Source: Apache Tomcat",
36+
"Data Source: IIS",
37+
]
38+
timestamp_override = "event.ingested"
39+
type = "esql"
40+
query = '''
41+
from
42+
logs-network_traffic.http-*,
43+
logs-network_traffic.tls-*,
44+
logs-nginx.access-*,
45+
logs-apache.access-*,
46+
logs-apache_tomcat.access-*,
47+
logs-iis.access-*
48+
| where
49+
@timestamp > now() - 1d and
50+
(url.original is not null or url.full is not null)
51+
52+
| eval Esql_url_text = case(url.original is not null, url.original, url.full)
53+
| eval Esql_url_lower = to_lower(Esql_url_text)
54+
55+
| where
56+
(
57+
Esql_url_lower like "*%20order%20by%*" or
58+
Esql_url_lower like "*dbms_pipe.receive_message%28chr%*" or
59+
Esql_url_lower like "*waitfor%20delay%20*" or
60+
Esql_url_lower like "*%28select%20*from%20pg_sleep%285*" or
61+
Esql_url_lower like "*%28select%28sleep%285*" or
62+
Esql_url_lower like "*%3bselect%20pg_sleep%285*" or
63+
Esql_url_lower like "*select%20concat%28concat*" or
64+
Esql_url_lower like "*xp_cmdshell*" or
65+
Esql_url_lower like "*select*case*when*" or
66+
Esql_url_lower like "*and*extractvalue*select*" or
67+
Esql_url_lower like "*from*information_schema.tables*" or
68+
Esql_url_lower like "*boolean*mode*having*" or
69+
Esql_url_lower like "*extractvalue*concat*" or
70+
Esql_url_lower like "*case*when*sleep*" or
71+
Esql_url_lower like "*select*sleep*" or
72+
Esql_url_lower like "*dbms_lock.sleep*" or
73+
Esql_url_lower like "*and*sleep*" or
74+
Esql_url_lower like "*like*sleep*" or
75+
Esql_url_lower like "*csleep*" or
76+
Esql_url_lower like "*pgsleep*" or
77+
Esql_url_lower like "*char*char*char*" or
78+
Esql_url_lower like "*union*select*" or
79+
Esql_url_lower like "*concat*select*" or
80+
Esql_url_lower like "*select*else*drop*" or
81+
Esql_url_lower like "*having*like*" or
82+
Esql_url_lower like "*case*else*end*" or
83+
Esql_url_lower like "*if*sleep*" or
84+
Esql_url_lower like "*where*and*select*" or
85+
Esql_url_lower like "*or*1=1*" or
86+
Esql_url_lower like "or *'1'='1'*" or
87+
Esql_url_lower like """*"1"="1"*""" or
88+
Esql_url_lower like "*or*'a'='a*" or
89+
Esql_url_lower like "*into*outfile*" or
90+
Esql_url_lower like "*into%20outfile*" or
91+
Esql_url_lower like "*into*dumpfile*" or
92+
Esql_url_lower like "*load_file%28*" or
93+
Esql_url_lower like "*load%5ffile%28*" or
94+
Esql_url_lower like "*cast%28*" or
95+
Esql_url_lower like "*convert%28*" or
96+
Esql_url_lower like "*cast%28%*" or
97+
Esql_url_lower like "*convert%28%*" or
98+
Esql_url_lower like "*@@version*" or
99+
Esql_url_lower like "*@@version_comment*" or
100+
Esql_url_lower like "*version%28*" or
101+
Esql_url_lower like "*user%28*" or
102+
Esql_url_lower like "*current_user%28*" or
103+
Esql_url_lower like "*database%28*" or
104+
Esql_url_lower like "*schema_name%28*" or
105+
Esql_url_lower like "*information_schema.columns*" or
106+
Esql_url_lower like "*information_schema.columns*" or
107+
Esql_url_lower like "*table_schema*" or
108+
Esql_url_lower like "*column_name*" or
109+
Esql_url_lower like "*dbms_pipe*" or
110+
Esql_url_lower like "*dbms_lock%2e*sleep*" or
111+
Esql_url_lower like "*dbms_lock.sleep*" or
112+
Esql_url_lower like "*sp_executesql*" or
113+
Esql_url_lower like "*sp_executesql*" or
114+
Esql_url_lower like "*load%20data*" or
115+
Esql_url_lower like "*information_schema*" or
116+
Esql_url_lower like "*information_schema.tables*" or
117+
Esql_url_lower like "*pga_sleep*" or
118+
Esql_url_lower like "*pg_slp*"
119+
)
120+
| keep
121+
@timestamp,
122+
event.dataset,
123+
http.request.method,
124+
http.response.status_code,
125+
source.ip,
126+
agent.id,
127+
host.name,
128+
Esql_url_lower
129+
| stats
130+
Esql.event_count = count(),
131+
Esql.url_path_count_distinct = count_distinct(Esql_url_lower),
132+
Esql.host_name_values = values(host.name),
133+
Esql.agent_id_values = values(agent.id),
134+
Esql.http_request_method_values = values(http.request.method),
135+
Esql.http_response_status_code_values = values(http.response.status_code),
136+
Esql.url_path_values = values(Esql_url_lower),
137+
Esql.event_dataset_values = values(event.dataset)
138+
by source.ip
139+
| where
140+
Esql.event_count > 1
141+
| limit 100
142+
'''
143+
144+
[[rule.threat]]
145+
framework = "MITRE ATT&CK"
146+
147+
[[rule.threat.technique]]
148+
id = "T1505"
149+
name = "Server Software Component"
150+
reference = "https://attack.mitre.org/techniques/T1505/"
151+
152+
[[rule.threat.technique.subtechnique]]
153+
id = "T1505.003"
154+
name = "Web Shell"
155+
reference = "https://attack.mitre.org/techniques/T1505/003/"
156+
157+
[rule.threat.tactic]
158+
id = "TA0003"
159+
name = "Persistence"
160+
reference = "https://attack.mitre.org/tactics/TA0003/"
161+
162+
[[rule.threat]]
163+
framework = "MITRE ATT&CK"
164+
165+
[[rule.threat.technique]]
166+
id = "T1059"
167+
name = "Command and Scripting Interpreter"
168+
reference = "https://attack.mitre.org/techniques/T1059/"
169+
170+
[[rule.threat.technique.subtechnique]]
171+
id = "T1059.004"
172+
name = "Unix Shell"
173+
reference = "https://attack.mitre.org/techniques/T1059/004/"
174+
175+
[rule.threat.tactic]
176+
id = "TA0002"
177+
name = "Execution"
178+
reference = "https://attack.mitre.org/tactics/TA0002/"
179+
180+
[[rule.threat]]
181+
framework = "MITRE ATT&CK"
182+
183+
[[rule.threat.technique]]
184+
id = "T1071"
185+
name = "Application Layer Protocol"
186+
reference = "https://attack.mitre.org/techniques/T1071/"
187+
188+
[rule.threat.tactic]
189+
id = "TA0011"
190+
name = "Command and Control"
191+
reference = "https://attack.mitre.org/tactics/TA0011/"
192+
193+
[[rule.threat]]
194+
framework = "MITRE ATT&CK"
195+
196+
[[rule.threat.technique]]
197+
id = "T1595"
198+
name = "Active Scanning"
199+
reference = "https://attack.mitre.org/techniques/T1595/"
200+
201+
[[rule.threat.technique.subtechnique]]
202+
id = "T1595.002"
203+
name = "Vulnerability Scanning"
204+
reference = "https://attack.mitre.org/techniques/T1595/002/"
205+
206+
[[rule.threat.technique.subtechnique]]
207+
id = "T1595.003"
208+
name = "Wordlist Scanning"
209+
reference = "https://attack.mitre.org/techniques/T1595/003/"
210+
211+
[rule.threat.tactic]
212+
id = "TA0043"
213+
name = "Reconnaissance"
214+
reference = "https://attack.mitre.org/tactics/TA0043/"

0 commit comments

Comments
 (0)