CVE-2015-10006 (PHP, published 2023-01-01T17:15Z)
Description: value: A vulnerability, which was classified as problematic, has been found in admont28 Ingnovarq. Affected by this issue is some unknown functionality of the file app/controller/insertarSliderAjax.php. The manipulation of the argument imagetitle leads to cross site scripting. The attack may be launched remotely. The name of the patch is 9d18a39944d79dfedacd754a742df38f99d3c0e2. It is recommended to apply a patch to fix this issue. The identifier of this vulnerability is VDB-217172.
Severity: nan (CVSS v3 base score: 6.1)
Weakness: CWE-79 \u2014 Improper Neutralization of Input During Web Page Generation ('Cross-site Scripting')
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.
Repository: https://github.com/admont28/ingnovarq
Files changed:
app/controller/clientModel.php
app/controller/eliminarClienteAjax.php
app/controller/imagenModel.php
app/controller/insertarClienteAjax.php
app/controller/insertarSliderAjax.php
app/controller/notificaciones.php
app/view/agregarCliente.php
app/view/agregarImagenSlider.php
app/view/listarClientes.php
app/view/nav.php
app/view/perfil.php
js/botones.js
Commit message: - Cliente, Slider, Imagen, Nav, Botones

- Cliente: se añade la funcionalidad de agregar y eliminar clientes por
medio de peticiones ajax.

- Slider: se elimina código innecesario relacionado con agregar imagen
slider, se evita ataques XSS en el titulo de la imagen del slider.

- Nav: se elimina código innecesario.

- Botones: se añaden acciones para el botón de agregar cliente, agregar
slider.


Vulnerable code:
                $mensaje =  get_success_delete_client($idCliente); // envio el mensaje alojado en notificaciones
		 * Función para insertar imagenes de un proyecto
		 * Función para insertar imagenes de un proyecto
		function insert_images($ruta, $titulo, $idCliente){
			$sentencia->bindParam(':tituloImagen', $titulo);
			$sentencia->bindParam(':idProyecto', $idCliente);
			$sentencia->execute();
			$response = array();
			while ($fila = $sentencia->fetch()) {
				$response[] = $fila;
			}
			return $response;
			require_once "../controller/sliderModel.php";

			$sliderModel = new sliderModel();
								getNavAdmin();
								//$direccion = "../controlador/cargarImagenesProductos?idproducto=".$_GET['idproducto'];
								      		 <input type="hidden" name="idImagen" id="idImagen" readonly="readonly">
										            <p id="nota" class="col-xs-12 text-info">Nota: Si no selecciona ninguna imagen y guarda los cambios, se conservará la imagen actual.
										            </p>
													<a href="#sinAccion" onclick="eliminarCliente(<?php echo $fila['idCliente'] ?>, '<?php echo $fila['nombreCliente'] ?>');">
					<a href="../controller/logout" id="<?php if(strstr($_SERVER['REQUEST_URI'], 'agregarCliente')){
						echo 'seleccionado';
					}?>">Cerrar Sesión</a>
					<a href="../controller/logout" id="<?php if(strstr($_SERVER['REQUEST_URI'], 'agregarCliente')){
						echo 'seleccionado';
					}?>">Cerrar Sesión</a>
									<a href="inicio">

Fixed code:

		/*
		 * Función para obtener el ultimo cliente insertado
		 */
		function view_db_last_client(){

			$sentencia = $this->_db->prepare("SELECT * FROM Cliente ORDER BY idCliente DESC LIMIT 1");
			$sentencia->execute();

			$response = array();
			while ($fila = $sentencia->fetch()) {
				$response[] = $fila;
			}
			if(sizeof($response) != 0)
				return $cliente = $response[0];
			return null;
		}
                $mensaje =  get_success_delete_client($existente['nombreCliente']); // envio el mensaje alojado en notificaciones
		 * Función para insertar imagenes de un servicio
		 * Función para insertar imagenes de un cliente
		function insert_image_client($ruta, $titulo, $idCliente){
			$sentencia->bindParam(':titulo', $titulo);
			$sentencia->bindParam(':idCliente', $idCliente);
			return $sentencia->execute();
<?php 
    session_start();
    if(!isset($_SESSION['idUsuario'],$_SESSION['nombreUsuario'], $_SESSION['apellidoUsuario'], $_SESSION['superAdminUsuario'])){
            header('location: error');
    }
    require_once ("notificaciones.php");
    $mensaje = get_error_insert_client();
    print_r($_POST);
    print_r($_FILES);
    if(sizeof($_POST) == 1 && isset($_POST['nombreCliente'], $_FILES['myfile'])){
        
        $directorioDeGuardado = "../../images/clientes/";
        $nombreArchivo = $_FILES['myfile']['name'];
        $fullPath = $directorioDeGuardado.$nombreArchivo; // construyo la ruta completa donde se guardará el archivo.
        if (! file_exists($fullPath)){ //verifico que no exista la imagen anterior
            require_once ("clientModel.php");
            require_once ("userModel.php");
            $clientModel = new ClientModel();
            $userModel = new UserModel();
            $usuario = $userModel->view_db_user($_SESSION['idUsuario']);
            $nombreCliente = htmlspecialchars($_POST['nombreCliente'], ENT_NOQUOTES); //evito ataques XSS
            $resultado = $clientModel->insert_db_client($nombreCliente, $usuario['idUsuario']);
            if($resultado){
                $ultimoCliente = $clientModel->view_db_last_client();
                print_r($ultimoCliente);
                if($ultimoCliente != null){

                    require_once ("imagenModel.php");
                    $imagenModel = new ImagenModel();
                    $resultado = $imagenModel->insert_image_client($fullPath, $nombreCliente, $ultimoCliente['idCliente']);
                    if($resultado){
                        move_uploaded_file($_FILES["myfile"]["tmp_name"], $fullPath); //muevo el archivo cargado
                        $mensaje = get_success_insert_client($nombreCliente); // obtengo el mensaje de que todo ha salido bien.
                    }
                }
                else
                    print("ultimoCliente null");
            }
        }
    }
echo $mensaje; 
?>
            $tituloImagen = htmlspecialchars($tituloImagen, ENT_NOQUOTES); //evito ataques XSS
    function get_success_insert_client($nombreCliente){
       $mensaje = "<script type='text/javascript'>
                        $(function(){
                            new PNotify({
                                title: 'Acción Exitosa',
                                text: 'El cliente: ".$nombreCliente." ha sido agregado con éxito.<br>Si desea agregar un nuev cliente presione el botón Agregar.',
                                type: 'success',
                                animation: 'show',
                                confirm: {
                                    confirm: true,
                                    buttons: [{
                                            text: 'Agregar',
                                            addClass: 'btn btn-success',
                                            click: function(notice) {
                                                notice.remove();
                                                document.location='agregarCliente';
                                            }
                                        }, {
                                            text: 'Volver',
                                            click: function(notice) {
                                                notice.remove();
                                                document.location='perfil';
                                            }
                                        }]
                                }   
                            });
                        });
                    </script>";
        return $mensaje;
    }

    function get_error_insert_client(){
        $mensaje = "<script type='text/javascript'>
                        $(function(){
                            new PNotify({
                                title: 'Acción No Exitosa :(',
                                text: 'No se ha podido agregar el cliente con éxito, por favor revisa todos los datos e inténtelo de nuevo.',
                                type: 'error',
                                delay: 6000,
                                animation: 'show',
                            });
                        });
                        
                    </script>";
        return $mensaje;
    }

<?php 
	session_start();
	if(!isset($_SESSION['idUsuario'],$_SESSION['nombreUsuario'], $_SESSION['apellidoUsuario'], $_SESSION['superAdminUsuario'])){
		header('location: error');
	}
			include_once ("imports.php");
			include_once ("header.php");
			include_once ("nav.php");
			include_once ("footer.php"); 
			getImportsUp();
			?>
			<body id="body">
				<div class="con" id="con">
					<div class="container" id="main">
							<?php 
								getHeader();
								if($_SESSION['superAdminUsuario'] == 1){
									getNavSuperAdmin();
								}
								else
								getNavAdmin();
							?>
					</div>
					<div class="contenido">
						<div class="row">
							<br>
							<div class="col-xs-12 col-sm-8 col-sm-offset-2 col-md-8 col-md-offset-2">
								<div class="panel panel-default empresa">
									<div class="panel-heading">
										Crear cliente
									</div>
									<div class="panel-body">
										<div id="mensaje"></div>
										<h2 style="color: #019831; text-align: center;">Formulario para agregar un nuevo cliente de Ingnovarq S.A.S</h2>
										<br>								
										<div class="form-horizontal">
										     <div class="form-group">
										         <label for="name" class="control-label col-xs-2">Nombre:</label>
										         <div class="col-xs-10">
										            <input type="name" id="nombreCliente" name="nombreCliente" class="form-control" placeholder="Nombre">
										         </div>
										     </div>
										     <div class="form-group">
										     	 <label class="control-label col-xs-2">Imagen:</label>
										         <div class="col-xs-10" id="cargador">
										            <div id="fileuploader">Cargar imagen</div>
										         </div>
										     </div>    
										     <div class="form-group">
										        <div class="col-xs-offset-2 col-xs-8">
										            <div id="btn-agregar-cliente-ajax" class="btn btn-success">
										            	<span class="glyphicon glyphicon-ok" aria-hidden="true"></span> Crear nuevo cliente</div> 
										        </div>
										     </div>
										</div>
									</div>
								</div>
							</div>
						</div>
					</div>
				</div>
				<?php
					getFooter(); 
					getImportsDown();
?>
									getNavAdmin();
													<a href="#sinAccion" onclick="eliminarCliente(<?php echo $fila['idCliente'] ?>, '<?php echo htmlspecialchars($fila['nombreCliente'], ENT_NOQUOTES); ?>');">
					<a href="../controller/logout">Cerrar Sesión</a>
					<a href="../controller/logout">Cerrar Sesión</a>
									<a href="agregarCliente">
        alert("Actualicé plugin slider");
    } else if($('#btn-agregar-cliente-ajax').length){ 
        // Si existe este botón, el usuario estará agregando un cliente
        // Ejecutar si existe el elemento
        uploadObj.update({
            url: "../controller/insertarClienteAjax",
            maxFileSize: 2097152, // 2MB escritos en bytes
            dynamicFormData:function()
            {
                var nombre =  $("#nombreCliente").val(); //capturo el nombre del cliente cargado en el input.
                // los datos que se van a enviar
                var data = {
                  nombreCliente: nombre //nombre del cliente
                };
                return data;
            }
        });
        alert("Actualicé plugin cliente");

    

    // al dar clic en agregar cliente ajax ejecuto el plugin uploadFile.
    $('#btn-agregar-cliente-ajax').click(function(){
        uploadObj.startUpload();
    });