XSS in BBCodes verhindern

02/19/2015 17:17 IchVerabschiedeMich#1
Hey Leute,

ich bin aktuell ein wenig am verzweifeln, es geht um eine XSS in BBCodes.

Und zwar hat einer meiner User mich auf folgende Lücke hingewiesen:
[Only registered and activated users can see links. Click Here To Register...]

Zum parsen der Codes nutze ich folgendes:
[Only registered and activated users can see links. Click Here To Register...]

Ich habe nun echt einige Lösungen gefunden, aber die beruhen meist darauf Befehle einfach vorher raus zu filtern (Wo ich das Problem sehe das ich wohl kaum alle raus filtern kann) oder einfach folgende Zeichen raus filter:
Quote:
" ' < >
Das Problem ist, bei folgendem Code sind diese Zeichen gar nicht erst vorhanden:
Code:
[URL="javascript:alert(document.cookie);"]javascript:alert(document.cookie);[/URL]
Meine allgemein Idee wäre, irgendwie dem Browser zu sagen das ab dieser stelle kein Javascript geparsed werden soll, jedoch wüsste ich nicht das es so eine Möglichkeit gibt, und wenn, wie weit ist das ganze abwärts kompatibel?

Mir ist auch aufgefallen das bei epvp das bspw. ebenfalls einfach nicht ausgeführt wird:
[Only registered and activated users can see links. Click Here To Register...]

Ich hoffe ihr könnte mir irgendwie weiter helfen.

Gruß,
Padrio (<(`-´)>)
02/19/2015 17:31 xEncounter#2
Quote:
Originally Posted by <(`-´)> View Post
Hey Leute,

ich bin aktuell ein wenig am verzweifeln, es geht um eine XSS in BBCodes.

Und zwar hat einer meiner User mich auf folgende Lücke hingewiesen:
[Only registered and activated users can see links. Click Here To Register...]

Zum parsen der Codes nutze ich folgendes:
[Only registered and activated users can see links. Click Here To Register...]

Ich habe nun echt einige Lösungen gefunden, aber die beruhen meist darauf Befehle einfach vorher raus zu filtern (Wo ich das Problem sehe das ich wohl kaum alle raus filtern kann) oder einfach folgende Zeichen raus filter:


Das Problem ist, bei folgendem Code sind diese Zeichen gar nicht erst vorhanden:
Code:
[URL="javascript:alert(document.cookie);"]javascript:alert(document.cookie);[/URL]
Meine allgemein Idee wäre, irgendwie dem Browser zu sagen das ab dieser stelle kein Javascript geparsed werden soll, jedoch wüsste ich nicht das es so eine Möglichkeit gibt, und wenn, wie weit ist das ganze abwärts kompatibel?

Mir ist auch aufgefallen das bei epvp das bspw. ebenfalls einfach nicht ausgeführt wird:
[Only registered and activated users can see links. Click Here To Register...]

Ich hoffe ihr könnte mir irgendwie weiter helfen.

Gruß,
Padrio (<(`-´)>)
Das du dir die Cookies nicht anzeigen lassen kannst, ist ein Schutz vor Javascript. Durch den Cookie paramater httponly.

PHP Code:

$secure 
true;
    
// Damit wird verhindert, dass JavaScript auf die session id zugreifen kann.
    
$httponly true;
    
// Zwingt die Sessions nur Cookies zu benutzen.
    
if (ini_set('session.use_only_cookies'1) === FALSE) {
echo 
'Nope unsicher, stirb.';
        exit();
    }
    
// Holt Cookie-Parameter.
    
$cookieParams session_get_cookie_params();
    
session_set_cookie_params($cookieParams["lifetime"],
        
$cookieParams["path"], 
        
$cookieParams["domain"], 
        
$secure,
        
$httponly); 
02/19/2015 17:37 IchVerabschiedeMich#3
Ich nutze Laravel als Famework, und werde grade ehrlich gesagt aus deinem Code nicht sehr viel schlauer.
Es geht nicht explizit um Cookies, sondern das ich im allgemeinen Cross-Site Scripting verhindern will.
02/19/2015 17:53 xEncounter#4
Quote:
Originally Posted by <(`-´)> View Post
Ich nutze Laravel als Famework, und werde grade ehrlich gesagt aus deinem Code nicht sehr viel schlauer.
Es geht nicht explizit um Cookies, sondern das ich im allgemeinen Cross-Site Scripting verhindern will.
Das trägt zum XSS SchutzBei. Im Falle, dass es dem Angreifer gelingt ist deine Session ID sicher.

Benutze bei jeder Benutzereingabe einen [Only registered and activated users can see links. Click Here To Register...].

Gib den Input am besten immer mit htmlspecialchars() oder noch extremer htmlentities() aus, dann werden alle Zeichen escaped.
02/19/2015 18:04 IchVerabschiedeMich#5
Liest du eigentlich überhaupt was ich schreibe?

Quote:
Originally Posted by xEncounter View Post
Das trägt zum XSS SchutzBei. Im Falle, dass es dem Angreifer gelingt ist deine Session ID sicher.
Gerne, schau ich mal wie genau man das jetzt in Laravel implementieren kann.

Quote:
Originally Posted by xEncounter View Post
Benutze bei jeder Benutzereingabe einen [Only registered and activated users can see links. Click Here To Register...].
Mach ich bei Laravel über die Rules - keine Sorge; Ich bin nicht komplett bescheuert was das ganze Thema angeht.

Quote:
Originally Posted by xEncounter View Post
Gib den Input am besten immer mit htmlspecialchars() oder noch extremer htmlentities() aus, dann werden alle Zeichen escaped.
Escaped trotzdem nicht den obigen Code.
02/20/2015 07:59 Asuna.#6
Also ich sehe bei

Code:
[URL="javascript:alert(document.cookie);"]javascript:alert(document.cookie);[/URL]
schon 2x das "
02/20/2015 09:58 KoKsPfLaNzE#7
du koenntest den bbcode parser nutzen, der faengt das meines wissens alles ab.

[Only registered and activated users can see links. Click Here To Register...]

zf2 module
[Only registered and activated users can see links. Click Here To Register...]
02/20/2015 17:02 xEncounter#8
Quote:
Originally Posted by Asuna. View Post
Also ich sehe bei

Code:
[URL="javascript:alert(document.cookie);"]javascript:alert(document.cookie);[/URL]
schon 2x das "
Ich denke das liegt daran wie der den BBCode liest, wenn htmlspecialchars nicht escaped...
Quote:
Folgende Umwandlungen werden vorgenommen:

'&' (Ampersand/kaufmännisches Und) wird zu '&'.
'"' (doppeltes Anführungszeichen) wird zu '"', wenn ENT_NOQUOTES nicht gesetzt ist.
"'" (einfaches Anführungszeichen) wird nur zu '&#039;', wenn ENT_QUOTES gesetzt ist.
'<' (kleiner als) wird zu '<'
'>' (größer als) wird zu '>'
Anders kann ich mir das nicht erklären.
02/20/2015 17:35 IchVerabschiedeMich#9
Quote:
Originally Posted by KoKsPfLaNzE View Post
du koenntest den bbcode parser nutzen, der faengt das meines wissens alles ab.

[Only registered and activated users can see links. Click Here To Register...]

zf2 module
[Only registered and activated users can see links. Click Here To Register...]
Was auch immer mir das zf2 module bringen soll :rolleyes:
Ich erstell daraus demnächst ein Laravel Package und schau dann weiter obs funktioniert, danke schonmal :)
Hast ja anscheinend schonmal das ganze für Composer ported, danke dafür, werde ich als Grundlage nutzen.
02/21/2015 01:20 KoKsPfLaNzE#10
das zf2 module sollte als bsp dienen, wusste net ob das bei laravel irgendwie verwenden kannst.