Я знаю, что ответ очень поздний, но, возможно, кто-то будет искать эту информацию.
Старые версии ASP.NET были уязвимы для атаки Oracle Padding. По-прежнему возможно применить «старое» поведение с помощью некоторых настроек. Я подробно описал их в своем блоге , а пример кода находится на GitHub .
Мы будем атаковать поле VIEWSTATE. Во-первых, вам нужно отключить подпись ViewState. Для этого убедитесь, что у вас есть следующий параметр в файле web.config:
<appSettings>
<add key="aspnet:UseLegacyMachineKeyEncryption" value="true" />
</appSettings>
И пример файла .ashx, уязвимого для атаки Oracle Padding:
<%@ WebHandler Language="C#" Class="EncryptionHandler" %>
using System;
using System.Linq;
using System.Reflection;
using System.Web;
using System.Web.Security;
using System.Text;
public class EncryptionHandler : IHttpHandler
{
static readonly byte[] secret = Encoding.UTF8.GetBytes("Some text to break.");
public void ProcessRequest(HttpContext context)
{
var viewState = context.Request.Form["VIEWSTATE"];
if (viewState == null) {
viewState = MachineKey.Encode(secret, MachineKeyProtection.Encryption);
context.Response.ContentType = "text/html";
context.Response.Write("<!doctype html><html><form action=\"/EncryptionHandler.ashx\" method=\"POST\">" +
"<input type=\"hidden\" name=\"VIEWSTATE\" value=\"" + viewState + "\" />" +
"<input type=\"submit\" value=\"Test\" /></form></html>");
return;
}
var v = MachineKey.Decode(viewState, MachineKeyProtection.Encryption);
context.Response.ContentType = "text/plain";
if (v.SequenceEqual(secret)) {
context.Response.Write("I know the secret");
} else {
context.Response.Write("Something is wrong with my secret.");
}
}
public bool IsReusable {
get {
return false;
}
}
}
Теперь, основываясь на коде HTTP (HTTP 500, когда шифр недействителен), вы можете попытаться атаковать сайт (как описано здесь ).