 C'est le truc Zoom, mais on l'a envoyé encore, il faut que je n'étudie pas. C'est sûr que là, quand je vais m'élever, on va voir le mur. C'est juste dans la compagnie. Je suis là pour ton discours que tu as fait sur l'écran. C'est bon, on va commencer. C'est ça, c'est ça. Ok, donc sur notre site, c'est bon, c'est bon de faire des événements physiques. Donc, ce sera un workshop, comme vous pouvez le voir sur la web. C'est un site de web, c'est un site interactif. Donc, je vais ajouter quelques slides, mais il y a aussi une instruction pour faire par soi-même un peu de l'exercice. Je vais donner 20 exemples, mais nous fichons au moins 4 exercices. C'est ce que j'ai besoin de faire. Je suis un ingénieur de sécurité pour notre service. J'ai été travaillé pour une recherche de sécurité. J'ai l'intéressant de nombreuses choses dans la sécurité. C'est surtout la sécurité de l'application. Qu'est-ce qu'il s'agit de l'application crypto et de l'analysation statistique. Donc, un projet que j'ai commencé, c'est de trouver 50 bugs. C'est 10 ans, l'analysation statistique. C'est 4% principalement en java et en patrouille. Si vous êtes intéressés. Pour cette présentation, j'ai divisé en 5 main catégories de WAF bypass plus une introduction pour commencer. Et ces catégories sont générales. Je vais donner 20 exemples pour chaque. Mais je pense que le principal point de cette présentation c'est que vous vous souvenez de la catégorie générale. Si vous avez des rencontres, il y a d'autres, il y a de la WAF, de la Traxie Reverse, peut-être un peu de bugs qui sont à l'intérieur de l'application. Peut-être que l'accessoire qui bloque quelque part ou quelque paramètre, c'est la même pattern. Vous avez des tools pour penser qu'est-ce qu'il y a un type de faute que je peux attaquer. Et souvent, on s'occupe d'une certaine partie d'un type de faute. Mais on voit que il y a des outils que sont plus facile à utiliser pour bypasser. Pour cette workshop, je vais vous donner une bonne 30 secondes. Si vous voulez prendre un note, je vais vous montrer la réplique de la chanson. Mais, au cours de cette réplique, et vous trouverez aussi le nom du site que je vous présente. Je vais vous montrer. Le site est un version summarisée du site mini. C'est tout le contenu de cette présentation. Je vais zoom un peu sur ça, mais vous verrez qu'il y a assez de choses. Pour chaque catégorie, il y a des matériaux, et puis des instructions step-by-step pour les différents labs. Ici, vous verrez des différents payloads. Si vous inquiétez, je vais vous demander. Vous pouvez either follow along this file or this, mais vraiment pour l'exercice, vous devez refermer à ce petit site. C'est le deuxième lien. Je vais vous dire que nous faisons un exercice, mais pour maintenant, si vous avez... Je dois ré-opiner ce site. Mais c'est pour l'interprète. Juste quelques définitions pour faire sure que tout le monde s'entend. Qu'est-ce qu'il y a d'autres applications? Les clients sont souvent juste appelés WAF, donc vous devez probablement ouvrir ça pour le reste de la présentation. Leur cause est d'aider à filtrer des requises, et à monitor. Donc peut-être ne pas bloquer tout, mais à un moment, il s'agit d'une alerte qui est potentiellement un attaqueur qui explique votre application. Ou même pour bloquer des requises. C'est un trafic. Alors, la WAF est installée entre les clients. Donc ce sera votre extérieur utilisateur sur Internet. Et la back-end sera votre application. Et la WAF, ce qui est représenté par un autre service, ou une application. À un moment, c'est une application différente sur la même machine. À un moment, c'est même un component à l'intérieur de l'application, que nous ferons des filtres pour garantir ces mesures. Et je vais utiliser le webcamp. Pour le son. OK. Oui. Oui. OK. Il y a des vendeurs. Alors, qu'est-ce qu'il y a d'exemples de WAF que vous pouvez rencontrer? Donc, souvent, quand les gens déploient manuellement, WAF, ce sera parfois juste un module ou un outil que l'on utilise sur leur lanceur. Donc, c'est le cas. F5. F5. F5. F5. F5. F5. F5. Mais, si vous voulez juste commencer et avoir un niveau de protection sur votre application, vous pouvez déployer vraiment la sécurité de mode ou un axe. L'offre de sécurité de mode de sécurité n'est pas actuellement maintenue, mais il y a déjà un bon set de règles. Mais, nous verrons que ce sont des cas que nous pouvons explorer sur la sécurité de mode aujourd'hui. Donc, je vais vous montrer un exemple. Mais, presque toutes les providers cloud, donc Azure, AWS, c'est le red logo à la basse, ils ont leur propre WAF. Et, j'ai eu un avantage d'avoir WAF dans leur structure, c'est que, si il y a un niveau de protection, c'est bien, c'est bien, c'est bien, c'est bien, c'est bien, c'est bien, c'est bien, c'est bien, c'est bien, c'est bien, c'est bien, c'est bien, c'est bien, c'est bien, c'est bien, c'est bien, c'est bien, c'est bien, c'est bien, c'est bien, c'est bien. Alors, on risque de pas entendre l'example l'examsation car, car, cette nouvelle AI. Normand, l'examsation.洗 la waiting qu'on a microwave les vaporisation. Mais, j'ai bien, j'ai bien, j'ai bien IOCOM. Arr colonialism. T nächsten edition, on se addition details de la transformation est bloqué ou des keywords. Le premier step devrait être de trouver une alternative. Un exemple de cela est sur Wordpress. Un petit clope de clope va bloquer un point de vue parce qu'ils ont besoin d'informations beaucoup sur le user, incluant un username et des emails. C'est le cas pour Wordpress. Ils vont essayer de bloquer la première patte, en terminant avec WP, un user V2. Mais souvent, ils oublient qu'il y a beaucoup d'autres moyens pour qu'ils puissent obtenir les mêmes informations. Vous pouvez demander l'autre page. Vous pouvez appeler le même user V2 en point en utilisant le paramètre restaurant. C'est parce que WP.Json est juste un peu réveillé pour la page index avec le paramètre restaurant pass. En fin, c'est le même point en access. Mais d'autres URLs. Autantement, même si vous avez des plugins, parfois vous pouvez installer, les informations peuvent être accessibles. Donc, si vous avez un site Wordpress.com, ça ne peut pas être axé directement par le point de vue de l'utilisateur. Mais avec le plugin de Jetpack, que l'on utilise par défaut, votre liste d'utilisateurs sera aussi accessible. Il y a aussi d'autres alternatives expliquées dans cet article. Mais il y a des techniques qui vont être expliquées plus tard. Quand il s'agit d'accessibles, vous pouvez simplement essayer de trouver des alternatives. Ce sera beaucoup plus facile si c'est juste un réglage implementé par un développeur et que l'on puisse utiliser un cas particulier. Vous allez facilement trouver des alternatives. Si vous êtes en train de bypasser l'HTML scientifique, qu'il soit bien maintenu, ce sera plus compliqué. Mais, essayez de trouver des alternatives ou des attributs. Je vais vous donner un exemple. Alors, au lieu d'utiliser un tag ou un tag d'image qui est la typique pour tester, essayez d'utiliser un tag d'image, un tag d'image vidéo ou même, en ce cas, un téléphone de recherche qui utilise des détails avec des attributs sur le togo. Mais il se mélange avec un cas de change pour l'appropriation et une nouvelle ligne. C'est une combination de beaucoup de patterns. Vous pouvez voir que les tags peuvent souvent bypasser des filtres. Maintenant, quand il s'agit de l'injection sql, il y a des tables qui sera un blacklist ou un keyword qui sera un blacklist en presque tous lesquels. Donc, c'est unlikely que votre utilisateur normal va soumettre l'information schema.tables ou .com en parlant sur sql. C'est assez safe pour bloquer ces keywords. Donc, si c'est juste un liste de keywords que c'est bloqué, try to find alternative tables. So often it will be either just other tables, so your table constraint doesn't include just table names but constraint with the table but you'll be able to find table name and statistic table. So these will either be provided by the DBMS itself or sometimes it's some a module that was installed with a framework that will create some table for statistic and you can target those to get some information and find some hidden table. Now I have a question for you. Does anybody know what underscore and the score immigration history is this table is doing? So it's no longer event since a year and a half but it was the table used by entity framework for .f I think it's entity framework something like that. Now it was renamed to underscore ef migration history and it no longer has a special column that was modeled that add the complete table model of the orm gzip in one column. So you used to be able to target this table and extract the list of column and table in one week and it's actually pretty rare I didn't see it in other orm orm and the last example this is for Oracle so all underscore tables will be black this and all waft but tab statistic also include table name so you can try those if only specific table name are not. For the exercise of this one it will be in the next section. I've included one exercise but generally the methodology for finding those alternate tables is just digging to the documentation so I didn't want to do an exercise where you just have to do some Google search for some framework because it can be time consuming and it's either you find it or you don't but I found a way later on to have an exercise on it. Now encoding this is probably what people often think first so they think okay but it doesn't have all the context attached to the request so maybe the application is doing some additional decoding and then I can do some transformation to some of the parameter that I'm sending to the application and the idea is we're not sending a different parameter but we're going to encode it slightly differently and we will not be able to see that it's actually a keyword that it has like this because it's slightly encoded differently so one example is changing a case mapping so in Unicode all basic ST character will have an uppercase and a lowcase version of those and if the application in the end does some lower case operation or some insensitive operation then you can just change the case of the keyword and maybe you'll be able to bypass the WAF so whether you need to look for when you're reviewing some regex or some configuration look for case insensitive so if you have a regex in your WAF make sure it has for example PHP you would see the FireIDM saying ok if this pattern is present but regardless of the case like this in Python you need to add an additional flag and in Apache HTTP server you need to add those NC otherwise it will be strict case mapping so case mapping is the operation of finding the uppercase equivalent character but yeah so make sure if you are looking or investigating at some filter that insensitivity is un equal if you are encoding this is something you can encode and something double encode this would be possible because some component will something do encoding that is unnecessary so there is this case here for a FAT for an exploit that I don't know about but the idea is that the component that is trying to load a file on disk maybe is not sure about the way that the parameter will come to this component so it's doing an additional URL decoding that the webcontainer already did so if you have a component that one or two that are doing encoding then you can potentially do this so sometimes it can be really deep so if you have a component that is a reading file that is doing unnecessary URL decoding then you can do this we'll have the case here for an XSS pattern so here it's just an excel tag that are encoded to bypass potential filter that will look only for script with tags but because the application is doing some unnecessary decoding we can do this now some XSS is a vector where we'll have plenty of opportunity because depending on where the values are placed in the page we'll be able to encode sometimes our value with additional encodings so if it's present either in an attribute or in an XML tag and it's read by javascript then you can encode it with XML entities because when it's going to be read from the DOM by javascript automatically those entities gets decoded so this is a behavior that happens inside but the idea is that your WAF would not necessarily look for XML entities encoded parameter and think that it will be safe even though it's restricted as is so you can do entities with name so here it's lower than so starting character for XML tags or HTML tags but you can encode the same character with X value or the decimal one 60 in XML is 3C if it's present your value end up in javascript you'll be able to use some stash encoded escape value but basically the way to represent this character is pretty rare because it's going to be either in javascript or some type of script if you're trying to just bypass some specific character that are filters maybe single code or double code you can use a function that will provide the same result but without using a single code directly you'll be able to integrate those same X value but as parameter to this function so this is not exactly encoding but I have to replace it now another avenue is unical encoding so this will apply if you have some file that is being uploaded and your file is being blocked because some analysis is done to the file or in some case to the body of request where you can specify a specific encoding so utf7 is mostly history because Chrome I think since 2009 doesn't support it anymore and most browser won't support it and many web frameworks simply don't support this type anymore but we still have utf16 the little engine and big engine version that are still available so this means that so the persegrity with utf16 is that you need to place what are called BOM or byte order so this is the first 2 bytes or 2 bytes I'm not sure so that will define so most application will be using utf8 by default but if you specify those specific marker then you'll be able to encode it in utf16 LE or B so every character will take 2 bytes so for a web that is doing strict byte comparison so thinking that it's utf8 string it will think that these are no bytes separating every character so most of regex will fill and utf32 pretty rare but it's also a fixed length character map normalization this is something again that is rare but there are many cases when it can be helpful and one example normalize character is basically some unical character that will have an equivalent version that is a simplified version so sometime it's to cope with limited support of unical so it's being simplified for storage for example and one example is the default mode I forgot the exact name of the collation or the configuration but in SQL server if you store this character with the default collation it will convert it to simply the regular XML type character so lower than so this means that on storage you will send this to your database but once it will be fetched it will be an actual xerofax so this is something to test it will depend mainly on your database configuration in a type of field that you are using because some type of nvarchar will not do this but it will depend on the collation configuration and by the way in the detail website you will have more reference and more detail explanation so you will be able to find more details so now we are ready to do some exercise because it's a workshop so for the first exercise if you are not fully ready you can just click on the link in the slide and you will get a level up so I will give you a good 15 minutes to start with just to find a URL get to it I think most of those can be done from the mobile phone even so what you need to look for so these are not proprietary or commercial these are simple PHP function just because it's easier to describe but you will see in the exercise that we will be using some actual web views in production and what you need to think about is we look at finding alternative keyword or elements and we look at including now you have three forms where you can submit a name this and it's being reflected in the page so you need to find a way to do an exercise but if I do an obvious pattern so this you will see that my homemade WAF will block some pedo so you can look at the code in the page so this is the core element that you look at but if you need more context you have access to the full source code if you open the the full source code so you will see the complete page with the actual code if you want to see the full once you're done with one exercise you can go to the next form so there are three forms to test and the three are not necessarily different difficulties really just different things you need to find and you need to apply the different tricks that I've presented so I'm giving you time to open your laptop find the URL if you have any questions, raise your hand and I'll be looking for people online at the discord channel workshop so be patient and you'll probably respond within 10 minutes so yeah, good luck so this is the main repository to look for and you'll get the slide and I'll paste it in the discord so we're able to get that it can pass good service ok bye ok so ok ok ok ok ok donc si vous ouvrez la workshop c'est très et vous trouverez le slide c'est très important mais la workshop ouvre le slide on va voir le slide ça peut être plus facile pour faire le exercice direct c'est 3 formes et pour chaque forme il y a des valeurs dans la page et il y a une function c'est un waf et vous devez trouver un bypass pour les deux il y a 3 c'est une question si quelqu'un ne veut pas prendre une photo je vais prendre une photo est-ce que tout le monde est ok avec ça ? oui c'est pas bon pas bon c'est si vous laissez un panel avec quoi dedans on intervient aussi si vous la place d'un signe on s'occupe de стол Ok, donc je vais présenter la solution pour les 3 exercices, parce qu'on a un peu plus d'exercices pour montrer. Donc, par réserve, n'importe qui a trouvé les 3 solutions pour les 3. Donc, à peu près les deux. Et probablement vous êtes très proches. Ok, on ouvre les exercices. Donc pour la première, vous devez comprendre que le raccord de la square en Ragex, si il n'y a plus d'exercice ou plus d'exercice, c'est seulement un caractère. Donc, ceci est en train de regarder des tags d'opérations, suivant un caractère. Le problème, et beaucoup de vous ont trouvé, c'est que ce n'est pas un casque insensitif. Donc, pour cette raison, plutôt que d'utiliser ceci, qui est bloqué, je peux simplement replacer le premier caractère par capital I, et ça fonctionne. Parce que le web browser est un casque insensitif pour les tags. Et la même chose pour les noms attributs. Donc, ceci était le premier. Le deuxième, c'est un peu plus tricky, parce qu'actuellement, pas tout est dans ce code snippet. C'est juste le web, mais vous devez vraiment regarder où la valeur est placée. Donc, quand vous soumettez une nouvelle valeur, vous verrez que dans cette forme profonde, la valeur est placée. Mais ici, ce welcome, suivant le nom, est fait par JavaScript. Donc, si vous regardez le code, c'est le nom de la forme profonde, et parce que nous avons regardé un attribut de la forme profonde. Cela signifie que c'est le contexte de l'exemple. Je veux juste trouver le nom. Donc, parce que nous avons regardé la forme profonde, c'est XML. Donc, si nous inclusons les entités de JavaScript, quand vous readez la valeur, automatiquement, JavaScript va décoller ceux. Parce que dans le nom, le nom, la représentation actuale sera décolle. Donc, juste pour confirmer que je n'ai pas dit quelque chose d'accord. Alors, nous avons regardé le nom de la forme profonde. Nous avons regardé le nom de la forme profonde, et nous avons regardé un nombre d'articles. Et la forme profonde est déjà confirmée par un nombre d'articles. Je veux dire, oui, on regarde la source pour confirmer ce qui se passe. Donc, ici, on ne peut pas échapper le single code, même si vous utilisez un backslash, vous n'avez pas de contrôle avec la valeur qui se suivira. Donc, si vous pensez à ça, c'était une bonne idée. Mais vraiment, la solution c'est d'améliorer tout. Parce qu'il y a un contexte JavaScript, tout le monde se décolle. Maintenant, pour la fin de la vidéo, le régex est probablement misé, parce que ce n'est pas beaucoup sur le régex ou la fonction de validation. Je voulais montrer que, souvent, vous devez regarder la différence de l'implementation entre ce qui est d'améliorer les requises et l'application qui est de recevoir les requises. Donc, parfois, vous avez quelque chose d'améliorer le URL, mais plus tard, quand c'est passé à peut-être un library de HTTP, ça partage l'URL différemment. Donc, c'est quelque chose que vous pensez. Ici, c'est un cas beaucoup plus simple, où l'input de validation est utilisé sur le score GET. Mais, en fait, l'application, elle-même, reflète les requises. Et les requises en PHP, c'est d'améliorer les requises. L'idée c'était d'améliorer son encode au lieu de poursuivre une autre vector, et ici, c'est de nouvelles 하니까ires. Alors, je vais juste changer la forme et le changement de GET pour supposer. Ce qui est de l'ascenseur, maintenant, doit nous élaborer l'exerceur. C'est aussi simple que ça. Donc, c'est la façon dont j'ai trouvé une façon de faire un exercice sur le soutien d'une quai alternative ou pas, sans avoir à chercher dans la documentation pour une nouvelle application. Maintenant, retour à la place. Donc, nous avons vu le soutien d'une quai alternative et d'incôting. Maintenant, j'ai fait un segment spécifiquement sur l'expérience parce que c'est l'un des plus grands secteurs où les gens vont essayer de trouver un web bypass. En quelque temps, Ragex va inclure des espaces. Et dans l'HL, vous trouverez plein de caractéristiques d'alternatives qui vont faire un espace. Donc, le tab sera souvent aussi accepté comme un séparateur de keywords. Mais il y a beaucoup. Et en fait, j'ai créé le SRS Server 1 de l'Original Source parce que c'était un caractère qui peut être utilisé en white space trois fois plus. Il y a aussi quelques trucs, donc vous pouvez utiliser des commentaires. Ce n'est pas un seul caractère, mais c'est pour faire le même chose. Donc, vous pouvez inclurez des commentaires ou des commentaires avec des keywords mis au-delà de l'intérieur, peut-être, pour essayer de remplir le web. Dans l'MSS Core, vous pouvez ajouter des brackets à l'arrière du tableau et vous pouvez mettre des columns entre les coulisses ou les coulisses doubles. Dans le record, vous pouvez inclurez le tableau et les coulisses à l'extérieur. Donc, c'est assez utile parce que ce n'est pas une représentation en white. C'est vraiment une représentation en white. Comme vous pouvez le voir, c'est la façon dont c'est senti. Et maintenant, cette partie est importante parce que ce sera le prochain exercice. Donc, c'est quelque chose qui a été filmé par les mêmes recherches, donc, c'est l'Oberto Ghetto qui a documenté ce comportement que dans ma STL, vous pouvez utiliser 1.e. Mais un de mes collègues, Marc-Polivier Darjean, a trouvé que ça pourrait s'appliquer pour bypasser le AWS WAF. Et j'ai regardé ça et j'ai dit, oh, ça doit être un moyen de bypasser aussi l'injection que l'on utilise par la sécurité de la mode et il y a plein de WAF. Et c'est ça. Donc, l'idée c'est que ma STL, quand ça passe, c'est que ça va organiser tout le monde et ça va passer de gauche à droite. Et quand on verra une notation scientifique, donc une exponentie ou une valeur numérique exponentie quelque chose, ça va commencer par un numérique littéral, mais si le caractère qui est suivi, le caractère E n'est pas numérique, ça va simplement canceler l'opération et l'on, l'E, il s'est ignoré. Et donc pour cette raison, maintenant on peut commencer à ajouter l'on, l'E, pour préparer tous nos keywords et ça va faire l'injection. L'injection est en train de faire des avances contextuelles où on essaie de voir, par exemple, quand vous placez un code single dans votre paramètre, Ok, peut-être que ça va commencer à être en train de faire des avances contextuelles, donc ça va essayer de trouver en ce contexte des keywords spécifiques quelles sont les STL et ça va essayer de voir si c'est une valeur de l'injection STL que vous avez injectée. Donc ça a tout le keyword d'un nouveau index de BMS dans l'engin. Mais avec ça, c'est facile de faire l'injection STL que ça n'aurait pas vu comme le maire d'Ebay ou le maire d'Ebay. Et ce sera le prochain exercice. Donc pour celui-ci, il y aura un instant live. C'est possible dans le mobile, mais vous verrez qu'il peut être difficile d'always retaient dans l'erreur. Donc celui-ci n'est pas un formule, donc vous devez trouver l'input dans l'urale qui est disponible pour l'injection STL. En fait, il y a deux paramètres qui peuvent être placés dans l'application custom et qui sont tous disponibles. Donc vous avez deux vêtements. Donc je vais vous donner un. Donc ici, il y a ce genre de filtres où vous pouvez spécifier les types de films. Et si vous avez un code single pour l'injection STL, vous pouvez le faire. Mais si je commence à ajouter un keyword, c'est une union, c'est-à-dire quelque chose, vous allez obtenir une page formule. C'est le module de mode de sécurité d'un module hygiéniste ou un module d'appartement. Et le réveil ne va même pas atteindre l'application parce que c'est un peu trop risqué pour l'injection STL. Et l'injection STL est une combination d'un set de Ragex et aussi de l'injection STL. Et l'injection STL est vraiment une utilisation quand vous avez un payload qui n'a pas simplement un keyword SQL. Donc si vous êtes juste tentant de faire un code single pour l'injection STL, un code single pour l'injection STL, juste pour le faire. L'injection STL l'injection STL va trouver ce code parce que c'est un parcellement contextuel qui peut trouver un code single. Et c'est le type de condition qu'on veut trouver dans l'application. Donc essayez de l'injection STL dans l'application STL et confirmez qu'il y a un injection STL. Et puis essayez de faire toujours des conditions pour sans spécifier quelque chose d'emptier, quelque chose qui est toujours. Donc je vais vous donner 5 à 10 minutes et puis je vais vous expliquer le next step. Donc essayez de trouver un pattern qui est l'injection STL et puis, en utilisant la notation stl, essayez de trouver un bypass. Mais ne pas trop loin avec le premier exercice. Ne pas essayer de faire un query qui fait un union et d'adverter quelques tables. Juste faire une condition est toujours vrai parce que vous verrez que le final pétrole sera très compliqué. Pour l'injection STL, vous devez trouver l'injection STL et vous devez être bloqué par la sécurité de l'injection STL et essayer de trouver un bypass en utilisant cette spécifique technique. C'est sûr qu'il va des comportements différents. Puisant, à ce moment, ça a été reporté l'année passée sur le point d'adverter l'injection STL. C'est sûr que la sécurité est la réponse. C'est que l'injection STL va augmenter le niveau de l'injection STL et ne pas sur une table faune. C'est sûr que ça déferme. C'est comme trois niveaux de paranoïole qu'elle pose dans la sécurité. C'est sûr que l'augment pour le dernier niveau où ça va être bloqué. L'amortisse des raguettes aussi bon d'être, c'est sûr que ça peut fonctionner je fais un WAF et j'utilise les Benjections, parce que les Benjections sont utilisées par beaucoup plus. Donc ils sont dans le processus, c'est qu'il est... Et puis sinon, ça dépend d'un à l'autre. Puis d'ensemble, le BFU a été également rapporté à ma expérience puis dans les dernières versions, ça devrait être possible. Sauf que combien de gens ont eu des traverses? C'est ça, c'est ça. Non, c'est juste que je suis contre le tribunal, je suis pas au côté de ce bord-là. Ça m'agresse à l'un de l'autre, c'est comme, la guerre est tribunal pour ce qui est là-dessus. Ça, c'est encore plus grave dans le processus. Oui. Tu peux encore l'utiliser comme... Oui. Puis dans le processus, c'est pour illustrer que le mettant, c'est que c'est une question qui n'est pas à jour. Tu te dis, ok, ben mon proper weather, il va voir que ça, c'est correct. C'est sûr. Quelqu'un qui est vraiment motivé et qui va pouvoir comme une... Je vais te présenter. C'est ça, ben, lui, il va pouvoir péter l'incession du temps pour tout le monde. Mais le weather va faire, c'est sûr, ça va. Même avec des éduquets, c'est comme ça. Pour des gens qui veulent des quantes amortisées, pour les gens qui veulent des idées, pour les gens qui veulent des parles, les termes. Ça, c'est quand même un éduquets, puis c'est quand même relativement difficile à... Dans les cycles, dans le détaillier, je montre quand même les périodes qui sont mêmes, mais c'est quand même beaucoup plus d'efforts, déjà que trouver l'injection, quand il y a un weather, c'est plus difficile. Tu peux, tu peux, plus rarement... Pour être vraiment motivé, il faut qu'il soit un cahier... Mais c'est que le weather, il va t'aider aussi dans la... Pour être entrain d'être activé. Parce que, par exemple, un scanner, un activé, lui, il pourra pas avoir des... Il y aurait peut-être toutes les fêtes qui vont se faire incomprimer facilement par le tout d'autre que le temps que tu injectes. Tu vas donner moi la version... C'est sûr. Et là, si toutes ces mots-clés là sont bloqués, là, c'est comme... Il y a 5 mois que les gens font. C'est le genre, juste de convaincre un weather qui s'apparence d'un élu transfert. C'est ça, c'est pas... Comprimer un autre peu d'autre facteur, c'est... Le water, c'est sûr. C'est réellement difficile. Quick reminder, il y a l'application que tu peux mettre directement. Il y a un site, mais il y a aussi un site. Il y a un site web, c'est une instruction step-by-step pour les différents labs. Et c'est vraiment la version détail. Tu vois probablement moins de 5% du contenu sur le site. Et si tu veux gérer l'instance par vous-même, pour avoir des informations pour gérer et installer l'application. Et voilà. Surtout, justement, les photos, ils datent d'ailleurs 80. Oui, on veut. Oui, oui. Je suis pas capable d'être. C'est pas moi lui. Oui, je vais remettre les sites. C'est plus prophétique, comme ça se fait plus. Je vais présenter que j'essaie d'avoir un bureau. Oui, je vais remettre de quoi. C'est sérieux. Ça va prendre les bons produits pour la site web. Ça fait deux ans qu'on n'a pas de nouvelles photos. Ok, je vais faire la démonstration pour la détection et l'exploitation avance. Et tu as un peu plus de minutes pour remplir l'exercice. Et puis je vais continuer pour le prochain module. Donc pour la détection, tu dois either add ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... c'est la clé R, c'est pas un blacklist, donc c'est vraiment l'injection que l'on voit comme un pattern d'injection expérimentation et on va le bloquer. Pour détection ou pour bypasser le filtre, simplement ajouter cette notation scientifique avant l'activité de l'activité, mais c'est sûr que vous pouvez ajouter à quel nom de fonction ou clé que vous utilisez. Parce que ça va simplement être ignoré par le filtre, on peut ajouter ça et absolument, on a une condition que c'est toujours vrai, et on peut voir que c'est tout le film de l'air. Maintenant pour la partie avance, c'est assez difficile de construire, c'est pourquoi j'ai inclus le complet payload, mais on ne va pas pouvoir utiliser l'Union, donc c'est quelque chose que vous avez probablement pour que, même si j'utilise 1.e, parce que ma sécurité a des règles agressives en regardant, si vous avez l'Union, le keyword suivant par la sélection, ça va être bloqué. On ne va pas utiliser l'Union, mais on va pouvoir utiliser la sélection à l'intérieur de cette courte et faire une manière d'extracter un caractère spécifique. C'est quelque chose que nous appelons Blinestrain injection, mais non, c'est pas exactement blin, parce que vous avez toujours un miracle, mais basically la courte complète qu'on a envisée, c'est quelque chose comme ça. Nous nous extractons un caractère de la sélection, donc un caractère de la sélection d'une certaine certaine caractère de l'air qu'on a sélectionnée. Je devais commencer par le milieu, mais nous étendons le premier password de la table d'usage. Nous faisons un soft string sur le password pour exprimer juste le premier caractère. Et ensuite, ASCII convertit le caractère ASCII à une valeur numérique. Et ensuite, nous pouvons comparer à ASCII. Et c'est l'actualité que nous voulons exécuter. C'est l'application officielle afin de bypasser la table d'usage. Vous verrez qu'il y a plein d'occurrence où nous ferons référer à cette notation. Et encore, ce n'a pas besoin d'une. Si vous voyez un code ARCORD-AX qui regarde pour ceci dans des nouvelles règles, vous pouvez juste changer d'une ou d'une valeur. Vous avez encore 5 minutes si vous voulez faire ceci. Alors, essayez de juste exécuter ceci dans votre caractère ou votre paramétre et de changer le 70 à quelque chose d'autre. Juste pour voir que c'est vrai ou fausse. Et une importante note, vous devez ajouter un code single avant le OR si vous utilisez le paramétre vers le premier. Je n'ai pas ajouté le code single juste parce que le syntaxe, je pense, n'est qu'il n'a pas été... ...je l'ai vu comme un literal. Mais il y a un code single missing here. Et pour... Vous devez pouvoir faire le même chose si vous regardez sur la page de détail de film. Il y a un paramétre ID qui n'est pas seulement un numérique. Donc, ici, vous n'avez pas besoin de... Vous n'avez pas besoin d'un code single. C'est la même chose qui a été appliquée. Donc, ici, c'est forbidden. Mais si j'ai essayé quelque chose comme ça, je suis capable de bypasser juste parce que j'ai mis... ...une T, et je l'ai étendu par un literal. Donc... Et je l'ai dessiné avec le Vicky. Donc, il ne faut pas que le WAF n'aie pas de valeur, même si c'est un code currently. Donc, pour l'attaquer, si vous avez un site complet, vous avez plusieurs paramétres. Donc, tous les autres, tous les autres paramétres peuvent être testés pour l'exploitation. Si vous êtes en train d'attaquer un scanner, le scanner sera efficace en détectant l'exploitation. Si ils peuvent passer des longues enquiries où ils peuvent confirmer qu'il y a l'exploitation. Les scanners n'utilisent généralement des conditions simples qui sont légères pour... ...réter à différentes... ...les pages. C'est facile pour les humains de détecter. C'est... On est sûrs que c'est une injection. Mais pour le scanner, ils ont souvent besoin de beaucoup de keywords. Donc... Avec le WAF, dans un contexte réel, dans une application réelle, vous pourrez toujours remplir l'attaquer parce qu'il sera très efficace à trouver à quel point les victimes sont présentes pour une injection. Donc... Donc, vous avez encore un moment de faire cet exercice. Et puis... Et le prochain exercice sera très similaire à l'application. Mais vous verrez que vous pourrez bypasser le WAF complicieusement avec un pattern beaucoup plus simple. Oui, bien... En fait, souvent, c'est facile pour l'enfant de la WAF. Il ne sait pas. C'est un enquête, je l'envoie. C'est une page qui n'a pas de paramètres. C'est un paramètre tout au égal avec un apostrophe unit select. Et le WAF est un contexte trop spécifique. Ça a l'air bien, même si le paramètre n'existe pas. C'est une page forbidden ou un error system spécifiquement quand vous mettez des mots-plais qui sont à un impact. Là, c'est comme un panthèseur va le détecter dans les panneaux. OK, il y a un WAF parce que... Moins en main, j'envoie quelque chose. Donc, c'est vraiment pour chacun des affaires qu'il va vouloir faire, qu'il pense plus qu'est-ce que je peux faire, quel mot-plais c'est un bloqué. OK. C'est sûr que page forbidden, ça peut être plein de trucs. Pour le machinement, ça doit devenir des 10. C'est ça. Surtout des trucs que tu peux dire. Ça, ça reste au moins du passé. C'est pas censé. C'est une erreur interne de ce juge. Il est temps de te soumettre en ton nom, tu modifies-toi de ce qu'est-ce que c'est que ça t'a dit au haut. Tu soumets un pattern de ce qu'est-ce que tu as dit au haut. Au moins, s'il n'y aurait pas eu d'WAF, ça va peut-être retourner le premier tel quel. OK. Mais ça, ça... Oui. Oui. Oui. Oui. Ah. Oui. Oui. Oui. Oui. Oui. Oui. Oui. Oui. Oui. Oui. Oui. Oui. Oui. Oui. Oui. Oui. Oui. Oui. Oui. Oui. Oui. Oui. Oui. Oui. Oui. Oui. Oui. Oui. Oui. Oui. Oui. Ok, so I'm going to continue to the next section and I have some bonus information for the SQL segment. So the labs include all instruction for the exercise, but if you look at the materials section, you'll see that it's the content that I mostly presented through the slide. And at the end, oh, is it here? Oh, it's in including material. So there are three tools that I didn't mention in the slide, but can be helpful in many contexts. So Cybershift, it's a web-based encoder, but it's really easy to just encode on the fly a few things if you don't have bird or encoder. And even then it's better than most encoders in most proxies. So the big advantage is that you can change encoding so you can specify your input and then drag and drop some encoding so you can do entity encoding and then URL encoding of the final petal and then you get the result. If you want to be efficient in BIRB, I really like to use the BIRB extension acverter and this plugin I'll use to use tag to do nested encoding so you can use basically tags and you can enable, it's not the case by default, but in the repeater you can specify those tags. And when you'll send the request, the extension will transparently encode everything according to the tag you've used. So you don't need to remember the tags, you just right click in your repeater or intruder and you'll have a list of encoding possible, but it will just place those tags. So when you're doing some tests and you're just depending on character doing some tests, it's really nice to be able to just visually see what you're thinking about without having to encode and decode when you want to exit every time. There's another extension, so this can be helpful. I've developed it, it's just a simple further and you can add some additional encoding. It's, you can specify this generator, so usually generator is to generate list of item in BIRB intruder, but what I've done with this extension is I'm taking the selection and I'm generating variation for different encoding. So all character encode with XML entities, URL encode, double URL encode, unicode, special encoding, stuff like that. So if you have a parameter and you want to see what is passing through, you can use this extension. Now the last thing I want to mention, so this was the solution to extract one character at a time for the user table using the web bypass, but we actually have a team that potentially found a way to do a union select, still using the exponent, but along with some special character from what I saw using stash escape character to specify some specific by that with full live injection. So if the solution ever worked, I'm going to add it to this material. But obviously doing, being able to do union select is much more powerful than extracting one character at a time. So this was for this. Back to the slide. Switching protocol. So the two last module are switching protocol, which is a something part of the eq protocol, and it will be very similar to the request modeling case. We'll only have one exercise for switching protocol, because I think it's too much similar to have a different exercise. And as you'll see, it's going to be the same application, but it's going to be much easier to bypass. So what exactly is switching protocol? So switching protocol is a mode of our part of HTTP. So the idea is that from HTTP one, that one, they wanted to support additional protocol. So the idea is that you'll have a regular HTTP request that is sent. So this is part. And as another, you'll specify upgrade with the parameter that is the protocol that you want to upgrade to. So if the server return, it's status code 101, this means that the application is saying, yes, I'm able to upgrade to this protocol. So once this to this request and response is exchanged, within the same HTTP connection, the following bytes are going to be in this protocol. So this is the way a WebSocket works. So you always need to do to send a dummy HTTP request that is just to do the upgrade to WebSocket. And when the web server and return 101, the browser know, okay, the web server is able to speak WebSocket. So from now on, this communication is now a full suplex WebSocket communication. So this can be used to bypass proxies or WAF. Is that sometimes or most WAF will simply look at the status code. And if they see 101, they'll say, okay, it was upgrade to WebSocket. So I'll no longer look at what is the exchange. But sometimes in a case, you'll be able to be able to control the status code. Because sometimes some endpoint will proxy some request to some additional server, and they will reflect the complete response from the external service. And they will also include some others and potentially status code. So that's one possibility, pretty rare. Sometime, you'll be able to, on a specific control and application, so you'll be able to write some code to the provider, the provider. And you'll be able to set a status code that is returned. And if you're able to return 101, even though you are not going to actually do some WebSocket or upgrade to another protocol, you'll fool the proxy, because now from a malicious client, you can do a request to your endpoint that you have created that is returning 101. The proxy will think, okay, it was upgrade to WebSocket or whatever protocol. So I'll no longer inspect the request. And then your same client keep the connection alive and will send an HTTP request. And this will be passed to the application. And the web server can now honor other requests to other part of the application. And Mod Security, Maxi, and MoSwap will not inspect this type of traffic. So there's a lot of connection needed. And the most difficult one is being able to force a status code being returned on the website you are targeting. But this will be possible in cloud infrastructure mainly. Now, another alternative is HTTP ClearText. So this is another protocol because we can upgrade to multiple types of protocol. And sometimes the back end application behind the web is supporting HTTP2. And it will add also HTTP2 ClearText support. So this means that the application will be able to both receive HTTP1 and HTTP2. The malicious actor will initiate an upgrade to HTTP ClearText. So at this time, the web is inspecting all other end requests. So if you have malicious post-memory error and get everything is active. But once the upgrade is completed, then the HTTP traffic will not be inspect because the proxy doesn't simply inspect the upgrade protocol. So this was found. So the credit researcher is in the detailed website. Yeah, I thought it was a duplicate from the previous one. But it's almost the same thing. So the proxy needs to honor 101. And in some cases, I didn't mention it, but it's important. Like, there are some old version of varnish and some proxy that simply didn't honor 101. So that means as soon as they would see an upgrade web socket, they would simply stop to inspect the following request. So this means that even if the website would return 200 OK, then it would simply not inspect. So it was found in a couple of proxies, but these have been patched. So if the proxy is aware of upgrade and honors 101, then this will work. Because if there was an actual upgrade, and often proxies don't support all the upgrade protocol, so they will not inspect our request. So this is the next exercise and last one. So you'll see the application is pretty similar. OK. So it's the same movie application. It's also renowned to S-Pen injection. But here, don't try to use the exponent. You'll be able to use an easier exploit. So if you go to the detailed instruction, there is the script. So you won't be able to, if you are, we're doing exercise from your smartphone, you can from now. But there is this script, H2C smuggler, that are you to specified. This is just for testing. But when you'll be able to, you want to actually do the injection or smuggle your own traffic, you have always two URL that you're specifying. The first one is the URL, which is doing the upgrade. So this is just a dummy request. Usually the root page will work. And then the second one is, once the upgrade is done, you'll be proxying additional traffic. And this will be done over HTTP2, but through the HTTP1 connection. So the same HTTP connection that was open. And this technique, so again, the requirement is that your backend application need to support HTTP2. And this attack vector can bypass mode security, Maxime, and multiple other WAF. And it's pretty easy because you don't need to think about adding some special character including, you're simply bypassing internally. It's a spot that is a blind spot from the WAF. And you're not expecting inspecting this part of the traffic. So first part, detect that Maxime is blocking all traffic. So usually Maxime, the way that it's used in production is that there will be some training part where you're sending some real traffic to your application. And it will add some exception to some parameters that need special character, but everything else will be blocked if you have some special characters. Just adding a single code will be blocked by default, but with some training with Maxime, you can have a working application with the WAF. Here, to show that it's really working, I've configured Maxime, but with no training. So it's blocking all parameters that includes some special character including tags in single code. So, and Maxime returning a forbidden page, it's returning a custom page. When you see Maxime says no, this means that you've been blocked and it detects a malicious character. But with the smuggling to HTTP clear text, you'll see that you'll be able to send your own request and you'll be able to exploit the explanation this way. So good luck. So the script can be found on the repository. So if you look at HTTP clear text, the script is there if you google it, you'll find an official repository for it. The tool is not not so much intuitive, but a bit verbal, so you'll get the response from both requests when you're doing some tests. So always look at the last part of the output to see what's the result. So good luck. So we have the next 20 minutes and then I'll go through some demonstration and you have some snippet of detecting and bypassing the web. You have some extra challenge where try to just extract the MySQL version and I didn't include right away the answer, so I'll shoot in 15 to 20 minutes. So I'll go on the web. So I'll go on the web. So I'll go on the web. So I'll go on the web. So I'll go on the web. So I'll show the solution for the last exercise and then I'll do the final slide and you'll get the bonus 20 minutes to choose if you want to leave or finish the exercise and then I'll go on the web. So so so so so so so so so so so Okay, so here we can see there is some TLS warning, but here it's saying success, it can be tunnel. So this means that the upgrade was successfully working, one-on-one was returned, and then we could have kept the connection and passed additional requests. Then the following URL that we're specifying, this is something that is tunnel true to the application. So actually, you'll be able to specify those like local host or anything. You already have a connection established with the backend application. So you won't be able to access maybe an internal microservice that is not on the same container, but you can specify maybe a different host, different port, but it will be with the active connection. So here I'm using the same host here. So in the output, you'll get two requests. So this is the end of the first one and then you'll see that we're requesting slash for the second request. So this is the tunnel one. So I'll need to look at the URL again. Okay, so if we just want to trigger the weft, this one, the port was 777. So maybe it was a mistake on the slide. So yeah. So if I just specified a single code, we can see that next C is active. It's seeing the single code in the parameter, it's blocking it. Yeah. And one condition we want to test is just or empty string equal single code. So I'll put it in here. So since we know that this is passing true, so just we always want to start with something small that. So here I'll just specify the first movie. By the way, this is a old custom application. That's why all the movies are so old. So okay. So here we can see that in the second request, we get the detailed page for Spiderman movie. So just a proof concept. And then if we are adding R1 equal one, then suddenly we get all the movie description in this detailed page. Inception from everything. So if we want to do a complete expectation, now we're no longer limited to like the previous exercise we were block union keyword select. Now we have access to everything because the weft is not even expecting those query, the HTTP21. So here I'm doing a union select on the movie table. I'm looking for here. And with the select, I'm injecting a dummy line that is where all fields are one. So and this union is adding this entry to the list. So we'll be able to see all the lists of movie and at the end for this entry, the title, the ID, all information will be the one. So now we just need to replace the specific column that is reflected. So here we can use almost anything. And would have been helpful to use a different number. So this way we know where it's reflected. That's like this. So now I'll just, why is it this? Okay, I have no idea. So I'll just base reuse 111 and I'll pick one after and done and see if it's reflected. And here we can see that the second column name is actually the title. So here the adversion is reflected. So this was the small objective that I gave you. So, but basically you can do anything. You can select any table at this point. Maxi is not inspecting request there. So, good luck doing this exercise. I'll jump to the slide too with just finish with the material. Request modeling, it's going to be a very similar to what we saw. It's just that I really see a clear difference between the two attack pattern and the two previous cases are often called request modeling. But the typical request modeling attack pattern involve having some very confusing HTTP requests where you have two content then specified. So early version of this attack attacker will use two contents and other. This is really old version of the attack like end of 2000, 2008, 2008, 2008. And the idea is that the proxy will use the first error, for example, but the backend application receiving the same request would look at the second error. And with this, you can potentially do a request to something that will be blocked by the proxy. The proxy of the log balancer might have some path that they are blocking because it's internal or monitoring path disclosing some information. Yeah, so, and this is mainly because of an implementation detail where the proxy and the application are doing some different implementation parts the same. So this is more an example where it will be a content injection. So the proxy is probably doing some cache as an example. And here, the proxy thinks that it's fetching the index and the test.htm pages. But because the application in the end parsed it differently, it will actually response to a request as if it was requesting a profile information. So it will cache some JSON information as html. So with this cache reasoning, we have potential of phishing and access as possible. But we can use the same pattern to also do web bypass. So that's why I've separated because request smuggling are usually used to do other stuff. So trigger access on other connection of other people. And there are some various other attack pattern with request smuggling, but it's usually a different implication. And web is just one of the aspects. The other one that is more recent, this is a new pattern that was found by somebody and it was presented initially at Devcom and nobody did some noise about it until one year later, James Cato found some additional variation to this attack pattern and then it become better known. So the idea is that in HTTP1, there are multiple ways to specify the length of the body. So you can use that length, but you can also use, since HTTP1.1, transfer and calling chunk. And transfer and calling chunk is when you send data and you don't know the length in advance. So you'll say, okay, this chunk is this length and then you send the data. You'll know when it's complete, when you send a length zero, this means, okay, we don't have anything yet anymore just to send and with length zero all by two new lines, then the connection will be close. The thing is, what happened if a malicious actor send a request with both the length and transfer and calling? The RFC says that you should be always using transfer and calling, but some proxy didn't honor this. And also what was found is that sometimes you can play on some implementation details. So the proxy is actually using in priority transfer and calling, but let's say I'm using, I'm placing a tab right after encoding. It will not pass it as a transfer and calling header. It's invalid, it should have been followed by a semi-talent. So the proxy will ignore it because it has some special characters, but the backend application, let's say for example is Node.js and for some time Node.js allow header separator to be just new line. So you'll have kind of a proxy that are passing either slightly differently. And for this reason, the proxy will interpret the length as something and the application will see a completely different term. And for this reason, this request can be either seen as we're sending this complete chunk of zero to be as one data as a post-monitor, but if we're interpreting it from the transfer and calling header, then we're actually sending two requests instead of one where the first one is end right away because we're sending chunk of that zero. And then it's starting a second request to the admin side. So with this type of pattern, you can also bypass web if you have some rule in your engineics where specific path are blocked. But of course, this is a case where the rule are separated from the application. So if your engineics is doing some reverse proxy to some other application that will be parsing HTTP different. So in conclusion, in this workshop, I wanted to show you just the general principle of what are the different techniques bypass WAF. So I'm hoping that at this point, you know more tricks. And the next time you encounter a WAF, you just don't think about encoding. There are some other vector to think about. So as soon as in your final application there is some encoding or decoding that is done. This is opportunity to add some level of complexity in the request to confuse the proxy. If there is some transformation, so some keyword are replaced or removed by the application. This is additional keyword that you can basically inject in your request to just confuse again the proxy. And instead of encoding would be double encoding. So like that. Forcer implementation is probably the more general description to include request modeling, but also URL parsing. So different language, different platform will often see different protocol differently. So it's really looking at those difference and looking at the implementation that they have done that you can leverage this. WAF is not a silver bullet. So you're not end security right away by installing a WAF. But at the same time, I'm not saying you shouldn't install WAF. As I mentioned in the introduction, WAF is a good way for your cloud par other and you want to provide some quick response to some new coming attacks. So for example, look for shell or shell shock. Any type of web attack that you could think you can provide some level of protection to make it at least harder for the attacker to find those vulnerabilities. So, yeah. And there is more. So you saw a subset. I've tried to include a lot of detail, a lot of reference in the detailed tutorial for the labs, but it's still not everything. So I've included two presentations that are focusing on specific topic. So the first one is purely at all, you can confuse different path that requires differently depending on what library and what container are used to create some patch reversal attack. The second one is purely on a screen injection. Many of the segment that I've present like the reference like all the white space character can be used in different BMS. I've extracted those information from this presentation. This is a more recent one showing a more advanced approach to bypass web for SQL injection. This is a talk purely on how you can implement a fuzzer to detect pattern that are edge cases of EWAS. So this then, so if you have any question, I'll be there until the end and you have the next seven minutes to either complete exercise or take a break, prepare for a lunch or whatever. And I'll keep the application running so until Sunday, but keep in mind, everything is available at this repository to produce it at any time. And if you have issue running any of the Docker instance, open an issue on the GitHub ID. That's it. Thank you.