ASP.NET-Fehlkonfiguration: Keine Verwendung des Input-Validierungs-Frameworks

Beschreibung

ASP.NET-Fehlkonfiguration: Keine Verwendung des Input-Validierungs-Frameworks ist eine Schwachstelle, bei der eine ASP.NET-Anwendung das integrierte Validierungs-Framework zur Überprüfung von Benutzereingaben nicht nutzt. ASP.NET bietet umfassende Validierungskontrollen und -mechanismen zur Verifizierung von Eingabedaten vor der Verarbeitung. Wenn Entwickler diese Frameworks umgehen oder ignorieren, müssen sie die Validierung manuell implementieren - oft unvollständig oder fehlerhaft. Diese Auslassung führt zu verschiedenen Injektions-Schwachstellen einschließlich Cross-Site-Scripting (XSS), SQL-Injection, Command-Injection und anderen eingabebasierten Angriffen.

Risiko

Die Nichtverwendung des ASP.NET-Input-Validierungs-Frameworks erzeugt erhebliche Sicherheitsrisiken. Manuell implementierte Validierung ist oft inkonsistent, unvollständig oder enthält Umgehungsmöglichkeiten. Entwickler können vergessen, alle Eingabepunkte zu validieren oder die Validierung falsch implementieren. Ohne Framework-Level-Validierung können bösartige Eingaben Datenbankabfragen erreichen und SQL-Injection verursachen, in Seiten reflektiert werden und XSS verursachen, oder vom System verarbeitet werden und Command-Injection ermöglichen.

Lösung

Implementieren Sie das ASP.NET-Validierungs-Framework umfassend an allen Eingabepunkten. Verwenden Sie Validierungskontrollen wie RequiredFieldValidator, RangeValidator, RegularExpressionValidator, CompareValidator und CustomValidator auf allen Web-Formularen. Aktivieren Sie Request-Validation auf Anwendungsebene und vermeiden Sie deren Deaktivierung, es sei denn, es ist absolut notwendig mit geeigneten Alternativen. Verwenden Sie Model-Validation mit Data-Annotations in MVC-Anwendungen. Implementieren Sie Input-Validation sowohl client- als auch serverseitig.

Häufige Auswirkungen

AuswirkungDetails
IntegritätBereich: Integrität

Unerwarteter Zustand - Ungeprüfte Eingaben führen zu Cross-Site-Scripting, Prozesssteuerung und SQL-Injection-Schwachstellen, die unerwarteten Anwendungszustand und Datenintegritätsverletzungen verursachen.

Beispielcode

Verwundbarer Code

<%-- Verwundbar: ASP.NET Web Form ohne Validierung --%>
<%@ Page Language="C#" AutoEventWireup="true" %>
<html>
<body>
    <form id="form1" runat="server">
        <!-- Verwundbar: Keine Validierung auf Feldern -->
        <div>
            <label>Benutzername:</label>
            <asp:TextBox ID="txtUsername" runat="server" />
            <!-- Fehlt: RequiredFieldValidator, RegularExpressionValidator -->
        </div>

        <div>
            <label>E-Mail:</label>
            <asp:TextBox ID="txtEmail" runat="server" />
            <!-- Fehlt: E-Mail-Format-Validierung -->
        </div>

        <div>
            <label>Alter:</label>
            <asp:TextBox ID="txtAge" runat="server" />
            <!-- Fehlt: RangeValidator für numerischen Bereich -->
        </div>

        <asp:Button ID="btnSubmit" runat="server" Text="Registrieren"
                    OnClick="btnSubmit_Click" />
    </form>
</body>
</html>
// Verwundbar: Code-Behind ohne Validierung
public partial class Registration : System.Web.UI.Page
{
    protected void btnSubmit_Click(object sender, EventArgs e)
    {
        // Verwundbar: Direkte Verwendung unvalidierter Eingaben
        string username = txtUsername.Text;
        string email = txtEmail.Text;
        string age = txtAge.Text;

        // Verwundbar: SQL-Injection
        string query = "INSERT INTO Users (Username, Email, Age) " +
                      $"VALUES ('{username}', '{email}', {age})";
        ExecuteQuery(query);

        // Verwundbar: XSS bei Rückanzeige
        Response.Write($"<h2>Willkommen, {username}!</h2>");
    }
}
// Verwundbar: ASP.NET MVC ohne Model-Validierung
public class VerwundbarerUserController : Controller
{
    [HttpPost]
    public ActionResult Register(string username, string email, int age)
    {
        // Verwundbar: Keine Validierung vor Verarbeitung
        var query = $"INSERT INTO Users VALUES ('{username}', '{email}', {age})";
        db.Database.ExecuteSqlCommand(query);

        ViewBag.Message = $"Willkommen {username}!";  // Verwundbar: XSS
        return View();
    }
}

// Verwundbar: Model ohne Validierungsattribute
public class UserModel
{
    public string Username { get; set; }  // Kein [Required], [StringLength]
    public string Email { get; set; }      // Kein [EmailAddress]
    public int Age { get; set; }           // Kein [Range]
}

Lösungscode

<%-- Behoben: ASP.NET Web Form mit umfassender Validierung --%>
<%@ Page Language="C#" AutoEventWireup="true" ValidateRequest="true" %>
<html>
<body>
    <form id="form1" runat="server">
        <asp:ValidationSummary ID="ValidationSummary1" runat="server"
            HeaderText="Bitte korrigieren Sie folgende Fehler:"
            DisplayMode="BulletList" CssClass="validation-summary" />

        <div>
            <label>Benutzername:</label>
            <asp:TextBox ID="txtUsername" runat="server" MaxLength="50" />
            <!-- Behoben: Pflichtfeld-Validierung -->
            <asp:RequiredFieldValidator ID="rfvUsername" runat="server"
                ControlToValidate="txtUsername"
                ErrorMessage="Benutzername ist erforderlich"
                Display="Dynamic" CssClass="error" />
            <!-- Behoben: Format-Validierung -->
            <asp:RegularExpressionValidator ID="revUsername" runat="server"
                ControlToValidate="txtUsername"
                ValidationExpression="^[a-zA-Z0-9_]{3,50}$"
                ErrorMessage="Benutzername muss 3-50 alphanumerische Zeichen sein"
                Display="Dynamic" CssClass="error" />
        </div>

        <div>
            <label>E-Mail:</label>
            <asp:TextBox ID="txtEmail" runat="server" MaxLength="100" />
            <asp:RequiredFieldValidator ID="rfvEmail" runat="server"
                ControlToValidate="txtEmail"
                ErrorMessage="E-Mail ist erforderlich"
                Display="Dynamic" CssClass="error" />
            <!-- Behoben: E-Mail-Format-Validierung -->
            <asp:RegularExpressionValidator ID="revEmail" runat="server"
                ControlToValidate="txtEmail"
                ValidationExpression="^[\w.-]+@[\w.-]+\.[a-zA-Z]{2,}$"
                ErrorMessage="Bitte geben Sie eine gültige E-Mail-Adresse ein"
                Display="Dynamic" CssClass="error" />
        </div>

        <div>
            <label>Alter:</label>
            <asp:TextBox ID="txtAge" runat="server" MaxLength="3" />
            <!-- Behoben: Bereichs-Validierung -->
            <asp:RangeValidator ID="rvAge" runat="server"
                ControlToValidate="txtAge"
                MinimumValue="13" MaximumValue="120"
                Type="Integer"
                ErrorMessage="Alter muss zwischen 13 und 120 liegen"
                Display="Dynamic" CssClass="error" />
        </div>

        <asp:Button ID="btnSubmit" runat="server" Text="Registrieren"
                    OnClick="btnSubmit_Click" />
    </form>
</body>
</html>
// Behoben: Code-Behind mit ordnungsgemäßer Validierung
using System.Web.Security.AntiXss;

public partial class Registration : System.Web.UI.Page
{
    protected void btnSubmit_Click(object sender, EventArgs e)
    {
        // Behoben: Seitenvalidierung prüfen
        if (!Page.IsValid)
        {
            return;
        }

        // Behoben: Parametrisierte Abfragen verwenden
        using (var connection = new SqlConnection(connectionString))
        {
            var command = new SqlCommand(
                "INSERT INTO Users (Username, Email, Age) " +
                "VALUES (@Username, @Email, @Age)", connection);

            command.Parameters.AddWithValue("@Username", txtUsername.Text.Trim());
            command.Parameters.AddWithValue("@Email", txtEmail.Text.Trim());
            command.Parameters.AddWithValue("@Age", int.Parse(txtAge.Text));

            connection.Open();
            command.ExecuteNonQuery();
        }

        // Behoben: HTML-Kodierung der Ausgabe
        string encodedUsername = AntiXssEncoder.HtmlEncode(txtUsername.Text, true);
        Response.Write($"<h2>Willkommen, {encodedUsername}!</h2>");
    }
}
// Behoben: ASP.NET MVC mit Model-Validierung
using System.ComponentModel.DataAnnotations;

// Behoben: Model mit Validierungsattributen
public class UserModel
{
    [Required(ErrorMessage = "Benutzername ist erforderlich")]
    [StringLength(50, MinimumLength = 3,
        ErrorMessage = "Benutzername muss 3-50 Zeichen haben")]
    [RegularExpression(@"^[a-zA-Z0-9_]+$",
        ErrorMessage = "Benutzername kann nur Buchstaben, Zahlen und Unterstriche enthalten")]
    public string Username { get; set; }

    [Required(ErrorMessage = "E-Mail ist erforderlich")]
    [EmailAddress(ErrorMessage = "Bitte geben Sie eine gültige E-Mail-Adresse ein")]
    [StringLength(100)]
    public string Email { get; set; }

    [Required(ErrorMessage = "Alter ist erforderlich")]
    [Range(13, 120, ErrorMessage = "Alter muss zwischen 13 und 120 liegen")]
    public int Age { get; set; }
}

// Behoben: Controller mit Validierung
public class UserController : Controller
{
    [HttpPost]
    [ValidateAntiForgeryToken]  // Behoben: CSRF-Schutz
    public ActionResult Register(UserModel model)
    {
        // Behoben: Model-Validierung prüfen
        if (!ModelState.IsValid)
        {
            return View(model);
        }

        // Behoben: Entity Framework für parametrisierte Abfragen
        using (var context = new AppDbContext())
        {
            var user = new User
            {
                Username = model.Username.Trim(),
                Email = model.Email.Trim(),
                Age = model.Age
            };
            context.Users.Add(user);
            context.SaveChanges();
        }

        TempData["Message"] = model.Username;
        return RedirectToAction("Success");
    }
}

CVE-Beispiele

Keine spezifischen CVEs für diese CWE, aber Input-Validierungsfehler in ASP.NET-Anwendungen haben zu zahlreichen XSS- und SQL-Injection-Schwachstellen beigetragen.


Referenzen

  1. MITRE Corporation. "CWE-554: ASP.NET Misconfiguration: Not Using Input Validation Framework." https://cwe.mitre.org/data/definitions/554.html
  2. Microsoft. "ASP.NET Validation Controls."
  3. OWASP. "Input Validation Cheat Sheet."