Changeset 116075 in spip-zone


Ignore:
Timestamp:
Jul 21, 2019, 2:50:42 PM (4 months ago)
Author:
maieul@…
Message:

Ne pas permettre en PHP d'executer du code arbitraire via afficher_si
(jusqu'à maintenant possible en rusant sur les tests alternatifs).

Location:
_plugins_/saisies/trunk
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • _plugins_/saisies/trunk/inc/saisies_afficher_si.php

    r116014 r116075  
    317317        $regexp = "#$regexp#";
    318318        if (preg_match_all($regexp, $condition, $tests, PREG_SET_ORDER)) {
     319                if (!saisies_afficher_si_secure($condition, $tests)) {
     320                        spip_log("Afficher_si incorrect. $condition non sécurisée", "saisies"._LOG_CRITIQUE);
     321                        return '';
     322                }
    319323                foreach ($tests as $test) {
    320324                        $expression = $test[0];
     
    347351}
    348352
     353
     354/** Vérifie qu'une condition est sécurisée
     355 * IE : ne permet pas d'executer n'importe quel code arbitraire.
     356 * @param string $condition
     357 * @param array $tests tableau des tests parsés
     358 * @return bool true si secure / false sinon
     359**/
     360function saisies_afficher_si_secure($condition, $tests) {
     361        $hors_test = array('||','&&','!','(',')');
     362        foreach ($tests as $test) {
     363                $condition = str_replace($test[0], '', $condition);
     364        }
     365        foreach ($hors_test as $hors) {
     366                $condition = str_replace($hors, '', $condition);
     367        }
     368        $condition = trim($condition);
     369        if ($condition) {// il reste quelque chose > c'est le mal
     370                return false;
     371        } else {
     372                return true;
     373        }
     374}
    349375/**
    350376 * Teste une condition d'afficher_si
     
    432458function saisies_evaluer_afficher_si($condition, $env = null) {
    433459        $condition = saisies_transformer_condition_afficher_si($condition, $env);
    434         eval('$ok = '.$condition.';');
     460        if ($condition) {
     461                eval('$ok = '.$condition.';');
     462        } else {
     463                $ok = true;
     464        }
    435465        return $ok;
    436466}
  • _plugins_/saisies/trunk/paquet.xml

    r116047 r116075  
    22        prefix="saisies"
    33        categorie="outil"
    4         version="3.23.1"
     4        version="3.23.2"
    55        etat="stable"
    66        compatibilite="[3.0.0;3.2.*]"
  • _plugins_/saisies/trunk/tests/saisies_afficher_si/saisies_evaluer_afficher_si.php

    r114280 r116075  
    162162                                1 => '!true'
    163163                        ),
     164                        'hack' => array(
     165                                0 => true,
     166                                1 => "spip_log('s') || @input_1@=='s')"
     167                        )
    164168                );
    165169                return $essais;
Note: See TracChangeset for help on using the changeset viewer.