Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • World
  • Users
  • Groups
Skins
  • Light
  • Brite
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Dark
  • Cyborg
  • Darkly
  • Quartz
  • Slate
  • Solar
  • Superhero
  • Vapor

  • Default (No Skin)
  • No Skin
Collapse

NodeBB

  1. Home
  2. Programmation
  3. Développement web
  4. PHP
  5. Failles de sécurité les plus fréquentes en relation directe/indirecte php

Failles de sécurité les plus fréquentes en relation directe/indirecte php

Scheduled Pinned Locked Moved PHP
3 Posts 3 Posters 5.7k Views
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • mars073M
    mars073M
    mars073
    wrote on last edited by
    #1

    <p>Bonjour à tous,</p><p>Aujourd'hui je fais essayer de faire un truc plus sérieux, les failles les plus courantes (sql, xss, csrf et exploit cookie).</p><p> </p><p>Les failles SQL, c'est le fait que le client peut modifier une requête sql sur vote site, ses failles peuvent permettent de modifier, afficher, supprimer toutes les tables voir la base de donnée.</p><p>Contexte: J'affiche mes news avec une variable ?page dans l'url</p><p></p><pre class="ipsCode prettyprint lang-auto"><?php
    $query = mysql_query("SELECT * FROM news LIMIT ".$GET['page'].",10");
    ?>
    </pre>normalement l'url va ressemble à: <a href="http://mars073.be/faille.php?page=2" rel="external nofollow">http://mars073.be/faille.php?page=2</a> .<p>mais si quelqu'un écrit : <a href="http://mars073.be/faille.php?page=2;TRUNCATE `news`#" rel="external nofollow">http://mars073.be/faille.php?page=2;TRUNCATE `news`#</a></p><p>bah... vous perdez toutes vos news, la requête sera double:</p><p></p><pre class="ipsCode prettyprint lang-auto">SELECT * FROM news LIMIT 2;
    TRUNCATE news;
    #,10
    </pre>il existe des programmes pour exploiter plus facilement les failles ils permettent aussi de lister les autres tables .
    .<p></p><p>solution:</p><p>1 - vérifier que la variable est un chiffre (numérique);</p><p></p><pre class="ipsCode prettyprint lang-auto"><?php
    $page = 0;
    if (isset($_GET['page'])&&is_numeric($_GET['page'])) $page = $_GET['page'];
    $query = mysql_query("SELECT * FROM news LIMIT $page,10");
    ?>
    </pre>étrangement cette erreur est très fréquente encore... mais bon parfois y a un pare-feu derrière et c'est pas marrant 😞 <p></p><p>2-dans le cadre où il s'agit d'un texte faites appel à la fonction: addslashes(). Exemple: $titre = addslashes($_GET['titre']);</p><p></p><p>3-Simplement coder en pdo mais ça peut-être dérangeant quand vous n'avez pas codé le site et que vous devez donc tout refaire...</p><p></p><p>Les failles xss, aussi très courantes c'est une faille qui permet au client d'afficher du code html ou javascript, ce qui permet de faire des forkbomb, redirections, voler les logins, etc.</p><p></p><p>Contexte: je débute et j'ai fais une chatbox avec une faille xss:</p><p></p><pre class="ipsCode prettyprint lang-auto"><?php
    $query = $cxn->query("SELECT * FROM chat");
    $query->execute();
    while ($msg = $query->fetch()) {
    echo $msg['user']." a dit:".$msg['content'];
    }
    ?>
    </pre>maintenant Jean-Kevin envoie le message suivant:<p></p><pre class="ipsCode prettyprint lang-auto"><meta http-equiv="refresh" content="0;url=http://JeanKevdu06.free.fr/">
    </pre>ce qui aura pour effet de rediriger une fois la page charger sur un autre site.<p></p><p>pour pallier à ce problème il suffit de faire appel à une fonction: <a href="http://be2.php.net/manual/fr/function.htmlspecialchars.php" rel="external nofollow">htmlspecialchars()</a>, il existe d'autre fonction avec plus où moins le même effet, c'est à dire convertir le code en caractère lisible.</p><p>exemple avec le code au dessus:</p><p></p><pre class="ipsCode prettyprint lang-auto"><?php
    $query = $cxn->query("SELECT * FROM chat");
    $query->execute();
    while ($msg = $query->fetch()) {
    $msg['content'] = htmlspecialchars($msg['content']);
    // Dans le contexte le nom d'utilisateur ne peut pas comporter de caractères spéciaux.
    echo $msg['user']." a dit:".$msg['content'];
    }
    ?>
    </pre>je considère les failles "include" comme des failles xss mais si c'est pas totalement vrai, je suppose que vous connaissez tous la fonction <a href="http://be2.php.net/manual/fr/function.include.php" rel="external nofollow">include()</a>, vu que c'est la base du php... Bref beaucoup de site utile utilise une variable $_GET (ex: $_GET['p']) et donc il font un code du genre:<p></p><pre class="ipsCode prettyprint lang-auto"><?php
    if (isset($_GET['p'])&&is_file($_GET['p'])) include("pages/".$GET['p'].".php");
    ?>
    </pre>mais bon une fois de plus si le méchant utilisateur change l'url: en ?p=../includes/config bah... ça inclue le fichier config .
    .<p>il y a beaucoup de façon différente pour résoudre cette faille mais dans le contexte ej vais utiliser le switch()</p><p></p><pre class="ipsCode prettyprint lang-auto"><?php
    if (isset($_GET['p'])) { //on test si la page est spécifiée
    switch (strtolower($_GET['p'])) { // test la valeur de la variable en minuscule pour avoir plus facile
    case 'home':
    include("pages/home.php"); //l'acccueil
    break;
    case 'contact':
    include("pages/contact.php");
    break;
    case 'machin':
    include("pages/machin.php"); // machin
    break;
    default:
    include("pages/404.php"); //page d'erreur
    }
    } else {
    include("pages/home.php"); //si aucune page spécifiée on met l'accueil
    }
    ?>
    </pre>Les failles csrf, déjà plus rare, ça consiste dans le faire exécuter par le biais d'une image comme une signature sur un forum, je vais prendre pour exemple un forum.<p>Contexte: Je fais une signature qui va vous déconnecter automatiquement quand vous l'afficherait:</p><p></p><pre class="ipsCode prettyprint lang-auto">je mets le lien pour se déconnecter comme le lien d'une image.
    [img=http://forum.mars073.be/deconnect.php]
    </pre>Dans ce cas ci il faut utiliser un token, c'est une variable qui va contenir une suite aléatoire.<p>Exemple dans votre script de connexion vous allez surement utiliser des variables $_SESSION, donc il suffit d'ajouter dans votre script de connexion:</p><p></p><pre class="ipsCode prettyprint lang-auto"><?php
    // ...
    $_SESSION['token'] = dechex(rand(0, 999999))."-".dechex(rand(0, 999999));
    ?>
    </pre>votre bouton déconnexion:<p></p><pre class="ipsCode prettyprint lang-auto"><a href="deconnect.php?t=<?=$_SESSION['token']?>">Déconnexion</a>
    </pre>et le script deconnect.php:<p></p><pre class="ipsCode prettyprint lang-auto"><?php
    session_start();
    if (isset($_GET['t'])&&$_GET['t']==$_SESSION['token']) {
    session_unset();
    session_destroy();
    echo "Vous avez bien été déconnecté";
    } else {
    echo "La requête est incorrect";
    }
    ?>
    </pre>Le forum Melinyel a un système similaire mais en plus n'autorise que certaines extensions mais le systèmes d'extension ne sert à rien vu qu'il peut être trompé avec le ".htaccess".<p></p><p>Nous arrivons donc au dernier type de faille les voles de cookies, miam miam...</p><p>Contexte: mon script php camouflé en "cookie.png" doit voler le cookie du nom de "autolog" qui permet que le compte se connecter automatiquement.</p><p>/!\Rappel: le cookie est stocké du coté client il y a un risque de modification, donc cryptait le un maximum pour pas qu'il puisse détourner sa connexion sur un autre compte, comme pour les variables caché html ou js.</p><p></p><p>donc nous allons créer votre cookie avec une protection correcte:</p><p></p><pre class="ipsCode prettyprint lang-auto">$crypt = $user['id']."|".md5(sha1($user['name']).$user['haspass']);
    setcookie( "autolog", $crypt, time()+606024*31, "./marsLogin", "mars073.be", false, true);
    </pre>donc $crypt dans mon exemple est composé de l'id de l'utilisateur et le cumule crypté du nom d’utilisateur crypté et de son mot de passe crypté, même crypté normalement on ne met pas le mot de passe dans le cookie je dis bien normalement.<p>paramètres de mon cookie:</p><p>1 - Son nom: "autolog"</p><p>2 - sa valeur: $crypt</p><p>3 - sa date d'expiration en seconde: 31jours après création</p><p>4 - dossier ou je vais le ranger</p><p>5 - le seul site (domaine) qui a le droit d'y accéder: "mars073.be"</p><p>6 - si le cookie ne peut être utilisé que par des site en https:// : non (si votre site à le https:// mettez "true" si vous voulez)</p><p>7 - Interdit la modification du cookie par du javascript par exemple (ne fonctionne pas tout le temps).</p><p></p><p>mais comment faire maintenant pour vérifier l'utilisateur?</p><p>Comme ça:</p><p></p><pre class="ipsCode prettyprint lang-auto"><?php
    if (isset($_COOKIE['autolog'])) {
    $data = explode("|", $_COOKIE['autolog']; // On sépare l'id du reste
    if (isset($data[1])&&is_numeric($data[0])) { // On vérifie la structure du cookie
    $query = $db->query("SELECT * FROM user WHERE id = ".$data[0]." LIMIT 1");
    $query->execute();
    $user = $query->fetch();
    if ($data[1] == md5(sha1($user['name']).$user['haspass'])) {
    $_SESSION['login'] = $user;
    echo "Connexion réussite";
    } else {
    echo "cookie incorrect";
    }
    } else {
    echo "Cookie corrumpue";
    }
    }
    ?>
    </pre>Je pense avoir fait le tour des trucs les plus courant en php...<p></p><p>ps: exemple d'image en php qui passe à travers le filtre du forum avec un simple dossier, quand vous actualisez elle change:</p><p><img alt="mel.png" src="http://mars073.zz.mu/demo/mel.png"/></p><p>Bonne programmation à tous!</p><p>Cordialement,</p><p>Mars073</p>

    Aide à l'apprentissage et la réalisation pour des graphismes, des programmes, des sites ou autres.Signature aléatoire, proposez vous aussi une signature ici!

    1 Reply Last reply
    4
    • SoulalexS
      SoulalexS
      Soulalex
      wrote on last edited by
      #2

      <p>C'est vrai que je n'en aie pas parlé dans mon guide mais il faut toujours se méfier des données reçues 😉 </p>
      <p>Merci mars073 pour ce tutoriel 🙂 </p>

      Soulalex, Administrateur de Melinyel+ E-Mail : [email protected]+ GitHub : https://github.com/Soualex

      1 Reply Last reply
      0
      • AzadA
        AzadA
        Azad
        wrote on last edited by
        #3

        <p>Très bon tutoriel, assez sympa les explications suivies des exemples. Bien joué. Comme d'habitude, quoi. 🙂 <br/>
        +1 Rep.</p>

        Administrateur du forum.
        Contactez-moi par message privé ou par mail.

        1 Reply Last reply
        0

        Hello! It looks like you're interested in this conversation, but you don't have an account yet.

        Getting fed up of having to scroll through the same posts each visit? When you register for an account, you'll always come back to exactly where you were before, and choose to be notified of new replies (either via email, or push notification). You'll also be able to save bookmarks and upvote posts to show your appreciation to other community members.

        With your input, this post could be even better 💗

        Register Login
        Reply
        • Reply as topic
        Log in to reply
        • Oldest to Newest
        • Newest to Oldest
        • Most Votes


        • Login

        • Login or register to search.
        Powered by NodeBB Contributors
        • First post
          Last post
        0
        • Categories
        • Recent
        • Tags
        • Popular
        • World
        • Users
        • Groups