DemzufolgeGrundlagen der SQL-InjectionArtikel:
<…> Dies sind die Operationen, die am häufigsten zum Aufbrechen/Fuzzing der SQL-Abfragen verwendet werden.
'
Einfaches Anführungszeichen"
Doppeltes Anführungszeichen\
Backslash (MySQL-Escapezeichen)
Manchmal gibt es auch hexadezimal codierte Zeichen (z. B. 0x3a3a
).
Ich möchte alle Anfragen, die diese enthalten, protokollieren und löschen. Hier ist mein bisheriger Stand:
set $susp 0;
if ($request_uri ~ "%27") {
set $susp 1;
}
location ~ \.php {
if ($susp = 1) {
access_log /var/log/nginx/for-review.log;
return 500;
}
# further fastcgi configuration
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_pass unix:/var/run/php5-fpm.sock;
}
(Ich verstehe daswenn es böse ist, aber esschien notwendig)
Dies wird bei nicht ausgelöst /foo/ba'r
, funktioniert aber zumindest bei einwandfrei /?foo=b'ar
. Aber das ist es: Die anderen Zeichen, die ich ausprobiere, werden auch nicht ausgelöst.
Folgendes habe ich versucht:
$request_uri ~ "%27|%22"
: einfach funktioniert, doppelt nicht$request_uri ~ "%27|\""
: einfach funktioniert, doppelt nicht$request_uri ~ "%27|0x"
: beide funktionieren, aber0x
es gibt falsche Positivmeldungen beiDaumen=230x240
Und ich bin nicht einmal sicher, wie ich mit dem Backslash umgehen soll.
Wisst ihr, wie es funktioniert?
PS: Ich habe darüber nachgedacht,Amazon WAS, aber es erfordert einen anderen Dienst (Cloudflare oder Load Balancer), für den ich noch nicht bereit bin.
PS: Mir ist klar, dass andere Maßnahmen ergriffen werden müssen; dies soll diese lästigen GET-Scans beseitigen. Außerdem bezweifle ich, dass die legitimen Besucher diese beim Surfen haben werden. Meine Logik war folgende: Jede Barriere, die den Hack erschwert, hilft
Antwort1
Die wichtigsten nginx.conf
unter http {}
:
# set the variable
map "$request_uri" $susp {
default 0;
"~*(?<suspm>(\\x|%)(3c|3e|5c|22|27)+)" 1;
}
# match logging
log_format suspl '$remote_addr /$suspm/ - $remote_user $host [$time_local] '
'"$request" $status $body_bytes_sent '
'"$http_referer" "$http_user_agent" "$http_cookie"';
Individuelle virtuelle Hostkonfiguration:
location / {
if (\$susp = 1) {
access_log /var/log/suspl.log suspl;
return 403;
}
# etc…
}
Auch,
Ich bezweifle, dass die legitimen Besucher diese beim Surfen haben werden
Achtung: Es stellt sich heraus, dass sie so etwas wie %7B%22
die Cookies enthalten, die von einigen (nicht allen) Tracking-/Analyseprogrammen gesetzt werden.