php- ¿mi código está lo suficientemente seguro como para protegerlo de la ejecución remota de comandos al usar shell_exec ()?

0

Estoy usando la función shell_exec en las siguientes variables para ejecutar comandos en el shell:

  1. fname (solo caracteres)
  2. fpack (solo caracteres)
  3. email (una dirección de correo electrónico válida)

Mi código es:

<?php

require_once 'connectionToDB.php';

$fname = mysqli_real_escape_string($dbc, filter_var(escapeshellarg($_POST['fname']), FILTER_SANITIZE_STRING));
$fpack = mysqli_real_escape_string($dbc, filter_var(escapeshellarg($_POST['fpack']), FILTER_SANITIZE_STRING));
$email = mysqli_real_escape_string($dbc, filter_var(escapeshellarg($_POST['email']), FILTER_SANITIZE_EMAIL));

/** Verify name of applicaion **/
if(!ctype($fname)) {
    $op = json_encode(array('type' => 'error', 'msg' => 'Application name must be in english alphabetical letters only'));
    die($op);
}
if(strlen($fname)>20) {
    $op = json_encode(array('type' => 'error', 'msg' => 'Application name must be less than 20 characters'));
    die($op);
}

/** Verify name of package **/
if(!ctype($fpack)) {
    $op = json_encode(array('type' => 'error', 'msg' => 'Package name must be in english alphabetical letters only'));
    die($op);
}
if(strlen($fpack)>20) {
    $op = json_encode(array('type' => 'error', 'msg' => 'Package name must be less than 20 characters'));
    die($op);
}

/** Verify user's email **/
if (strlen($email)>50) {
    $op = json_encode(array('type' => 'error', 'msg' => 'Email must be of less than 50 characters'));
    die($op);
}

if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
    $op = json_encode(array('type' => 'error', 'msg' => 'Please provide a valid email address.'));
    die($op);
}

Como dije, estoy usando shell_exec en estas variables, tengo miedo de la ejecución remota de comandos. ¿Es mi código lo suficientemente seguro para prevenir RCE?

    
pregunta Ashish 25.02.2015 - 16:36
fuente

1 respuesta

6

No, esto no es seguro .

La mayoría del código ni siquiera tiene sentido. Parece que simplemente has lanzado todas las funciones que conoces a las variables con la esperanza de que esto ayude de alguna manera. Ese es un enfoque muy pobre. No solo no funciona; en realidad introduce errores y puede llevar a problemas graves.

Ni MySQL-escaping ni HTML-filtering (a través de FILTER_SANITIZE_STRING ) tienen nada que ver con el shell. SQL, HTML y el lenguaje utilizado por su shell son tres contextos completamente diferentes y requieren procedimientos de seguridad completamente diferentes. No puedes combinarlos al azar. Por ejemplo, mysqli_real_escape_string() interrumpirá la cotización de escapeshellarg() y, de hecho, puede permitir al usuario manipular el comando de shell.

También tenga en cuenta que la mayoría de las funciones que está utilizando son destructivas , lo que significa que cambian silenciosamente los datos ingresados por el usuario. Esta es una muy mala idea, ya que puede terminar ejecutando comandos que el usuario nunca quiso que ejecutara. Acepte o rechace la entrada del usuario, pero no la reemplace en silencio con otra cosa.

Entonces necesitarás un enfoque muy diferente:

  • Valide la entrada sin formato del usuario . Si no es aceptable, deténgase y lance un error.
  • Luego prepare la entrada para el contexto específico para el que desea usarla. En el caso de los argumentos de shell, solo use escapeshellarg() para escapar correctamente de la entrada de los contextos de shell.
respondido por el Fleche 25.02.2015 - 18:26
fuente

Lea otras preguntas en las etiquetas