Ich weiss (nicht mehr) ob Du im Facebook bist…

Update 27.01.2011: *übel_fluch*! Facebook hat ein Captcha eingebaut, dass diese Detection momentan nicht mehr funktionieren lässt. Das Prinzip bleibt ok, die Realisierung brauchte nun etwas mehr Zeit.

Big BrotherEigentlich hätte ich ja ganz Anderes zu tun, aber per Zufall bin ich über den genialen Blogartikel von Mike Cardwell gestolpert. Er hat eine Idee gehabt, wie es möglich wird herauszufinden, ob Benutzer auf Facebook und Konsorten eingeloggt sind oder nicht.

Umgesetzt in eine kleine Library läuft es als Proof-of-Concept auf Firefox und sieht folgendermassen aus:

Loggen Sie in Gmail, Facebook, Twitter oder Digg ein um Resultate zu sehen.
Sind Sie nicht abgelenkt?

Neuer Check

Grundsätzlich wäre es ja ganz einfach: Man schaut vom Client-Browser aus, ob man Zugriff auf Bilder oder Seiten hat, die nur für Eingeloggte zur Verfügung stehen. Leider gestaltet sich dieser simple Ansatz nicht so einfach, weil mit Ajax nur zur Domain der Website verbunden werden darf und nicht an einen x-beliebigen Ort. Ein Proxy hilft auch nicht weiter, da es die Cookies des Browsers braucht, und die werden nur an Facebook, etc direkt abgeliefert.

Wie kann man also diese Restriktion umgehen?

Weiterlesen

JPG Hacks (isch weiss wo Deine Haus wohnt!)

JPG HacksHöret nun die weisen Dinge, die mir von den Erleuchteten des Webs, genannt /b/tards, gelehrt wurden. Die Anwendungsgebiete sind klein, der Effekt jedoch gross. Wo wurde das Photo geschossen? Was kann man in ein Jpeg packen, für Fun und Profit? Lehset weiter…

Was ist drin, im Jpeg?

Ortsangaben

Im Jpeg drin ist ziemlich viel Bild. Daneben aber auch noch Metadaten, normalerweise im Exif-Format. Man findet da so Dinge wie Auflösung, Kameratyp, Datum und Uhrzeit, … ABER: Seit der Inflation von iPhonies und deren Clones immer öfter auch GPS-Ortsangaben. Nicht alle Programme können diese GPS-Exif-Tags darstellen, aber jhead zum Beispiel hat das ganz gut im Griff.

Vorgehen

Nehmen wir mal einen Beitrag im Krusenstern (ich hoffe, sie nehmen mir das nicht übel). Das Jpeg speichern wir ab und lassen es durch jhead laufen:
Weiterlesen

Black Hat SEO: PageRank und „XSS“

Gedankenspiel

Frank ZahnderIn einem früheren Beitrag habe ich schon mal was über XSS abgesondert. Dort kann man auch Beispiele sehen, die Texte statt Skripts in die fremden Websites einfügen.

Lasst uns ein Gedankenspiel machen:
Kurt hat eine Website (und keinen Gurt, wie Insider wissen 😉 ). Kurt möchte einen hohen PageRank, damit er in den Suchmaschinen gut gelistet, gefunden und mit Geld überschüttet wird. Es wird vermutet, dass der PageRank mit der Anzahl und Qualität der Backlinks zusammenhängt. Backlinks sind die Links, die von einer fremden Website auf Kurts Machtwerk zeigen. Kurts Namen ist kurz und seine Geduld ist klein; Er mag nicht warten, bis die Webmaster seine übergenialen Inhalte gefunden und verlinkt haben.

Was würde passieren, wenn ebendieser Kurt XSS Lücken ausnutzen würde? Was, wenn er Links konstruieren würde, die auf fremden Websites Links auf seine eigene Seite darstellen? Was, wenn er diese Links in Foren und anderswo grosszügig streuen würde?
Der Googlebot würde den Links folgen, die Verweise auf Kurts Seite finden und ihn belohnen, oder?

Das Beispiel

Hier ein Beispiel (Screenshot weil der Fehler korrigiert werden könnte).
kurt xss

Natürlich kann man auch andere Dinge ausnutzen um seinen Text dorthin zu kriegen und Opfer mit höherem Pagerank suchen. Aber gerade dieses Formular scheint sehr verbreitet zu sein…

Die Frage bleibt…

Würde das gehen? Hat das schon jemand versucht? Ich bin viel zu lieb solche Dinge in Angriff zu nehmen… LOL

PHP_SELF ist böse! Potentielles Cross Site Scripting (XSS)!

Was haben wir gelernt?

EvilJa, uns wurde gelehrt, dass man wenn immer möglich nicht Dateinamen direkt, sondern eine Variable angeben soll, die für den Dateinamen steht. Warum konnte mir zwar noch niemand so genau sagen, aber ich nehme an, dass es darum geht, dass der Dateinamen oder der Pfad ändern könnte. So habe ich ziemlich oft ganz brav geschrieben:

<form action="<?php echo $_SERVER['PHP_SELF']; ?>" method ="post">
...
</form>

Und (zum Glück) bin ich nicht der Einzige. Eine kleine Suche auf Googles Codesearch hat gezeigt, dass mindestens Mambo, PHPMyFAQ, Einige WordPressthemes und viele mehr dasselbe Problem haben. Ich bin bei Weitem auch nicht der Erste, der über Probleme mit dieser Technik erfahren und darüber geschrieben hat.

Problem? mit $_SERVER['PHP_SELF']?

Lasst mich ausholen: Der Apache Webserver hat eine Option AcceptPathInfo, welche standardmässig auf On ist. Mit dieser Option mappt der Apache beliebig lange Pfade auf Dateien, sofern diese irgendwie Bestandteil des Pfades sind. Der Rest wird in Umgebungsvariablen mitgegeben.

Gimme Code

Nehmen wir an, es gäbe eine Datei /subdir/mypath.php welche so aussieht:

<?php
echo "<pre>";
echo "REQUEST_URI: ".$_SERVER['REQUEST_URI']."\n";
echo "PHP_SELF:    ".$_SERVER['PHP_SELF']."\n";
echo "SCRIPT_NAME: ".$_SERVER['SCRIPT_NAME']."\n";
echo "</pre>";
?>

Bei einem Aufruf von: http://localhost/subdir/mypath.php/additional/stuff/nonsense.php?para=4 mappt Apache netterweise alles auf unsere Datei http://localhost/subdir/mypath.php und verstaut den Rest im $_SERVER Array. Die Ausgabe ist:

REQUEST_URI: /subdir/mypath.php/additional/stuff/nonsense.php?para=4
PHP_SELF:    /subdir/mypath.php/additional/stuff/nonsense.php
SCRIPT_NAME: /subdir/mypath.php

PHP_SELF übernimmt also den ganzen Krempel und würde ihn bei unserem Form auch so darstellen. Angenommen, wir haben ein PHP-Script mit der URL http://localhost/contact/myform.php mit folgendem Inhalt:
<form action="<?php echo $_SERVER['PHP_SELF']; ?>" method ="post">

Ruft man dieses nun mit folgender URL auf (die aufwändiger als notwendig konstruiert und des besseren Verständnisses wegen nicht URL-encodiert ist):
http://localhost/contact/myform.php/"></form>Hier ein Javascript: <script>alert('gotcha');</script><form action="/contact/myform.php
erhält man:
<form action="/"></form>Hier ein Javascript: <script>alert('gotcha');</script><form action="/contact/myform.php" method ="post">

Also vollkommen gültiges HTML (sogar das Form funktioniert) mit fremdbestimmbaren Seiteninhalt. Das ist ja wohl hässlich…

Theorie! Gib mir Praxis!

Ich weiss nicht, wie lange folgende Links funktionieren, beziehungsweise diese Sites anfällig für diese Art von XSS sind:

Digital Postcard (Kein XSS, aber mein Text 🙂 ):
Postcard XSS

Multimediatreff: (Mittlerweile behoben)
Multimediatreff

Jobs. ch (Mittlerweile behoben):
Jobs.ch

Was nutzt das dem bösen Hacker?

Text in Fremdpages einbauen, Phishing, Indentitätenklau und noch einiges Weiteres. Ein Folgeartikel wird mindestens eine Anwendung zeigen.

Was tun?

Ganz einfach: Das oft verschmähte $_SERVER['SCRIPT_NAME'] verwenden!!!

BTW: Viele Variablen in $_SERVER sind anfällig, aber alles muss ich ja auch nicht verplappern, oder?

Netter, kleiner Honeypot

Ich wollte schon lange mal wissen, wie tuff und 1337 meine Kollegas nun wirklich sind. Wieviel von ihrer kriminellen Energie verwenden sie darauf, in meinen Laptop einzubrechen. Dafür würde sich eigentlich ein Honeypot empfehlen. Ich habe aber keine Zeit mich jahrtausende lang einzulesen und ausserdem sollte ich nebenbei noch auf meinem Laptop arbeiten können.

Alles was ich eigentlich wissen will ist, ob jemand versucht hat zu connecten und was er dann getan hat.

Dafür empfiehlt sich das „Deception Toolkit“ von all.net. Es ist alt, sehr alt, aber guuuut! Im Prinzip hört es auf konfigurierten Ports und startet eine Zustandsmachine, wenn jemand darauf verbindet. Sämtliche Angaben des Angreifers werden geloggt.

Installation: dtk herunterladen und entpacken:

tar xvf dtk.tar

Dann müssen in der Datei thttpd.c alle exit() durch exit(1) ersetzt und folgende Zeilen ergänzt werden:

#include <stdlib .h>
#include <string .h>

In der Datei makefile muss ein dotslash hinzugefügt werden:

telnetd/telnetd:
   (cd ./telnetd;rm ./telnetd;make)
[...]
clean:
   ./cleanup

Zum Schluss ./Configure aufrufen.

Um das Ding zu starten einfach ./dtk.rc.local eingeben und eventuell die Funktion überprüfen mittels:

netstat -ltnp4