1 votes

Comment modifier l'action de la règle modsecurity pour un seul paramètre ?

J'ai un modsecurity avec Core Rule Set. Et j'ai une requête POST avec 3 paramètres : Par1 = "XML encodé en base64" & Par2 = "URL" & Par3 = "hachage".

Je veux modifier les règles CRS pour décoder en base64 seulement Par1 et utiliser Par2 & Par3 tel quel.

J'ai essayé d'utiliser la directive SecRuleUpdateActionById, mais elle nécessite d'écrire une directive pour chaque règle dans CRS. La directive SecDefaultAction ne fonctionne pas non plus, car toutes les règles CRS ont "t:none" qui remplace les actions par défaut. J'ai également trouvé l'action multiMatch, mais je pense qu'elle causera beaucoup de faux positifs sur la chaîne base64.

Y a-t-il un moyen de mettre à jour les actions pour plusieurs règles sans réécrire ces règles?

2voto

mishunika Points 1041

J'ai trouvé une solution. J'ai décidé de récupérer la valeur du paramètre Par1, de la décoder en base64 et de l'enregistrer dans une variable "TX". Cette variable sera disponible jusqu'à la fin de la transaction. Il y a deux façons de le faire.

1.1. utiliser lua:

  • créer le fichier extract_param.lua avec un contenu similaire :

    function main()
        -- Récupérer par1
        local par1 = m.getvar("ARGS.Par1", {"base64DecodeExt"});
        if par1 == nil then
            m.log(3, "no Par1 in request.");
            return nil;
        end
        m.log(3, "Par1 décoder en base64:" ..par1.. ".");
        m.setvar("TX.Par1",par1);
    return nil;
    end
  • ajouter la directive SecRuleScript avant le chargement de CRS :

    SecRuleScript path/to/script/extract_param.lua phase:2,log

1.2. utiliser la fonctionnalité standard "setvar". Cette méthode est plus simple, je l'utilise. Mais je l'ai trouvée (ici) plus tard et j'ai décidé de parler aussi de lua.

  • ajouter la règle suivante avant le chargement de CRS :

    SecRule ARGS:par1 "^(.*)$" "log, pass, id:22, phase:2, t:base64DecodeExt, setvar:tx.par1=%{MATCHED_VAR}"

2. ajouter le groupe de directives SecRuleUpdateTargetByTag après le chargement de CRS :

SecRuleUpdateTargetByTag 'OWASP_CRS/WEB_ATTACK/SQL_INJECTION' "!ARGS:par1|TX:par1"

1voto

Barry Pollard Points 4411

Il n'est pas facile de mettre à jour l'action de plusieurs règles CRS, à moins de lister chaque identifiant de règle pour les raisons que vous avez données.

Il est possible de mettre à jour les variables correspondantes à un groupe de règles en utilisant SecRuleUpdateTargetByTag mais pas l'action car il n'y a pas de SecRuleUpdateActionByTag (seulement un SecRuleUpdateActionById) mais honnêtement même s'il existait le fait que vous ne vouliez transformer qu'une de vos variables va vous poser des problèmes. Et je suis d'accord que la correspondance multiple n'est probablement pas la bonne réponse ici même si vous pouviez le faire.

En fin de compte, je recommanderais de :

  1. Laisser les règles telles quelles et ignorer essentiellement la variable par1 en base64 pour le CRS (notez que vous devrez peut-être mettre à jour certaines règles pour ignorer ce paramètre pour certaines règles si le codage base64 crée des faux positifs).

  2. Déterminez quels sont les vecteurs d'attaque pour votre variable XML par1 et écrivez (ou copiez du CRS) un sous-ensemble plus petit de règles spécifiquement pour cela, avec une transformation base64Decode. Même une fois décodé en base64, je suppose que le XML pourrait quand même créer beaucoup de faux positifs, donc vous ne voudrez probablement pas exécuter le CRS complet dessus de toute façon.

Bonne chance !

0 votes

Merci pour votre réponse ! mais copier les règles du CRS suggère qu'après la mise à jour du CRS, nous devrons mettre à jour ou réécrire ces règles séparément. ma solution est plus pratique.

0 votes

Belle solution de contournement! Ayez un vote positif de ma part.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X