CVE-2016-15035: Improper Neutralization of Input During Web Page Generation ('Cross-site Scripting') (CWE-79)
value: A vulnerability was found in Doc2k RE-Chat 1.0. It has been classified as problematic. This affects an unknown part of the file js_on_radio-emergency.de_/re_chat.js. The manipulation leads to cross site scripting. It is possible to initiate the attack remotely. The patch is named bd17d497ddd3bab4ef9c6831c747c37cc016c570. It is recommended to apply a patch to fix this issue. The associated identifier of this vulnerability is VDB-238155.
CWE description: The product does not neutralize or incorrectly neutralizes user-controllable input before it is placed in output that is used as a web page that is served to other users.
CVSS v3 base score: 6.1
Published: 2023-08-28T04:15Z
Repository: https://github.com/Doc2k/re-chat
Language: JavaScript
Files changed: js_on_radio-emergency.de_/re_chat.js
Commit date: 2016-04-04 19:10:37 +0200
Commit message: XSS #2

Erweiterte Ausgabevalidierung für die normalen Chatfunktionen. Siehe https://www.owasp.org/index.php/XSS
Eventuelle Überlegung die Validierung der Datentelegramme serverseitig durchzuführen.
Diff: diff --git a/js_on_radio-emergency.de_/re_chat.js b/js_on_radio-emergency.de_/re_chat.js
index a05b074..5c97bac 100644
--- a/js_on_radio-emergency.de_/re_chat.js
+++ b/js_on_radio-emergency.de_/re_chat.js
@@ -99,11 +99,11 @@
 							jQuery('#iArt_userListContainer, #iArt_smileyInnerCont').css('height', ((jQuery(window).innerHeight()-70)-37)+'px');
 						/* -------------------------------------------------------------  */
 
 						/* Begrüßung einbinden und Chat anzeigen  */
 						/* -------------------------------------------------------------  */
-							jQuery('#messages').append(jQuery('<div>').addClass('iArtChatMessageItem').addClass('reChatInfo').html('('+data.zeitpunkt+') Willkommen '+data.username+' im Radio-Emergency.de Chat'));
+							jQuery('#messages').append(jQuery('<div>').addClass('iArtChatMessageItem').addClass('reChatInfo').html('('+data.zeitpunkt+') Willkommen '+iArt_ChangeMarkup(data.username, false)+' im Radio-Emergency.de Chat'));
 				      		jQuery('#iArt_chatwin').animate({opacity:'toggle'}, 350);
 							jQuery('#iArt_wunschboxTopBtn', parent.document).fadeIn();
 			      		/* -------------------------------------------------------------  */
 
 			      		/* Chatfenster in Position Scrollen und Focus auf Eingabefeld legen  */
@@ -147,11 +147,11 @@
 							jQuery('#iArt_userListContainer, #iArt_smileyInnerCont').css('height', ((jQuery(window).innerHeight()-70)-37)+'px');
 						/* -------------------------------------------------------------  */
 
 						/* Begrüßung, Login ausblenden einbinden und Chat anzeigen  */
 						/* -------------------------------------------------------------  */
-							jQuery('#messages').append(jQuery('<div>').addClass('iArtChatMessageItem').addClass('reChatInfo').html('('+data.zeitpunkt+') Willkommen '+data.username+' im Radio-Emergency.de Chat'));
+							jQuery('#messages').append(jQuery('<div>').addClass('iArtChatMessageItem').addClass('reChatInfo').html('('+data.zeitpunkt+') Willkommen '+iArt_ChangeMarkup(data.username,false)+' im Radio-Emergency.de Chat'));
 							jQuery('#reChatLoginBlocker').animate({opacity:'toggle'}, 350, function(){
 				      			jQuery('#iArt_chatwin').animate({opacity:'toggle'}, 350);
 								jQuery('#iArt_wunschboxTopBtn', parent.document).fadeIn();
 				      		});
 			      		/* -------------------------------------------------------------  */
@@ -179,20 +179,20 @@
 
 
 				/* Der gewähle Benutzername ist bereits in Verwendung  */
 	      		/* ============================================================================================  */
 					socket.on('nologin', function (data) {
-					    alert('Der Benutzername "'+data.username+'" ist bereits in Verwendung');
+					    alert('Der Benutzername "'+iArt_ChangeMarkup(data.username, false)+'" ist bereits in Verwendung');
 					    jQuery('#reUsername').focus();
 					});
 				/* ============================================================================================  */
 
 
 				/* Der gewähle Benutzername ist für Admins/Modis gesperrt  */
 	      		/* ============================================================================================  */
 					socket.on('noAdmin', function (data) {
-					    alert('Der Benutzername "'+data.username+'" ist ein geschützter Name des RE-Teams');
+					    alert('Der Benutzername "'+iArt_ChangeMarkup(data.username, false)+'" ist ein geschützter Name des RE-Teams');
 					    jQuery('#reUsername').focus();
 					});
 				/* ============================================================================================  */
 
 
@@ -248,11 +248,11 @@
 
 	      		/* Neue Nachricht verarbeiten  */
 	      		/* ============================================================================================  */
 		      		socket.on('chat message', function(msg){
 		        		if(connected){
-		        			jQuery('#messages').append(jQuery('<div>').addClass('iArtChatMessageItem').html('('+msg.zeitpunkt+') <img src="http://radio-emergency.de/img/user_'+msg.sex+'_'+msg.istEinAdmin+'.png" /> '+msg.username+': <span style="color:'+msg.farbe+'; font-weight:'+msg.weight+'; font-style:'+msg.style+'">'+msg.message+'</span>'));
+		        			jQuery('#messages').append(jQuery('<div>').addClass('iArtChatMessageItem').html('('+msg.zeitpunkt+') <img src="http://radio-emergency.de/img/user_'+msg.sex+'_'+msg.istEinAdmin+'.png" /> '+iArt_ChangeMarkup(msg.username, false)+': <span style="color:'+iArt_ChangeMarkup(msg.farbe, false)+'; font-weight:'+iArt_ChangeMarkup(msg.weight, false)+'; font-style:'+iArt_ChangeMarkup(msg.style, false)+'">'+iArt_ChangeMarkup(msg.message, false)+'</span>'));
 		        			jQuery('#iArt_chatMessageContMainChat').scrollTop(jQuery('#messages').outerHeight());
 
 							if(privateChatting){
 								if(jQuery('#iArt_TabMainChat').hasClass('active')){}else{
 									if(jQuery('#iArt_TabMainChat').hasClass('alert')){}else{
@@ -277,11 +277,11 @@
 
 
 							if(jQuery('#iArt_userNameBackup').val() == msg.fuerden){
 								/* Ich bin der Empfaenger */
 								/* ============================================================================================  */
-									var mitdemda = msg.username;
+									var mitdemda = iArt_ChangeMarkup(msg.username, false);
 
 									/* Check ob Tab fuer diesen Chat bereits besteht  */
 									/* -------------------------------------------------------------  */
 										var neuerstellung = iArt_checkIfTabExist(mitdemda);
 										if(neuerstellung){
@@ -337,11 +337,11 @@
 									/* -------------------------------------------------------------  */
 
 
 									/* Nachricht in Chatfenster schreiben  */
 									/* -------------------------------------------------------------  */
-										jQuery('#iArt_privChat_'+mitdemda.replace(/ /g, '_').replace(/[^a-z0-9A-Z_]/g, '-')).find('.messages').append(jQuery('<div>').addClass('iArtChatMessageItem').html('('+msg.zeitpunkt+') <img src="http://radio-emergency.de/img/user_'+msg.sex+'_'+msg.istEinAdmin+'.png" /> '+iArt_ChangeMarkup(msg.username, false)+': <span style="color:'+msg.farbe+'; font-weight:'+msg.weight+'; font-style:'+msg.style+'">'+iArt_ChangeMarkup(msg.message, true)+'</span>'));
+										jQuery('#iArt_privChat_'+mitdemda.replace(/ /g, '_').replace(/[^a-z0-9A-Z_]/g, '-')).find('.messages').append(jQuery('<div>').addClass('iArtChatMessageItem').html('('+msg.zeitpunkt+') <img src="http://radio-emergency.de/img/user_'+iArt_ChangeMarkup(msg.sex, false)+'_'+iArt_ChangeMarkup(msg.istEinAdmin, false)+'.png" /> '+iArt_ChangeMarkup(msg.username, false)+': <span style="color:'+iArt_ChangeMarkup(msg.farbe, false)+'; font-weight:'+iArt_ChangeMarkup(msg.weight, false)+'; font-style:'+iArt_ChangeMarkup(msg.style, false)+'">'+iArt_ChangeMarkup(msg.message, true)+'</span>'));
 										jQuery('#iArt_privChat_'+mitdemda.replace(/ /g, '_').replace(/[^a-z0-9A-Z_]/g, '-')).scrollTop(jQuery('#iArt_privChat_'+mitdemda.replace(/ /g, '_').replace(/[^a-z0-9A-Z_]/g, '-')).find('.messages').outerHeight());
 									/* -------------------------------------------------------------  */
 
 
 									/* Tab-Panel öffnen falls geschlossen  */
@@ -360,11 +360,11 @@
 
 								/* Ich bin der Absender  */
 								/* ============================================================================================  */
 									/* Nachricht in Chatfenster schreiben  */
 									/* -------------------------------------------------------------  */
-										jQuery('#iArt_privChat_'+msg.fuerden.replace(/ /g, '_').replace(/[^a-z0-9A-Z_]/g, '-')).find('.messages').append(jQuery('<div>').addClass('iArtChatMessageItem').html('('+msg.zeitpunkt+') <img src="http://radio-emergency.de/img/user_'+msg.sex+'_'+msg.istEinAdmin+'.png" /> '+iArt_ChangeMarkup(msg.username, false)+': <span style="color:'+msg.farbe+'; font-weight:'+msg.weight+'; font-style:'+msg.style+'">'+iArt_ChangeMarkup(msg.message, true)+'</span>'));
+										jQuery('#iArt_privChat_'+msg.fuerden.replace(/ /g, '_').replace(/[^a-z0-9A-Z_]/g, '-')).find('.messages').append(jQuery('<div>').addClass('iArtChatMessageItem').html('('+msg.zeitpunkt+') <img src="http://radio-emergency.de/img/user_'+iArt_ChangeMarkup(msg.sex, false)+'_'+iArt_ChangeMarkup(msg.istEinAdmin, false)+'.png" /> '+iArt_ChangeMarkup(msg.username, false)+': <span style="color:'+iArt_ChangeMarkup(msg.farbe, false)+'; font-weight:'+iArt_ChangeMarkup(msg.weight, false)+'; font-style:'+iArt_ChangeMarkup(msg.style, false)+'">'+iArt_ChangeMarkup(msg.message, true)+'</span>'));
 										jQuery('#iArt_privChat_'+msg.fuerden.replace(/ /g, '_').replace(/[^a-z0-9A-Z_]/g, '-')).scrollTop(jQuery('#iArt_privChat_'+msg.fuerden.replace(/ /g, '_').replace(/[^a-z0-9A-Z_]/g, '-')).find('.messages').outerHeight());
 									/* -------------------------------------------------------------  */
 
 								/* ============================================================================================  */
 							}
@@ -375,32 +375,32 @@
 		      	/* ============================================================================================  */
 
 				/* Privatnachricht kann nicht übermittelt werden da User nicht connected ist  */
 	      		/* ============================================================================================  */
 					socket.on('UserNotConnected', function (data) {
-						jQuery('#iArt_privChat_'+data.benutzer.replace(/ /g, '_').replace(/[^a-z0-9A-Z_]/g, '-')).find('.messages').append(jQuery('<div>').addClass('iArtChatMessageItem').html('('+data.zeitpunkt+') CHATSYSTEM: <span style="color:#f00; font-weight:bold;">--> Nachricht nicht übermittelt da "'+data.benutzer+'" nicht mehr online ist! <--</span><br /> --> '+data.message+' <--'));
+						jQuery('#iArt_privChat_'+data.benutzer.replace(/ /g, '_').replace(/[^a-z0-9A-Z_]/g, '-')).find('.messages').append(jQuery('<div>').addClass('iArtChatMessageItem').html('('+data.zeitpunkt+') CHATSYSTEM: <span style="color:#f00; font-weight:bold;">--> Nachricht nicht übermittelt da "'+iArt_ChangeMarkup(data.benutzer, false)+'" nicht mehr online ist! <--</span><br /> --> '+iArt_ChangeMarkup(data.message, false)+' <--'));
 						jQuery('#iArt_privChat_'+data.benutzer.replace(/ /g, '_').replace(/[^a-z0-9A-Z_]/g, '-')).scrollTop(jQuery('#iArt_privChat_'+data.benutzer.replace(/ /g, '_').replace(/[^a-z0-9A-Z_]/g, '-')).find('.messages').outerHeight());
 					});
 				/* ============================================================================================  */
 
 
 				/* Allen Teilnehmern neuen Benutzer anzeigen  */
 				/* ============================================================================================  */
 					socket.on('user joined', function (data) {
 						if(connected){
-				    		jQuery('#messages').append(jQuery('<div>').addClass('iArtChatMessageItem').addClass('reChatInfo').html('('+data.zeitpunkt+') '+data.username+' hat den Chat betreten'));
+				    		jQuery('#messages').append(jQuery('<div>').addClass('iArtChatMessageItem').addClass('reChatInfo').html('('+data.zeitpunkt+') '+iArt_ChangeMarkup(data.username, false)+' hat den Chat betreten'));
 				    		jQuery('#iArt_chatMessageContMainChat').scrollTop(jQuery('#messages').outerHeight());
 						}
 					});
 				/* ============================================================================================  */
 
 
 				/* Allen Teilnehmern anzeigen, dass ein Benutzer den Chat verlässt */
 				/* ============================================================================================  */
 					socket.on('user left', function (data) {
 						if(connected){
-							jQuery('#messages').append(jQuery('<div>').addClass('iArtChatMessageItem').addClass('reChatInfo').html('('+data.zeitpunkt+') '+data.username+' hat den Chat verlassen'));
+							jQuery('#messages').append(jQuery('<div>').addClass('iArtChatMessageItem').addClass('reChatInfo').html('('+data.zeitpunkt+') '+iArt_ChangeMarkup(data.username, false)+' hat den Chat verlassen'));
 							jQuery('#iArt_chatMessageContMainChat').scrollTop(jQuery('#messages').outerHeight());
 						}
 					});
 				/* ============================================================================================  */
 

Vulnerable code: 							jQuery('#messages').append(jQuery('<div>').addClass('iArtChatMessageItem').addClass('reChatInfo').html('('+data.zeitpunkt+') Willkommen '+data.username+' im Radio-Emergency.de Chat'));
							jQuery('#messages').append(jQuery('<div>').addClass('iArtChatMessageItem').addClass('reChatInfo').html('('+data.zeitpunkt+') Willkommen '+data.username+' im Radio-Emergency.de Chat'));
					    alert('Der Benutzername "'+data.username+'" ist bereits in Verwendung');
					    alert('Der Benutzername "'+data.username+'" ist ein geschützter Name des RE-Teams');
		        			jQuery('#messages').append(jQuery('<div>').addClass('iArtChatMessageItem').html('('+msg.zeitpunkt+') <img src="http://radio-emergency.de/img/user_'+msg.sex+'_'+msg.istEinAdmin+'.png" /> '+msg.username+': <span style="color:'+msg.farbe+'; font-weight:'+msg.weight+'; font-style:'+msg.style+'">'+msg.message+'</span>'));
									var mitdemda = msg.username;
										jQuery('#iArt_privChat_'+mitdemda.replace(/ /g, '_').replace(/[^a-z0-9A-Z_]/g, '-')).find('.messages').append(jQuery('<div>').addClass('iArtChatMessageItem').html('('+msg.zeitpunkt+') <img src="http://radio-emergency.de/img/user_'+msg.sex+'_'+msg.istEinAdmin+'.png" /> '+iArt_ChangeMarkup(msg.username, false)+': <span style="color:'+msg.farbe+'; font-weight:'+msg.weight+'; font-style:'+msg.style+'">'+iArt_ChangeMarkup(msg.message, true)+'</span>'));
										jQuery('#iArt_privChat_'+msg.fuerden.replace(/ /g, '_').replace(/[^a-z0-9A-Z_]/g, '-')).find('.messages').append(jQuery('<div>').addClass('iArtChatMessageItem').html('('+msg.zeitpunkt+') <img src="http://radio-emergency.de/img/user_'+msg.sex+'_'+msg.istEinAdmin+'.png" /> '+iArt_ChangeMarkup(msg.username, false)+': <span style="color:'+msg.farbe+'; font-weight:'+msg.weight+'; font-style:'+msg.style+'">'+iArt_ChangeMarkup(msg.message, true)+'</span>'));
						jQuery('#iArt_privChat_'+data.benutzer.replace(/ /g, '_').replace(/[^a-z0-9A-Z_]/g, '-')).find('.messages').append(jQuery('<div>').addClass('iArtChatMessageItem').html('('+data.zeitpunkt+') CHATSYSTEM: <span style="color:#f00; font-weight:bold;">--> Nachricht nicht übermittelt da "'+data.benutzer+'" nicht mehr online ist! <--</span><br /> --> '+data.message+' <--'));
				    		jQuery('#messages').append(jQuery('<div>').addClass('iArtChatMessageItem').addClass('reChatInfo').html('('+data.zeitpunkt+') '+data.username+' hat den Chat betreten'));
							jQuery('#messages').append(jQuery('<div>').addClass('iArtChatMessageItem').addClass('reChatInfo').html('('+data.zeitpunkt+') '+data.username+' hat den Chat verlassen'));
Fixed code: 							jQuery('#messages').append(jQuery('<div>').addClass('iArtChatMessageItem').addClass('reChatInfo').html('('+data.zeitpunkt+') Willkommen '+iArt_ChangeMarkup(data.username, false)+' im Radio-Emergency.de Chat'));
							jQuery('#messages').append(jQuery('<div>').addClass('iArtChatMessageItem').addClass('reChatInfo').html('('+data.zeitpunkt+') Willkommen '+iArt_ChangeMarkup(data.username,false)+' im Radio-Emergency.de Chat'));
					    alert('Der Benutzername "'+iArt_ChangeMarkup(data.username, false)+'" ist bereits in Verwendung');
					    alert('Der Benutzername "'+iArt_ChangeMarkup(data.username, false)+'" ist ein geschützter Name des RE-Teams');
		        			jQuery('#messages').append(jQuery('<div>').addClass('iArtChatMessageItem').html('('+msg.zeitpunkt+') <img src="http://radio-emergency.de/img/user_'+msg.sex+'_'+msg.istEinAdmin+'.png" /> '+iArt_ChangeMarkup(msg.username, false)+': <span style="color:'+iArt_ChangeMarkup(msg.farbe, false)+'; font-weight:'+iArt_ChangeMarkup(msg.weight, false)+'; font-style:'+iArt_ChangeMarkup(msg.style, false)+'">'+iArt_ChangeMarkup(msg.message, false)+'</span>'));
									var mitdemda = iArt_ChangeMarkup(msg.username, false);
										jQuery('#iArt_privChat_'+mitdemda.replace(/ /g, '_').replace(/[^a-z0-9A-Z_]/g, '-')).find('.messages').append(jQuery('<div>').addClass('iArtChatMessageItem').html('('+msg.zeitpunkt+') <img src="http://radio-emergency.de/img/user_'+iArt_ChangeMarkup(msg.sex, false)+'_'+iArt_ChangeMarkup(msg.istEinAdmin, false)+'.png" /> '+iArt_ChangeMarkup(msg.username, false)+': <span style="color:'+iArt_ChangeMarkup(msg.farbe, false)+'; font-weight:'+iArt_ChangeMarkup(msg.weight, false)+'; font-style:'+iArt_ChangeMarkup(msg.style, false)+'">'+iArt_ChangeMarkup(msg.message, true)+'</span>'));
										jQuery('#iArt_privChat_'+msg.fuerden.replace(/ /g, '_').replace(/[^a-z0-9A-Z_]/g, '-')).find('.messages').append(jQuery('<div>').addClass('iArtChatMessageItem').html('('+msg.zeitpunkt+') <img src="http://radio-emergency.de/img/user_'+iArt_ChangeMarkup(msg.sex, false)+'_'+iArt_ChangeMarkup(msg.istEinAdmin, false)+'.png" /> '+iArt_ChangeMarkup(msg.username, false)+': <span style="color:'+iArt_ChangeMarkup(msg.farbe, false)+'; font-weight:'+iArt_ChangeMarkup(msg.weight, false)+'; font-style:'+iArt_ChangeMarkup(msg.style, false)+'">'+iArt_ChangeMarkup(msg.message, true)+'</span>'));
						jQuery('#iArt_privChat_'+data.benutzer.replace(/ /g, '_').replace(/[^a-z0-9A-Z_]/g, '-')).find('.messages').append(jQuery('<div>').addClass('iArtChatMessageItem').html('('+data.zeitpunkt+') CHATSYSTEM: <span style="color:#f00; font-weight:bold;">--> Nachricht nicht übermittelt da "'+iArt_ChangeMarkup(data.benutzer, false)+'" nicht mehr online ist! <--</span><br /> --> '+iArt_ChangeMarkup(data.message, false)+' <--'));
				    		jQuery('#messages').append(jQuery('<div>').addClass('iArtChatMessageItem').addClass('reChatInfo').html('('+data.zeitpunkt+') '+iArt_ChangeMarkup(data.username, false)+' hat den Chat betreten'));
							jQuery('#messages').append(jQuery('<div>').addClass('iArtChatMessageItem').addClass('reChatInfo').html('('+data.zeitpunkt+') '+iArt_ChangeMarkup(data.username, false)+' hat den Chat verlassen'));