28 Haziran 2011 Salı

SQL Enjeksiyonunda Kayıt İlerletme

Bir pentest çalışması sırasında MSSQL kullanan bir web uygulamasında SQL Enjeksiyonuna sebebiyet verecek bir girdi doğrulama/filtreleme zaafiyet keşfettim. Web uygulaması muhtelif SQL sorgularını çalışıtrabiliyordu.

INFORMATION_SCHEMA.TABLES tablosundan, tablo isimlerini çekmeye çalıştığımda söyle bir sorunla karşılaştım. SQL sunucu WHERE deyimine yanıt vermiyordu.

Bu durumda SQL e biraz takla attırmam ve aşağıdakine benzer şekilde iç içe sorular kullanmam gerekti.

UNION ALL SELECT TOP 1 1,2,3,(select top 1 table_name FROM (select top 1 table_name from INFORMATION_SCHEMA.TABLES order by table_name ASC) sq order by table_name DESC),4,5,6  --
UNION ALL SELECT TOP 1 1,2,3,(select top 1 table_name FROM (select top 2 table_name from INFORMATION_SCHEMA.TABLES order by table_name ASC) sq order by table_name DESC),4,5,6  --

Bu sorgulardan en içteki select deyimi, top X ifadesi ile tablonun başından X kaydıartan artan sıralamada çekiyor. Bunın dışındaki select deyimi ise ilk sorgunun döndürdüğü kayıtlar içerisinden azalan sıralamada en üstteki kaydı çekiyor. Böylece en içteki sorguda top 1, top 2, top 3 gibi değişiklikler yaparak tablo içerisindeki kayıtlarda adım adım ilerleyebiliyoruz.

Hiç yorum yok:

Yorum Gönder