Foro de elhacker.net

Programación => PHP => Mensaje iniciado por: Juanpi123321 en 6 Junio 2018, 01:08 am



Título: Codigo PHP vulnerable
Publicado por: Juanpi123321 en 6 Junio 2018, 01:08 am
hola que tal quisiera saber que esta mal en el siguiente codigo, osea cuales serian las debilidades, referidas al tema de la seguridad y un poco sobre el tema SQL Injection.
Le puse puntos xq no me deja identar correctamente.



Codigo PHP vulnerable

Código
  1. <?
  2. $mysqli = new mysqli('localhost','root', ,'seguridad');
  3. if($mysqli->connect_errno){
  4.    echo 'error db';
  5. }
  6.  
  7. $id=$_GET['id'];
  8. if(isset($id) && !empty($id)){
  9.  
  10.    $sql = "SELECT text,title FROM news where id=" $id;
  11.    #echo $sql;
  12.  
  13.    $q = $mysqli->query($sql) or mysql_error();
  14.    $row = $q->fetch_assoc();
  15.  
  16.    if(isset($row['title'])){
  17.        echo 'Titulo: '  $row['title'];
  18.        echo "<br>";
  19.        echo 'Texto: ' $row['text'];
  20.        echo "<br>";
  21.    }
  22.  
  23. }
  24. else{
  25.    echo 'pase algun valor en la variable id';
  26. }
  27.  
  28. ?>


· Los códigos deben ir en etiquetas GeSHi
>aquí las reglas del foro (http://foro.elhacker.net/reglas.htm)
-Engel Lex


Título: Re: Codigo PHP vulnerable
Publicado por: engel lex en 6 Junio 2018, 01:17 am
Código:
$id=$_GET['id'];
$sql = "SELECT text,title FROM news where id=".$id;

allí se puede filtrar una peticion (y ese codigo tiene errores)

estudia sobre sql injection pero podría pasar solo viendolo sin mucho detalle

Código:
url,com/id?1' or '1'='1

esto hará que los datos detornados sean de todos los id... es el clasico codigo de principios de los 2000 para mostrar como una pagina era vulnerable


Título: Re: Codigo PHP vulnerable
Publicado por: LaThortilla (Effort) en 23 Agosto 2018, 00:24 am
Código:
$id=$_GET['id'];
$sql = "SELECT text,title FROM news where id=".$id;

allí se puede filtrar una peticion (y ese codigo tiene errores)

estudia sobre sql injection pero podría pasar solo viendolo sin mucho detalle

Código:
url,com/id?1' or '1'='1

esto hará que los datos detornados sean de todos los id... es el clasico codigo de principios de los 2000 para mostrar como una pagina era vulnerable

Exactamente por eso debes utilizar http://php.net/manual/es/mysqli.real-escape-string.php (http://php.net/manual/es/mysqli.real-escape-string.php)


Título: Re: Codigo PHP vulnerable
Publicado por: #!drvy en 23 Agosto 2018, 01:40 am
- Aprende a utilizar sentencias preparadas.
- Intenta tener un control (más o menos) sobre los datos que manejas. Si usas el ID únicamente como un integro, asegúrate que es un integro.
- Usar isset y empty viene a ser algo así como comprobar que tienes las llaves en el bolsillo y sacarlas del bolsillo para comprobar que las tienes... a la vez.
- Aprende a utilizar Try/Catch en vez de usar el "OR ELSE".

Código
  1. <?php
  2.  
  3. mysqli_report(MYSQLI_REPORT_STRICT | MYSQLI_REPORT_ALL);
  4. $mysqli = new mysqli('localhost', 'root', 'contraseña','seguridad');
  5.  
  6. if($mysqli->connect_errno){
  7.    die('error db');
  8. }
  9.  
  10.  
  11. if(!empty($_GET['id'])){
  12.  
  13.    // con (int) te aseguras que manejas un integro.
  14.    $id = (int) $_GET['id'];
  15.  
  16.    // sentencia preparada
  17.    $query = "SELECT text,title FROM news where id=?";
  18.  
  19.    try {
  20.  
  21.        $stmt = $mysqli->prepare($query);
  22.        $stmt->bind_param('i', $id); // i de integer.
  23.        $stmt->execute();
  24.        $result = $stmt->get_result();
  25.        $stmt->close();
  26.  
  27.  
  28.        // Si la consulta devuelve 1 o más resultados...
  29.        // recogemos el resultado.
  30.  
  31.        if($result->num_rows > 0){
  32.            $result = $result->fetch_assoc();
  33.        } else {
  34.            $result = false;
  35.        }
  36.  
  37.    // Si hay error en la consulta...
  38.    } catch(Exception $e){
  39.        die('Error con la consulta -> '. $e->getMessage());
  40.    }
  41.  
  42.  
  43.    // Resultado.
  44.    if($result){
  45.        print_r($result);
  46.    } else {
  47.        echo 'No hay resultados.';
  48.    }
  49.  
  50. } else {
  51.    echo 'Haga una consulta al ID.';
  52. }
  53.  


Referencias:
http://php.net/manual/es/mysqli.prepare.php
http://php.net/manual/es/language.types.integer.php (#Conversión de numeros a enteros).
http://php.net/manual/en/mysqli-stmt.bind-param.php
http://php.net/manual/es/mysqli-stmt.get-result.php
http://php.net/manual/es/class.exception.php

Saludos