Datakent Ana Sayfa
Anasayfa Anasayfa > Diğer bölümler > Microsoft SQL Server
  Aktif Konular Aktif Konular RSS: SQL Injection
  Yardım Yardım  Hızlı Ara   Kayıt Ol Kayıt Ol  Giriş Giriş

SQL Injection

 Yanıt Yaz Yanıt Yaz
Yazar
Mesaj Tersinden sırala
murat turan Açılır Menü Göster
Admin Group
Admin Group
Simge
Datakent

Kayıt Tarihi: 01.Ekim.2003
Bulundugu Yer: Turkey
Online: Sitede Değil
Gönderilenler: 1798
  Alıntı murat turan Alıntı  Yanıt YazCevapla Mesajın Direkt Linki Konu: SQL Injection
    Gönderim Zamanı: 11.Temmuz.2010 Saat 19:39

basit bir tablomuz olsun.

CREATE TABLE [dbo].[users](
 [rid] [int] NOT NULL,
 [username] [varchar](50) NOT NULL,
 [userpwd] [varchar](50) NOT NULL,
 CONSTRAINT [PK_users] PRIMARY KEY CLUSTERED
(
 [rid] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]

ve tabloya 2-3 kayıt girelim.


===== Login formu için =====

<table>
            <tr>
                <td>
                    usr name
                </td>
                <td>
                    :
                </td>
                <td>
                    <asp:TextBox ID="txtUserName" runat="server"></asp:TextBox>
                </td>
            </tr>
            <tr>
                <td>
                    usr password
                </td>
                <td>
                    :
                </td>
                <td>
                    <asp:TextBox ID="txtUserPwd" runat="server" TextMode="Password"></asp:TextBox>
                </td>
            </tr>
            <tr>
                <td>
                    &nbsp;
                </td>
                <td>
                    &nbsp;
                </td>
                <td>
                    <asp:Button ID="Button1" runat="server" Text="Ok" OnClick="Button1_Click" />
                    &nbsp;<asp:Button ID="Button2" runat="server" Text="Cancel" />
                </td>
            </tr>
        </table>
  
===== Login Formunda blunan Button için =====
protected void Button1_Click(object sender, EventArgs e)
    {
        String query = String.Empty;
        Int32 retVl = -1;

        query = String.Format("Select rcx=Count(rid) From dbo.users Where (username = \'{0}\' ) and (userpwd = \'{1}\')",
            txtUserName.Text, txtUserPwd.Text);

        Label1.Text = query; //gonderilecek sorguyu incelemek icin gostertelim.

        String sscon = "Data Source=THEBLACKSEA\\SQLEXPRESS;Initial Catalog=DBTmp;Persist Security Info=True;User ID=sa;Password=123456";

        using (var scon = new SqlConnection(sscon))
        {
            scon.Open();

            using (SqlCommand scom = new SqlCommand(query, scon))
            {
                try
                {
                    retVl = Convert.ToInt32(scom.ExecuteScalar());
                }
                catch (Exception exx)
                {
                    Label3.Text = exx.Message;
                }
            }

            scon.Close();
        }

        //girilen bilgiler SQL server 'dan kontrol edildi. normal koşullarda geriye 1
        //dönmüş ise (bir kayıt bulunduysa) kayıt var mantığı güdülüp sisteme giriş sağlanabilir.
        //bu bloktan sonra geriye dönen kayıt sayısına göre sisteme girişe izin verilecek
        //ve gerekli atamalar yapılıp Response.Redirect("...");
    }

 
şimdi alternatif 1:
kullanıcı adını biliyormuyuz;
biliyorsak "txtUserName" nesnesine kullanıcı adını girdik.
"txtUserPwd" nesnesine
1' or '1'='1
değerini girdik.
bu değer girişleri sonucu Ok dediğinizde girdiğimiz kullanıcının şifresini bilmediğimiz halde geriye 1 değer döndürecek
buda sanki girilen bilgiler geçerli gibi bir etki yaratacak.
kullanıcı adınıda biliyorsanız her iki kutuya benzer değerleri irebilirsiniz.

oları bir adım ilerletelim.
kullanıcıların tutulduğutabloyu biliyoruz sayın.

kullanıcı adını girin parola kısmına aşağıdaki değeri girin.
a'); drop table users;--

bu işlem SQL Server dan "users" tablosunu silecektir. bu ciddi bir atak!

projeler de sadece Login formları için güvenliği sağlamak yeterli değil, bu tür dışarıdan girilebilecek ve sisteme erişmeyi sağlana mekanizmaları devre dışı bırakmanız gerekiyor. sistem bu kontrol mekanizmasını "Stored Procedure" ile yapsaydık bu girişler hiçbir işe yaramayacaktı.

==== olayı birde procedur ile yapalım;

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE PROCEDURE cUsers
 @username varchar(50),
 @userpwd varchar(50)
AS
BEGIN
 SET NOCOUNT ON;

 SELECT COUNT(rid) FROM dbo.users
 WHERE(username = @username) AND (userpwd = @userpwd);
 
END
GO

 

login formuna yazacağımız kod; (procedure erişeceğiz)


    protected void Button2_Click(object sender, EventArgs e)
    {
        Int32 retVl = -1;

        String sscon = "Data Source=THEBLACKSEA\\SQLEXPRESS;Initial Catalog=DBTmp;Persist Security Info=True;User ID=sa;Password=123456";

        using (var scon = new SqlConnection(sscon))
        {
            scon.Open();

            using (SqlCommand scom = new SqlCommand("cUsers", scon))
            {
                scom.CommandType = System.Data.CommandType.StoredProcedure;
                scom.Parameters.Add(new SqlParameter("@username", System.Data.SqlDbType.VarChar,50)).Value = txtUserName.Text;
                scom.Parameters.Add(new SqlParameter("@userpwd", System.Data.SqlDbType.VarChar,50)).Value = txtUserPwd.Text;

                try
                {
                    retVl = Convert.ToInt32(scom.ExecuteScalar());
                }
                catch (Exception exx)
                {
                    Label3.Text = exx.Message;
                }
            }

            scon.Close();
        }

        //dönen değere göre işlem yaptıracağız...
    }
 
 işlem procedure ile yapıldığında üste bahsettiğimiz iki işlemde işe yaramaz hale geliyor...

Yukarı Dön
 Yanıt Yaz Yanıt Yaz

Forum Atla Forum İzinleri Açılır Menü Göster



Bu Sayfa 0,328 Saniyede Yüklendi. [power by : WebWiz]