[C++] Messenger SQL Injection [Tamamen Fix]

  • Konbuyu başlatan Konbuyu başlatan Admin
  • Başlangıç tarihi Başlangıç tarihi
  • Cevaplar Cevaplar 0
  • Görüntüleme Görüntüleme 38

Admin

Metin2Lobby
Yönetici
Founder
Katılım
6 Mayıs 2022
Mesajlar
52,647
Ticaret : 1 / 0 / 0
[Metin2] Messenger SQL Injection [Tamamen Fix]

Tamamlayıcı için kaçış dizisi kullanmıyorsanız bile, işlev haritalarda yardımcı ve hesapta arama yapar. Sonuç pozitif değilse, işlev kendini durduracak ve syserr'de bir günlük yazacaktır.

Bunu messenger_manager.cpp içinde arayın :

Kod:
void MessengerManager::RemoveFromList(MessengerManager::keyA account, MessengerManager::keyA companion)

Bu şekilde değiştirin :

Kod:
void MessengerManager::RemoveFromList(MessengerManager::keyA account, MessengerManager::keyA companion) {     if (companion.empty())         return;     // Second fix     if (m_Relation[account].find(companion) == m_Relation[account].end() || m_InverseRelation[companion].find(account) == m_InverseRelation[companion].end())     {         LPCHARACTER ch = CHARACTER_MANAGER::Instance().FindPC(account.c_str());         if (ch)         {             sys_err("MessengerManager::RemoveFromList: %s tries to use messenger sql injection", ch->GetName());             if (ch->GetDesc())                 ch->GetDesc()->DelayedDisconnect(3);         }         else             sys_err("MessengerManager::RemoveFromList: Omg! The ghost tried to use this function!");         return;     }     sys_log(1, "MessengerManager::RemoveFromList: Remove %s %s", account.c_str(), companion.c_str());     DBManager::instance().Query("DELETE FROM messenger_list%s WHERE account='%s' AND companion = '%s'", get_table_postfix(), account.c_str(), companion.c_str());     __RemoveFromList(account, companion);     TPacketGGMessenger p2ppck;     p2ppck.bHeader = HEADER_GG_MESSENGER_REMOVE;     strlcpy(p2ppck.szAccount, account.c_str(), sizeof(p2ppck.szAccount));     strlcpy(p2ppck.szCompanion, companion.c_str(), sizeof(p2ppck.szCompanion));;     P2P_MANAGER::instance().Send(&p2ppck, sizeof(TPacketGGMessenger)); }

Bu SQL enjeksiyonunu kullanmaya çalışan kimseyi yasaklamak istiyorsanız, işte size bir kod :

Kod:
void MessengerManager::RemoveFromList(MessengerManager::keyA account, MessengerManager::keyA companion) {     if (companion.empty())         return;     // Second fix     if (m_Relation[account].find(companion) == m_Relation[account].end() || m_InverseRelation[companion].find(account) == m_InverseRelation[companion].end())     {         LPCHARACTER ch = CHARACTER_MANAGER::Instance().FindPC(account.c_str());         if (ch)         {             sys_err("MessengerManager::RemoveFromList: %s tries to use messenger sql injection", ch->GetName());             DBManager::Instance().DirectQuery("UPDATE account.account SET status = 'BAN' WHERE id = %u", ch->GetAID());             if (ch->GetDesc())                 ch->GetDesc()->DelayedDisconnect(3);         }         else             sys_err("MessengerManager::RemoveFromList: Omg! The ghost tried to use this function!");         return;     }     sys_log(1, "MessengerManager::RemoveFromList: Remove %s %s", account.c_str(), companion.c_str());     DBManager::instance().Query("DELETE FROM messenger_list%s WHERE account='%s' AND companion = '%s'", get_table_postfix(), account.c_str(), companion.c_str());     __RemoveFromList(account, companion);     TPacketGGMessenger p2ppck;     p2ppck.bHeader = HEADER_GG_MESSENGER_REMOVE;     strlcpy(p2ppck.szAccount, account.c_str(), sizeof(p2ppck.szAccount));     strlcpy(p2ppck.szCompanion, companion.c_str(), sizeof(p2ppck.szCompanion));;     P2P_MANAGER::instance().Send(&p2ppck, sizeof(TPacketGGMessenger)); }

C++ Messenger Sistemlerinde SQL Injection Güvenlik Açığını Tamamen Kapatma Rehberi


Giriş
Metin2 özel sunucularında güvenlik en kritik konulardan biridir. Özellikle kullanıcıların giriş yaptığı sistemlerde SQL Injection gibi açıklar büyük riskler doğurabilir. Bu yazıda, C++ tabanlı Messenger sistemlerinde yaşanan SQL Injection sorununu tamamen düzeltmeyi ele alacağız. Bu rehber, Metin2Lobby topluluğu için hazırlanmış, derinlemesine bir güvenlik incelemesi sunar.

SQL Injection Nedir?
SQL Injection, saldırganların arka uç veritabanına zararlı SQL komutları göndererek veri çalmalarına veya silmelerine neden olan bir güvenlik zaafiyetidir. Metin2 özel sunucu sistemlerinde, genellikle kullanıcı adları, mesajlar veya diğer dinamik veriler SQL yoluyla veritabanına yazılır. Eğer bu veriler uygun şekilde filtrelenmezse, saldırganlar INSERT, UPDATE veya DELETE komutları ile veritabanını istismar edebilirler.

Messenger Sistemi ve Potansiyel Tehditler
Metin2 özel sunucularında, kullanıcılar arasında mesajlaşma işlemleri genellikle bir messenger modülü üzerinden yürütülür. Bu sistem, kullanıcı adı, mesaj içeriği gibi verileri veritabanına kaydeder. Eğer bu veriler doğrudan SQL sorgusuna entegre edilirse ve uygun kontroller yapılmazsa, saldırganlar mesaj kutusu üzerinden SQL injection saldırısı yapabilir.

Örnek Tehlikeli Kod
Aşağıdaki örnek, SQL injection'a açık bir C++ kod parçasıdır:
Kod:
[B][COLOR=orange]char query[512];[BR][/BR]sprintf(query, "INSERT INTO messenger VALUES ('%s', '%s');", username, message);[/COLOR][/B]

Bu kod, kullanıcıdan gelen verileri doğrudan sorguya eklediği için büyük bir güvenlik açığıdır. Örneğin kullanıcı, 'message' kısmına '); DROP TABLE messenger; -- gibi bir değer girerse, tüm tabloyu silme komutu çalıştırılabilir.

SQL Injection'u Tamamen Engelleme Yöntemleri
1. Prepared Statements Kullanımı
Prepared statements (hazırlanmış ifadeler), SQL injection saldırılarına karşı en etkili koruma yöntemlerinden biridir. C++ ile MySQL bağlantısı kurarken, mysql_stmt_bind_param fonksiyonu ile parametreler ayrı olarak bağlanmalıdır.

2. Girdi Filtreleme
Kullanıcıdan gelen verileri işlerken, özel karakterlerin temizlenmesi veya kaçış karakterleriyle korunması önemlidir. Örneğin, mysql_real_escape_string fonksiyonu kullanılabilir.

3. Veritabanı Yetkilendirme
Messenger sisteminin kullandığı veritabanı kullanıcısının sadece gerekli izinlere sahip olması sağlanmalıdır. Örneğin, DROP, ALTER gibi tehlikeli komutlara erişim olmamalıdır.

Pratik Uygulama: Güvenli C++ Kodu
Aşağıda, güvenli bir şekilde SQL injection'a karşı korunmuş bir C++ örneği verilmiştir:
Kod:
[B][COLOR=green]MYSQL_STMT *stmt = mysql_stmt_init(conn);[BR][/BR]const char *query = "INSERT INTO messenger (username, message) VALUES (?, ?)";[BR][/BR]mysql_stmt_prepare(stmt, query, strlen(query));[BR][/BR]mysql_stmt_bind_param(stmt, params);[BR][/BR]mysql_stmt_execute(stmt);[/COLOR][/B]

Bu kod sayesinde, kullanıcıdan gelen veriler doğrudan sorguya dahil edilmez, dolayısıyla SQL injection mümkün olmaz.

Sonuç
Metin2 özel sunucularında güvenlik, sistem performansı kadar önemlidir. Messenger sistemlerinde SQL injection açıklarını önlemek, kullanıcı verilerini korumak ve sunucu güvenliğini artırmak açısından kritik öneme sahiptir. Yukarıda anlatılan teknikler sayesinde, güvenlik açıklarını minimum seviyeye indirebilir ve profesyonel bir sunucu yönetimi sağlayabilirsiniz.

Kaynak: Metin2Lobby - Metin2 Development & Security Hub


How to Fully Fix SQL Injection Vulnerability in C++ Messenger Systems


Introduction
Security is one of the most critical aspects in Metin2 private servers. Especially in user-input systems, vulnerabilities like SQL Injection can cause major risks. In this article, we will address how to completely fix SQL Injection issues in C++ based Messenger systems. This guide provides an in-depth security analysis prepared for the Metin2Lobby community.

What is SQL Injection?
SQL Injection is a security vulnerability where attackers inject malicious SQL commands into the database backend to steal or delete data. In Metin2 private servers, usernames, messages, and other dynamic data are often written to the database via SQL queries. If these inputs are not properly filtered, attackers can exploit the database by sending INSERT, UPDATE, or DELETE commands through message fields.

Messenger System and Potential Threats
In Metin2 private servers, messaging between users is typically handled by a messenger module. This system stores data such as usernames and message content in the database. If this data is directly inserted into SQL queries without proper checks, attackers may execute SQL injection attacks through the message box.

Example Vulnerable Code
The following code snippet shows a vulnerable C++ code open to SQL injection:
Kod:
[B][COLOR=orange]char query[512];[BR][/BR]sprintf(query, "INSERT INTO messenger VALUES ('%s', '%s');", username, message);[/COLOR][/B]

This code directly inserts user input into the query, creating a significant security flaw. For example, if the user enters '); DROP TABLE messenger; -- in the 'message' field, it could execute a command to drop the entire table.

Methods to Completely Prevent SQL Injection
1. Use Prepared Statements
Prepared statements are one of the most effective defenses against SQL injection. When connecting to MySQL with C++, parameters should be bound separately using functions like mysql_stmt_bind_param.

2. Input Filtering
When processing user input, special characters should be sanitized or escaped using functions like mysql_real_escape_string.

3. Database Authorization
The database user account used by the messenger system should only have necessary permissions. For example, it should not have access to dangerous commands like DROP or ALTER.

Practical Implementation: Secure C++ Code
Below is a secure C++ example that prevents SQL injection:
Kod:
[B][COLOR=green]MYSQL_STMT *stmt = mysql_stmt_init(conn);[BR][/BR]const char *query = "INSERT INTO messenger (username, message) VALUES (?, ?)";[BR][/BR]mysql_stmt_prepare(stmt, query, strlen(query));[BR][/BR]mysql_stmt_bind_param(stmt, params);[BR][/BR]mysql_stmt_execute(stmt);[/COLOR][/B]

With this code, user inputs are not directly embedded into the query, thus preventing SQL injection.

Conclusion
In Metin2 private servers, security is as important as system performance. Preventing SQL injection vulnerabilities in messenger systems is crucial for protecting user data and enhancing server security. With the techniques described above, you can minimize security flaws and achieve professional server management.

Source: Metin2Lobby - Metin2 Development & Security Hub
 

Şuan Bu Konuyu Görüntüleyen Kullanıcılar (Toplam : 0, Üye : 0, Misafir : 0)

Benzer konular

Geri
Üst Alt