axel584 / ikurso

kurso de esperanto
20 stars 7 forks source link

Injection Sql #968

Open ghost opened 4 years ago

ghost commented 4 years ago

Saluton !

Suite de l'issue #931. Le commit https://github.com/axel584/ikurso/commit/8fc6fe9340ac1c1f53a95407f89e2c70da921533 prévient l'utilisation des caractères spéciaux (à l'affichage, donc XSS) mais n'empêche pas d'essayer des requêtes Sql.

Par exemple, prenons l'url https://ikurso.esperanto-france.org/fr/cge/lec08.php?section=5. Il est toujours possible de demander la section 500 : https://ikurso.esperanto-france.org/fr/cge/lec08.php?section=500.

De la même manière, il est possible d’exécuter n'importe quelles requêtes ou commandes Sql. Par exemple: https://ikurso.esperanto-france.org/fr/cge/lec08.php?section=SLEEP(30).

Je viens de fouiller dans le code (j'apprends le php, c'était passionnant de mener ma petite enquête :smiley:) et voici le problème :

Dans les fonctions getTitoloLecionero, displayWarningSiLecioneroManquante, getBoutonFinSection, getLecioneroAntauxa, getLecioneroVenonta, les requêtes sont faites avec des concaténations de la manière suivante:

$query = "REQUÊTE paramêtre =" . $paramêtre;
$result = $bdd->query($query);

Il est plutôt recommandé, dès qu'il y a une variable accessible aux utilisateurs, d'utiliser la forme suivante qui prévient les injections:

$query = $bdd->prepare("REQUÊTE paramêtre = ?");
$query->execute(array($paramêtre));

Également, même si c'est plutôt secondaire; il faudrait vérifier la valeur de la variable $section dans chaque fichier lec01.php, lec02.php, etc en plus de la vérification du type.

axel584 commented 4 years ago

Effectivement, veux tu faire un pull request pour corriger ce problème ?

Merci d'avance,

Axel

ghost commented 4 years ago

Je vais essayer mais, je ne peux rien promettre. Si je m'en sors avec l'installation d'Ikurso et avec le code, alors je ferai une pull request.

axel584 commented 4 years ago

L'installation d'ikurso est expliqué dans le readme, mais comme c'est quelque chose qui est très peu utilisé (on est une toute petite équipe avec 2 principaux développeurs et quelques personnes qui nous aident ponctuellement). Du coup, si tu as des soucis, n'hésite pas à me contacter (soit ici, soit par l'intermédiaire du formularie de contact sur le site). Cela permettra sans doute d'améliorer la documentation d'installation.

ghost commented 4 years ago

Saluton !

Je viens de m'occuper de l'installation. J'en ai profité pour détailler la procédure et les problèmes rencontrés. Ça permettra d'améliorer la documentation.

À noter que je suis sur une Debian 10 avec PHP 7.3.19 et MariaDB. MariaDB est totalement compatible avec MySQL (mêmes commandes/requêtes). Il faut adapter certaines commandes à son OS et à sa configuration, mais l'essentiel est là.

Base de données

Création d'un utilisateur ikurso et de la base de données ikurso_database :

CREATE USER 'ikurso'@'localhost' IDENTIFIED BY 'password';
CREATE DATABASE ikurso_database;
GRANT ALL ON ikurso_database.* TO 'ikurso'@'localhost';
FLUSH PRIVILEGES;
exit

Insertion dans la base de données:

mariadb -u ikurso -p ikurso_database < sql/create-database.sql
mariadb -u ikurso -p ikurso_database < sql/create-data.sql
mariadb -u ikurso -p ikurso_database < sql/create-data-test.sql

Apache : hôte virtuel ikurso.localhost

ln -s /chemin/absolu/vers/ikurso /var/www/
chown $USER:www-data /var/www/ikurso
cat > /etc/apache2/sites-available/ikurso.conf <<EOF 
<VirtualHost *:80>
    ServerName ikurso.localhost
    DocumentRoot "/var/www/ikurso"
    <Directory "/var/www/ikurso">
        Options +FollowSymLinks +Indexes
        AllowOverride all
        Require all granted
    </Directory>
    ErrorLog /var/log/apache2/error.ikurso.log
    CustomLog /var/log/apache2/access.ikurso.log combined
</VirtualHost>
EOF
a2ensite ikurso 
systemctl reload apache2

Config

À la racine, créer :


Problèmes


Edit: Retire les règles relatives à la sécurité d'Apache mises par réflexe. Hors-sujet.

axel584 commented 4 years ago

Merci beaucoup pour ta procédure d'installation, je l'ai du coup ajouté dans le fichier readme.

Pour les problèmes de Warning et Mail/mime.php, il faut ajouter Pear Mail : https://pear.php.net/package/Mail

Pour le problème SQL, je viens de voir qu'il y a une erreur sur la structure de la table, il faut mettre :

CREATE TABLE ekzercoj (
  `id` int(11) NOT NULL,
  `komando` text NOT NULL,
  `lecionero_id` int(11) NOT NULL,
  `komando_detalo` text,
  `ekzemplo` text,
  `typo` enum('traduko-1','traduko-2','traduko-3','verkado-1','verkado-2','verkado-3','verkado-4','verkado-5','verkado-6','stelo-1','stelo-2','truoj-1','truoj-2','kompletigu','ordigu','elektu') NOT NULL,
  `x2u` tinyint(1) NOT NULL,
  `korektebla` tinyint(1) NOT NULL,
  PRIMARY KEY (id)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

fais un drop table ekzercoj avant pour supprimer la table.