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
| Auswirkung | Details |
|---|---|
| Integrität | Bereich: 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
- MITRE Corporation. "CWE-554: ASP.NET Misconfiguration: Not Using Input Validation Framework." https://cwe.mitre.org/data/definitions/554.html
- Microsoft. "ASP.NET Validation Controls."
- OWASP. "Input Validation Cheat Sheet."