{"id":72,"date":"2015-06-03T07:42:10","date_gmt":"2015-06-03T05:42:10","guid":{"rendered":"http:\/\/carsten.familie-schumann.info\/blog\/?p=72"},"modified":"2015-06-03T10:28:43","modified_gmt":"2015-06-03T08:28:43","slug":"sql-injection-attack-mit-hilfe-der-stadt-teil-2","status":"publish","type":"post","link":"https:\/\/carsten.familie-schumann.info\/blog\/2015\/06\/sql-injection-attack-mit-hilfe-der-stadt-teil-2\/","title":{"rendered":"SQL Injection Attack mit Hilfe der Stadt, Teil 2"},"content":{"rendered":"<p><img decoding=\"async\" align=\"right\" src=\"http:\/\/carsten.familie-schumann.info\/blog2\/wp-content\/uploads\/2008\/12\/Bug-260x300.png\" alt=\"\" \/><br \/>\nIm Dezember 2008 hatte ich unter <a href=\"http:\/\/carsten.familie-schumann.info\/blog\/2008\/12\/sql-injection-attack-mit-hilfe-der-stadt\/\">SQL Injection Attack mit Hilfe der Stadt<\/a> dar\u00fcber berichtet, dass ich mit unserem Stra\u00dfennamen &#8220; Auf&#8217;m Diek &#8220; bei einem Interneth\u00e4ndler auf nicht unerhebliche Probleme gesto\u00dfen bin. <\/p>\n<p>F\u00fcr diejenigen, die nicht viel mit SQL am Hut haben, will ich mal kurz erl\u00e4utern, was damals passiert ist: Bei SQL, das ist eine Datenbanksprache, die auf den meisten Webseiten verwendet wird, 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. Ein typischer Befehl s\u00e4he also so aus:<\/p>\n<pre class=\"brush: sql; title: ; notranslate\" title=\"\">SELECT address FROM customer WHERE name='Carsten';<\/pre>\n<p>Soll nun der eigentliche Text selbst ein Hochkomma haben, so muss man es speziell kenntlich machen, der Experte sagt &#8222;escapen&#8220;. Dies erfolgt bei SQL durch einen vorangestellten Backslash:<\/p>\n<pre class=\"brush: sql; title: ; notranslate\" title=\"\">SELECT address FROM customer WHERE name='Carsten\\'s Name';<\/pre>\n<p>Macht man das nicht, passieren mehr oder minder lustige Dinge: Die Datenbank kann nicht mehr unterscheiden, wo der Text endet und der nachfolgende Befehl endet. Randall Munroe von XKCD hat die m\u00f6glichen Effekte in einem Comic sehr anschaulich beschrieben:<\/p>\n<div style=\"width:100%; float:right; border: 1px solid gray; text-align: right; font-size:0.5em;\"><img decoding=\"async\" src=\"http:\/\/imgs.xkcd.com\/comics\/exploits_of_a_mom.png\" \/>Quelle: <a href=\"http:\/\/www.xkcd.com\" target=\"_blank\">XKCD<\/a>, Oktober 2007<\/div>\n<p>Seitdem meinem vorhergehenden Posting sind fast 7 Jahre vergangen. SQL Injection Angriffe sind inzwischen selbst in der Breiten \u00d6ffentlichkeit angekommen und f\u00fcr jeden seri\u00f6sen Entwickler ist es inzwischen Standard, seine Anwendung auf solche Schwachstellen zu \u00fcberpr\u00fcfen. Dar\u00fcber hinaus sorgt auch jede halbwegs aktuelle Datenbankabstraktionsschicht inzwischen daf\u00fcr, dass soetwas nicht mehr passieren kann. Jede&#8230;..? Fast!<\/p>\n<p>Eine Begegnung der dritten Art erlebte ich die Tage bei Pollin, als ich versuchte, \u00fcber deren Webseite ein paar Elektronikkomponenten zu bestellen. Bestellung abgeschickt, wohl weislich ohne Apostroph in unserem Stra\u00dfennamen. Bestellbest\u00e4tigung per Mail bekommen. Nur leider kein Paket. Eine R\u00fcckfrage an die Mailadresse offenbarte:<\/p>\n<p><code><br \/>\nGuten Tag, Herr Schumann,<\/p>\n<p>vielen Dank f\u00fcr Ihre E-Mail.<br \/>\nLeider liegt uns kein Auftrag mit der Bestellnummer ###### von Ihnen vor.<br \/>\nWir bitten Sie die Bestellung erneut zu t\u00e4tigen.<br \/>\n<\/code><\/p>\n<p>An dieser Stelle glaubte ich noch an ein ganz normales EDV-Problem. Schlie\u00dflich haben selbst die gr\u00f6\u00dften Systeme auch einmal etwas Schluckauf. Gesagt getan, Bestellung erneut eingegeben Bestellbest\u00e4tigung per Mail bekommen und per Mail direkt nachgefragt, ob die Bestellung auch im System angekommen ist. Die darauffolgende Antwort lie\u00df bei mir jedoch alle Alarmglocken schrillen:<\/p>\n<p><code><br \/>\nGuten Tag, Herr Schuhmann,<\/p>\n<p>vielen Dank f\u00fcr Ihre E-Mail.<br \/>\nLeider haben wir keinen Auftrag erhalten.<br \/>\nSie m\u00fcssten das Apostroph aus der Stra\u00dfe entfernen und dann bestellen.<br \/>\nSolang das Apostroph drin ist, kommt der Auftrag bei uns nicht an.<br \/>\n<\/code><\/p>\n<p>OK. Fassen wir zusammen: Ich habe eine Lieferadresse <strong>ohne Apostroph<\/strong> im Stra\u00dfennamen eingegeben und das System verschluckt sich wegen einem Apostroph. Wie kann das sein&#8230;.?<\/p>\n<p>Offensichtlich f\u00fchrt Pollin einen automatisierten Abgleich mit den Datenbanken eines Bonit\u00e4tsdienstleisters (z.B. Schufa) durch, um sich gegen Zahlungsausf\u00e4lle abzusichern. In dem Zuge wird dann auch automatisch die Adresse &#8222;korrigiert&#8220;, was in einem nachgelagerten System zu einem Problem f\u00fchrt und die Daten\u00fcbergabeschnittstelle sprengt. Mit ein wenig Kreativit\u00e4t k\u00f6nnte man an dieser Stelle mit Sicherheit ziemliches Unheil einrichten, ich sage nur &#8222;Little Bobby Tables&#8220;. <\/p>\n<p>Und was lernt der interessierte Programmierer daraus?<\/p>\n<ol>\n<li>Datenbankeingaben \u00fcberpr\u00fcfen (oder ein vern\u00fcnftiges Framework verwenden)<\/li>\n<li>Selbst programmierte Schnittstellen vern\u00fcnftig und ausgiebig testen<\/li>\n<li>Daten nicht blind von anderen Dienstleistern \u00fcbernehmen<\/li>\n<li>Gelegentlich mal einen Blick in die Server-Logs werfen. Bevor solche L\u00fccken f\u00fcr Angriffe ausgenutzt werden sieht man meist die Fehlermeldungen durch unbeabsichtigte F\u00e4lle, wo die L\u00fccke auch schon den normalen Programmfluss st\u00f6rt.<\/li>\n<\/ol>\n<p>Bleibt nur zu hoffen, dass Pollin die gleichen Schl\u00fcsse daraus zieht und die Sicherheitsl\u00fccke in Gr\u00f6\u00dfe eines Scheunentors zeitnah zumacht. Die n\u00e4chste Bestellung kommt bestimmt&#8230;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Im Dezember 2008 hatte ich unter SQL Injection Attack mit Hilfe der Stadt dar\u00fcber berichtet, dass ich mit unserem Stra\u00dfennamen &#8220; Auf&#8217;m Diek &#8220; bei einem Interneth\u00e4ndler auf nicht unerhebliche Probleme gesto\u00dfen bin. F\u00fcr diejenigen, die nicht viel mit SQL am Hut haben, will ich mal kurz erl\u00e4utern, was damals passiert ist: Bei SQL, das&#8230;<br \/><a class=\"read-more-button\" href=\"https:\/\/carsten.familie-schumann.info\/blog\/2015\/06\/sql-injection-attack-mit-hilfe-der-stadt-teil-2\/\">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-72","post","type-post","status-publish","format-standard","hentry","category-programmierung"],"_links":{"self":[{"href":"https:\/\/carsten.familie-schumann.info\/blog\/wp-json\/wp\/v2\/posts\/72","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=72"}],"version-history":[{"count":9,"href":"https:\/\/carsten.familie-schumann.info\/blog\/wp-json\/wp\/v2\/posts\/72\/revisions"}],"predecessor-version":[{"id":81,"href":"https:\/\/carsten.familie-schumann.info\/blog\/wp-json\/wp\/v2\/posts\/72\/revisions\/81"}],"wp:attachment":[{"href":"https:\/\/carsten.familie-schumann.info\/blog\/wp-json\/wp\/v2\/media?parent=72"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/carsten.familie-schumann.info\/blog\/wp-json\/wp\/v2\/categories?post=72"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/carsten.familie-schumann.info\/blog\/wp-json\/wp\/v2\/tags?post=72"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}