{"id":15,"date":"2008-12-04T08:09:10","date_gmt":"2008-12-04T08:09:10","guid":{"rendered":"http:\/\/carsten.familie-schumann.info\/blog\/?p=15"},"modified":"2014-12-04T20:36:31","modified_gmt":"2014-12-04T20:36:31","slug":"sql-injection-attack-mit-hilfe-der-stadt","status":"publish","type":"post","link":"https:\/\/carsten.familie-schumann.info\/blog\/2008\/12\/sql-injection-attack-mit-hilfe-der-stadt\/","title":{"rendered":"SQL Injection Attack mit Hilfe der Stadt"},"content":{"rendered":"<p>Umz\u00fcge bringen ja so einiges mit sich. Unter anderem auch meistens eine neue Adresse. Bei der Planung des Wohngebiets, in das wir nun gezogen sind, hat die Stadt Dorsten jedoch au\u00dferordentliche Kreativit\u00e4t an den Tag gelegt und gezeigt, dass Stra\u00dfennamen nicht nur aus Buchstaben bestehen m\u00fcssen.<\/p>\n<p>Unsere Stra\u00dfe hat in dieser kreativen Phase den Namen <i>Auf&#8217;m Diek<\/i> bekommen und ja, das mit dem Apostroph ist die offizielle Schreibweise.<\/p>\n<p>F\u00fcr die ersten lustigen Effekte sorgte der Name bereits, als wir unsere DSL-Leitung bei Versatel bestellen wollten. Dort gab es n\u00e4mlich ganze 5 Stra\u00dfen, die in die Endauswahl kamen: <tt>Aufm Diek<\/tt>, <tt>Auf dem Diek<\/tt>, <tt>Auf'm Diek<\/tt>, <tt>Auf\u00b4m Diek<\/tt> sowie <tt>Auf`m Diek<\/tt>. Wir haben uns einfach mal f\u00fcr eine beliebige Variante entschieden und es hat auf Anhieb funktioniert.<\/p>\n<p>Nicht so viel Gl\u00fcck hatten wir gestern, als wir im Internet etwas bestellen wollten. Produkt ausgew\u00e4hlt, ab zur Kasse, Kundenkonto angelegt, Versandadresse eingegeben und dann das:<\/p>\n<blockquote><p>1064 &#8211; You have an error in your SQL syntax; check the manual that<br \/>\ncorresponds to your MySQL server version for the right syntax to use near<br \/>\n&#8218;m Diek&#8216;, &#8218;Dorsten&#8216;, &#8218;46284&#8216;, 0)&#8216; at line 2<br \/>\nINSERT INTO customers_credit_reform (score, customers_id, address_valid,<br \/>\naddress_valid_code, address_known, address_street_no, address_street_name,<br \/>\naddress_town, address_postcode, credit_error) VALUES (42, 91756,<br \/>\n&#8220;, &#8217;03&#8216;, &#8218;0&#8216;, &#8217;19&#8216;, &#8218;Auf&#8217;m Diek&#8216;, &#8218;Dorsten&#8216;, &#8218;46284&#8216;, 0)<br \/>\n[XT SQL Error]<\/p><\/blockquote>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignright wp-image-11 size-medium\" src=\"http:\/\/carsten.familie-schumann.info\/blog2\/wp-content\/uploads\/2008\/12\/Bug-260x300.png\" alt=\"Bug\" width=\"260\" height=\"300\" srcset=\"https:\/\/carsten.familie-schumann.info\/blog\/wp-content\/uploads\/2008\/12\/Bug-260x300.png 260w, https:\/\/carsten.familie-schumann.info\/blog\/wp-content\/uploads\/2008\/12\/Bug.png 300w\" sizes=\"auto, (max-width: 260px) 100vw, 260px\" \/>Eine solche Meldung l\u00e4sst das Herz jedes Softwareentwicklers h\u00f6her schlagen.<\/p>\n<p>F\u00fcr diejenigen, die nicht viel mit SQL am Hut haben, will ich mal kurz erl\u00e4utern, was hier passiert ist: Bei SQL, das ist eine Datenbanksprache, werden Texte in Hochkommatas eingeschlossen, um zu kennzeichnen, wo der Text anf\u00e4ngt und wo er endet. Au\u00dferhalb der Hochkommatas stehen Befehle, was die Datenbank machen soll. In der oberen Fehlermeldung soll beispielsweise in die Felder <i>core, customers_id, address_valid, &#8230; , credit_error<\/i> der Tabelle <i>customers_credit_reform<\/i> etwas eingef\u00fcgt werden, und zwar die Werte (VALUES) die dahinter stehen. Zahlenfelder haben keine Hochkommatas (z.B. 00963) w\u00e4hrend Textfelder mit Hochkommatas eingeschlossen sind (z.B. &#8218;Dorsten&#8216;).<\/p>\n<p>Wenn man sich nun die Anweisung mal genau anschaut, dann f\u00e4llt auf, dass bei &#8218;Auf&#8217;m Diek&#8216; irgendwie ein Hochkomma zu viel ist. Die Datenbank interpretiert dies so, dass der Text <tt>'Auf'<\/tt> lautet und <tt>m Diek<\/tt> als SQL-Befehl interpretiert wird, der nat\u00fcrlich inkorrekt ist, was die oben gezeigte Fehlermeldung proviziert.<\/p>\n<p>Mit ein bischen SQL-Wissen und aufgestautem Frust (weil z.B. die Bestellung nicht klappt) k\u00f6nnte jemand sich auch folgende Adresse ausdenken: <tt>'irgendwas','','',9);DROP DATABASE;--'<\/tt>. Das resultierende SQL-Kommando s\u00e4he dann so aus:<\/p>\n<blockquote><p>INSERT INTO customers_credit_reform (score, customers_id, address_valid,<br \/>\naddress_valid_code, address_known, address_street_no, address_street_name,<br \/>\naddress_town, address_postcode, credit_error) VALUES (42, 91756,<br \/>\n&#8220;, &#8217;03&#8216;, &#8218;0&#8216;, &#8217;19&#8216;, &#8218;irgendwas&#8216;,&#8220;,&#8220;,9);DROP DATABASE;&#8211;&#8218;, &#8218;Dorsten&#8216;, &#8218;46284&#8216;, 0)<\/p><\/blockquote>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignright wp-image-12 size-full\" src=\"http:\/\/carsten.familie-schumann.info\/blog2\/wp-content\/uploads\/2008\/12\/schredder.jpg\" alt=\"schredder\" width=\"262\" height=\"360\" srcset=\"https:\/\/carsten.familie-schumann.info\/blog\/wp-content\/uploads\/2008\/12\/schredder.jpg 262w, https:\/\/carsten.familie-schumann.info\/blog\/wp-content\/uploads\/2008\/12\/schredder-218x300.jpg 218w\" sizes=\"auto, (max-width: 262px) 100vw, 262px\" \/>F\u00fcr nicht-SQLler \u00fcbersetzt und gek\u00fcrzt: F\u00fcge irgendwas in die Tabelle customers_credit_reform ein und <b>l\u00f6sche danach die gesamte Datenbank<\/b>. Alles nach dem &#8212; wird als Kommentar interpretiert und ignoriert. Der Shop-Betreiber wird sich freuen, wenn seine gesamten Daten weg sind.<\/p>\n<p>Normalerweise w\u00fcrde man Hochkommata in Textfeldern einen Backslash voranstellen <tt>'<\/tt> um sie zu &#8222;escapen&#8220;. Offensichtlich hat das der Programmierer dieses Webshops jedoch vergessen, obwohl PHP und andere Programmiersprachen hierf\u00fcr extra Befehle haben und die meisten Datenbankabstraktionsschichten das schon automatisch machen. Tragisch sag ich nur.<\/p>\n<p>Aber zur\u00fcck zur Bestellung. Um das Problem zu umgehen, hab ich meine Adresse zu <tt>Aufm Diek<\/tt> korrigiert. Der Postbote findet das auch so. Aber auch hier hat mich der Webshop \u00fcbert\u00f6lpelt.<\/p>\n<blockquote><p>1064 &#8211; You have an error in your SQL syntax; check the manual that<br \/>\ncorresponds to your MySQL server version for the right syntax to use near<br \/>\n&#8218;m Diek&#8216;, &#8218;Dorsten&#8216;, &#8218;46284&#8216;, 0)&#8216; at line 2<br \/>\nINSERT INTO customers_credit_reform (score, customers_id, address_valid,<br \/>\naddress_valid_code, address_known, address_street_no, address_street_name,<br \/>\naddress_town, address_postcode, credit_error) VALUES (00963, 91756,<br \/>\n&#8218;Korrigierte Eingabeadresse wird ausgegeben&#8216;, &#8217;03&#8216;, &#8218;0&#8216;, &#8217;19&#8216;, &#8218;Auf&#8217;m<br \/>\nDiek&#8216;, &#8218;Dorsten&#8216;, &#8218;46284&#8216;, 0)<br \/>\n[XT SQL Error]<\/p><\/blockquote>\n<p>Ich sag nur: <b>Korrigierte Eingabeadresse wird ausgegeben<\/b>.<\/p>\n<p>Gegen soviel geballte Intelligenz des Webshops komm auch ich nicht an und hab mich mal entschlossen, das ganze per E-Mail zu bestellen. Mal sehen, ob der Webshop die Bestellung annimmt &#8230;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Umz\u00fcge bringen ja so einiges mit sich. Unter anderem auch meistens eine neue Adresse. Bei der Planung des Wohngebiets, in das wir nun gezogen sind, hat die Stadt Dorsten jedoch au\u00dferordentliche Kreativit\u00e4t an den Tag gelegt und gezeigt, dass Stra\u00dfennamen nicht nur aus Buchstaben bestehen m\u00fcssen. Unsere Stra\u00dfe hat in dieser kreativen Phase den Namen&#8230;<br \/><a class=\"read-more-button\" href=\"https:\/\/carsten.familie-schumann.info\/blog\/2008\/12\/sql-injection-attack-mit-hilfe-der-stadt\/\">Mehr Lesen<\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[3],"tags":[],"class_list":["post-15","post","type-post","status-publish","format-standard","hentry","category-programmierung"],"_links":{"self":[{"href":"https:\/\/carsten.familie-schumann.info\/blog\/wp-json\/wp\/v2\/posts\/15","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/carsten.familie-schumann.info\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/carsten.familie-schumann.info\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/carsten.familie-schumann.info\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/carsten.familie-schumann.info\/blog\/wp-json\/wp\/v2\/comments?post=15"}],"version-history":[{"count":2,"href":"https:\/\/carsten.familie-schumann.info\/blog\/wp-json\/wp\/v2\/posts\/15\/revisions"}],"predecessor-version":[{"id":17,"href":"https:\/\/carsten.familie-schumann.info\/blog\/wp-json\/wp\/v2\/posts\/15\/revisions\/17"}],"wp:attachment":[{"href":"https:\/\/carsten.familie-schumann.info\/blog\/wp-json\/wp\/v2\/media?parent=15"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/carsten.familie-schumann.info\/blog\/wp-json\/wp\/v2\/categories?post=15"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/carsten.familie-schumann.info\/blog\/wp-json\/wp\/v2\/tags?post=15"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}