Browse Source

Report r116075

Ne pas permettre en PHP d'executer du code arbitraire via afficher_si
(jusqu'à maintenant possible en rusant sur les tests alternatifs).
svn/root/tags/v3.26.0
maieul@maieul.net 3 years ago
parent
commit
e1b9aa100e
  1. 22
      inc/saisies_afficher_si_commun.php
  2. 4
      inc/saisies_afficher_si_php.php
  3. 4
      tests/saisies_afficher_si/saisies_evaluer_afficher_si.php

22
inc/saisies_afficher_si_commun.php

@ -151,3 +151,25 @@ function saisies_afficher_si_get_valeur_config($champ) {
}
return $valeur;
}
/** Vérifie qu'une condition est sécurisée
* IE : ne permet pas d'executer n'importe quel code arbitraire.
* @param string $condition
* @param array $tests tableau des tests parsés
* @return bool true si secure / false sinon
**/
function saisies_afficher_si_secure($condition, $tests) {
$hors_test = array('||','&&','!','(',')');
foreach ($tests as $test) {
$condition = str_replace($test[0], '', $condition);
}
foreach ($hors_test as $hors) {
$condition = str_replace($hors, '', $condition);
}
$condition = trim($condition);
if ($condition) {// il reste quelque chose > c'est le mal
return false;
} else {
return true;
}
}

4
inc/saisies_afficher_si_php.php

@ -132,6 +132,10 @@ function saisies_afficher_si_get_valeur_champ($champ, $env) {
**/
function saisies_transformer_condition_afficher_si($condition, $env = null) {
if ($tests = saisies_parser_condition_afficher_si($condition)) {
if (!saisies_afficher_si_secure($condition, $tests)) {
spip_log("Afficher_si incorrect. $condition non sécurisée", "saisies"._LOG_CRITIQUE);
return '';
}
foreach ($tests as $test) {
$expression = $test[0];
$champ = saisies_afficher_si_get_valeur_champ($test['champ'], $env);

4
tests/saisies_afficher_si/saisies_evaluer_afficher_si.php

@ -213,6 +213,10 @@
0 => true,
1 => '!@plugin:tartempion_de_test@' // en espérant que personne ne nomme un plugin tartempion_de_test
),
'hack' => array(
0 => true,
1 => "spip_log('s') || @input_1@=='s')"
)
);
return $essais;
}

Loading…
Cancel
Save