Headline
CVE-2019-16391: spip
SPIP before 3.1.11 and 3.2 before 3.2.5 allows authenticated visitors to modify any published content and execute other modifications in the database. This is related to ecrire/inc/meta.php and ecrire/inc/securiser_action.php.
4 changed files with 41 additions and 27 deletions
2
ecrire/inc/meta.php
18
ecrire/inc/securiser_action.php
16
ecrire/inc/utils.php
32
ecrire/index.php
@ -32,7 +32,7 @@ function inc_meta_dist($table = ‘meta’) {
// en cas d'install ne pas faire confiance au meta_cache eventuel
$cache = cache_meta($table);
if ((_request('exec') !== 'install' or !test_espace_prive())
if ((!$exec = _request('exec') or !autoriser_sans_cookie($exec))
and $new = jeune_fichier($cache, _META_CACHE_TIME)
and lire_fichier_securise($cache, $meta)
and $meta = @unserialize($meta)
@ -184,14 +184,16 @@ function caracteriser_auteur($id_auteur = null) {
function _action_auteur($action, $id_auteur, $pass, $alea) {
static $sha = array();
if (!isset($sha[$id_auteur . $pass . $alea])) {
if (!isset($GLOBALS['meta'][$alea]) and _request('exec') !== 'install') {
include_spip('inc/acces');
charger_aleas();
if (empty($GLOBALS['meta'][$alea])) {
include_spip('inc/minipres');
echo minipres();
spip_log("$alea indisponible");
exit;
if (!isset($GLOBALS['meta'][$alea])) {
if (!$exec = _request('exec') or !autoriser_sans_cookie($exec)){
include_spip('inc/acces');
charger_aleas();
if (empty($GLOBALS['meta'][$alea])){
include_spip('inc/minipres');
echo minipres();
spip_log("$alea indisponible");
exit;
}
}
}
include_spip('auth/sha256.inc');
@ -1644,14 +1644,24 @@ function find_all_in_path($dir, $pattern, $recurs = false) {
/**
Prédicat sur les scripts de ecrire qui n’authentifient pas par cookie
et beneficient d’une exception
@param string $nom
@param bool $strict
@return bool
*/
function autoriser_sans_cookie($nom) {
function autoriser_sans_cookie($nom, $strict = false) {
static $autsanscookie = array('install', 'base_repair');
$nom = preg_replace('/.php[3]?$/', '', basename($nom));
return in_array($nom, $autsanscookie);
if (in_array($nom, $autsanscookie)) {
if (test_espace_prive()){
include_spip('base/connect_sql');
if (!$strict or !spip_connect()){
return true;
}
}
}
return false;
}
/**
@ -41,7 +41,7 @@ $reinstall = (!is_null(_request(‘reinstall’))) ? _request(‘reinstall’) : ($exec
// Les scripts d’insallation n’authentifient pas, forcement,
// alors il faut blinder les variables d’URL
//
if (autoriser_sans_cookie($exec)) {
if (autoriser_sans_cookie($exec, false)) {
if (!isset($reinstall)) {
$reinstall = 'non';
}
@ -64,20 +64,22 @@ $forcer_lang = true;
if (_request(‘action’) or _request(‘var_ajax’) or _request(‘formulaire_action’)) {
// Charger l'aiguilleur qui va mettre sur la bonne voie les traitements derogatoires
include_spip('public/aiguiller');
if (
// cas des appels actions ?action=xxx
traiter_appels_actions()
or
// cas des hits ajax sur les inclusions ajax
traiter_appels_inclusions_ajax()
or
// cas des formulaires charger/verifier/traiter
traiter_formulaires_dynamiques()
) {
exit;
} // le hit est fini !
if (!autoriser_sans_cookie($exec)){
// Charger l'aiguilleur qui va mettre sur la bonne voie les traitements derogatoires
include_spip('public/aiguiller');
if (
// cas des appels actions ?action=xxx
traiter_appels_actions()
or
// cas des hits ajax sur les inclusions ajax
traiter_appels_inclusions_ajax()
or
// cas des formulaires charger/verifier/traiter
traiter_formulaires_dynamiques()
){
exit;
} // le hit est fini !
}
}
// securiser les redirect du back-office
if (_request(‘redirect’)) {