teisipäev, 21. september 2010

Pimesüstimisautomaadi takistamine veateate edastamise juhusliku viivitamisega

Blind Injection (pimesüstimine) on meetod kus serverisse saadud päringu vastusest ei loe otse välja sind huvitavat infot vaid selle teadasaamiskes tuleb kasutada meetodid, kus näiteks kontrollitakse, kas veateade tuli või ei tulnud.
Pimesüstimise erijuhtum on ajaliselt vastuse saabumise mõõtmine.

Mõned SQL pimesüstimise meetodid on mul kirjeldatud Arvutimaailma artiklis
www.am.ee/sql

Ründaja elu saab raskemaks teha, kui panna teatud juhuslikkus sisse veateate tagastamisse, ehk
web.config failis otsib rida customErrors, kus vigade korral suunab endatehtud veateadete veebilehele,

customErrors defaultRedirect="MinuError.aspx" redirectMode="ResponseRewrite"

MinuError.aspx on veebileht, kuhu kasutaja vea ilmumisel suuname ja sinna ehitab sisse
juhusliku ajalise viivitamise Page_Load meetodisse

//kõigepealt püüab veateate kinni
Exception ex = Server.GetLastError().GetBaseException();
if (ex != null)
{
//tark on veateated kodeerida XSS rünnakute vastu
this.LiteralViga.Text = Server.HtmlEncode(ex.Message.Trim());

// see osa teeb veateate andmisel juhusliku ajalise viivituse, et vältida veateadete vastuste põhjal andmete leket pimesüstimise meetodit kasutades
//veateate vastuse saadame tagasi teatud juhtudel juhusliku pausi järel
byte[] delay = new byte[1];
System.Security.Cryptography.RandomNumberGenerator rnd = new System.Security.Cryptography.RNGCryptoServiceProvider();
rnd.GetBytes(delay);
int viiv = (int)delay[0];

if (viiv < 25) //veateadet ei saada kohe vaid teeb juhusliku pikema ajalise pausi sisse mõningatel juhtudel
{
viiv=viiv*666; //ka mina olen kuri :)
System.Threading.Thread.Sleep(viiv);
IDisposable disposable = rnd as IDisposable;
if (disposable != null)
{ disposable.Dispose(); } //mälu vabaks
}
}

Alati võib ise mõelda välja parema juhusliku numbri genereerimise meetodi ja otsustada kuna viivitust rakendada