[FIX] SQL Silme Açığı

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

Admin

Metin2Lobby
Yönetici
Founder
Katılım
6 Mayıs 2022
Mesajlar
52,647
Ticaret : 1 / 0 / 0
Yeni bir açık çıkmış sanırım çakma lamer-hacker'ların mutluluğu pek uzun sürmeyecek gibi gözüküyor...


2089 Game Core kullananlar için DIFF
Kod:
game_2089M 0010F5C3: 31 EB 0010F5C4: C0 09



33820 Database Core (Singapore) kullananlar için DIFF


Kod:
This difference file is created by The Interactive Disassembler db_r33820_32_u 000925A5: 01 00


34083 Game Core (Singapore) kullananlar için DIFF

Kod:
This difference file is created by The Interactive Disassembler game_r34083_32 0040DFE5: 01 00

Source (2013 YMIR) kullananlar için anlatım

game/src kısmından messenger_manager.cpp dosyası açılır ve aratılır;
Kod:
void MessengerManager::RemoveFromList(MessengerManager::keyA account, MessengerManager::keyA companion)
Bu kısım;
Kod:
void MessengerManager::RemoveFromList(MessengerManager::keyA account, MessengerManager::keyA companion) {     if (companion.size() == 0)         return;     sys_log(1, "Messenger 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 kod ile değiştirilir;



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)); }
game/src kısmından guild_manager.cpp açılır ve aratılır;
Kod:
DWORD CGuildManager::CreateGuild(TGuildCreateParameter& gcp)
Bu kısım;
Kod:
DWORD CGuildManager::CreateGuild(TGuildCreateParameter& gcp) {     if (!gcp.master)         return 0;     if (!check_name(gcp.name))     {         gcp.master->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("<길ëâÅ> 길ëâÅ ì´ë¦âì´ ì í⢩íâ¢Ëì§â¬ ìâ¢Å ìÅ µëâ¹Ëë⹤."));         return 0;     }     std::auto_ptr<SQLMsg> pmsg(DBManager::instance().DirectQuery("SELECT COUNT(*) FROM guild%s WHERE name = '%s'",                 get_table_postfix(), gcp.name));     if (pmsg->Get()->uiNumRows > 0)     {         MYSQL_ROW row = mysql_fetch_row(pmsg->Get()->pSQLResult);         if (!(row[0] && row[0][0] == '0'))         {             gcp.master->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("<길ëâÅ> ì´ë¯¸ ê°â¢ì⬠ì´ë¦âìË ê¸¸ëâÅê°â¬ ìËìÅ µëâ¹Ëë⹤."));             return 0;         }     }     else     {         gcp.master->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("<길ëâÅ> 길ëâÅ를 ìÆìâ±í⢠ ìËË ìââ ìÅ µëâ¹Ëë⹤."));         return 0;     }     // new CGuild(gcp) queries guild tables and tell dbcache to notice other game servers.     // other game server calls CGuildManager::LoadGuild to load guild.     CGuild * pg = M2_NEW CGuild(gcp);     m_mapGuild.insert(std::make_pair(pg->GetID(), pg));     return pg->GetID(); }
Bu kod ile değiştirilir.
Kod:
DWORD CGuildManager::CreateGuild(TGuildCreateParameter& gcp) {     if (!gcp.master)         return 0;     if (!check_name(gcp.name))     {         gcp.master->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("<길ëâÅ> 길ëâÅ ì´ë¦âì´ ì í⢩íâ¢Ëì§â¬ ìâ¢Å ìÅ µëâ¹Ëë⹤."));         return 0;     }     static char __escape_name[GUILD_NAME_MAX_LEN * 2 + 1];     DBManager::instance().EscapeString(__escape_name, sizeof(__escape_name), static_cast<const char *>(gcp.name),     sizeof(gcp.name));     std::auto_ptr<SQLMsg> pmsg(DBManager::instance().DirectQuery("SELECT COUNT(*) FROM guild%s WHERE name = '%s'",                 get_table_postfix(), __escape_name));     if (pmsg->Get()->uiNumRows > 0)     {         MYSQL_ROW row = mysql_fetch_row(pmsg->Get()->pSQLResult);         if (!(row[0] && row[0][0] == '0'))         {             gcp.master->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("<길ëâÅ> ì´ë¯¸ ê°â¢ì⬠ì´ë¦âìË ê¸¸ëâÅê°â¬ ìËìÅ µëâ¹Ëë⹤."));             return 0;         }     }     else     {         gcp.master->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("<길ëâÅ> 길ëâÅ를 ìÆìâ±í⢠ ìËË ìââ ìÅ µëâ¹Ëë⹤."));         return 0;     }     // new CGuild(gcp) queries guild tables and tell dbcache to notice other game servers.     // other game server calls CGuildManager::LoadGuild to load guild.     CGuild * pg = M2_NEW CGuild(gcp);     m_mapGuild.insert(std::make_pair(pg->GetID(), pg));     return pg->GetID(); }

Metin2 sunucularında güvenlik açıklarının önlenmesi, hem oyuncu verilerinin korunması hem de sunucu kararlılığının sağlanması açısından kritik öneme sahiptir. Bu bağlamda, SQL Silme Açığı gibi güvenlik açıklarının tespit edilip giderilmesi büyük önem taşır. Bu yazıda, SQL Silme Açığı nedir, nasıl oluşur, nasıl tespit edilir ve nasıl düzeltilir konularına değineceğiz.

SQL Silme Açığı Nedir?
SQL Silme Açığı, kötü niyetli kullanıcıların, SQL sorguları aracılığıyla veritabanından istenmeyen veri silmesine neden olan bir güvenlik zafiyetidir. Özellikle Metin2 özel sunucularında, oyuncu verileri, envanter bilgileri, karakter istatistikleri gibi önemli veriler veritabanında saklanır. Eğer SQL sorguları doğru şekilde filtrelenmezse, saldırganlar bu açıkları kullanarak oyuncu envanterlerini silmek, karakterleri silmek veya hatta tüm veritabanını etkileyebilecek işlemler gerçekleştirebilirler.

SQL Silme Açığının Oluşum Nedenleri
Genellikle bu tür açıklar, kullanıcıdan gelen verilerin yeterince kontrol edilmemesiyle ortaya çıkar. Örneğin bir karakter silme işlemi sırasında kullanıcıdan alınan karakter ID'si doğrudan SQL sorgusuna entegre edilirse ve bu veri filtrelenmezse, bir saldırgan özel karakterler (örneğin ' veya -- ) ekleyerek sorguyu manipüle edebilir. Böylece sorgu, sadece belirtilen karakteri değil, tüm karakterleri veya farklı tablolardaki verileri de silebilir.

SQL Silme Açığını Tespit Etme Yöntemleri
Açıkları tespit etmek için öncelikle sunucu loglarını analiz etmek gerekir. Olağandışı DELETE veya UPDATE sorguları, birden fazla karakterin aynı anda silinmesi gibi durumlar dikkat çekici olabilir. Ayrıca manuel testlerle, bazı giriş alanlarına özel karakterler girilerek sistem tepkisi gözlemlenebilir. Bu testler sırasında dikkatli olunmalıdır çünkü yanlışlıkla veri kaybına neden olunabilir.

Açığın Giderilmesi: FIX Uygulamaları
SQL silme açıklarını düzeltmenin en etkili yolu, kullanıcıdan gelen tüm verileri uygun şekilde filtrelemek ve doğrulamaktır. Bunun için aşağıdaki adımlar önerilir:

- Girdi doğrulaması (input validation) yapılır. Kullanıcıdan gelen veri, yalnızca izin verilen karakterleri içeriyor mu kontrol edilmelidir.
- Prepared statements (hazırlanmış sorgular) kullanılmalıdır. Bu yöntem, kullanıcı verisinin doğrudan SQL sorgusuna eklenmesini engeller.
- Gerekli olduğunda escape fonksiyonları kullanılmalıdır. Özellikle eski sistemlerde bu yöntem geçerli olabilir.

Metin2 Sunucularında Güvenlik Uygulamaları
Metin2 özel sunucularında, güvenlik açıklarını önlemek için hem C++ hem de Python seviyesinde kontroller yapılmalıdır. Örneğin, game core kısmında karakter silme işlemleri, db core ile iletişim kurarken SQL sorguları dikkatlice hazırlanmalıdır. Aynı zamanda auth server[/BR] ve game server arasında da güvenli veri aktarımı sağlanmalıdır.

Sonuç
SQL Silme Açığı, Metin2 özel sunucularında ciddi veri kayıplarına yol açabilecek bir güvenlik sorunudur. Bu tür açıkların önlenmesi için düzenli kod incelemeleri, log analizleri ve güvenlik testleri yapılmalıdır. Geliştiricilerin bu konuda duyarlı davranması, hem sunucunun kararlılığını hem de oyuncu memnuniyetini artıracaktır.


Metin2 server security is critical for protecting player data and maintaining server stability. In this context, fixing vulnerabilities such as SQL Deletion Vulnerability is of great importance. In this article, we will discuss what SQL Deletion Vulnerability is, how it occurs, how to detect it, and how to fix it.

What Is SQL Deletion Vulnerability?
SQL Deletion Vulnerability is a security flaw that allows malicious users to delete unintended data from the database via SQL queries. In Metin2 private servers, important data such as player information, inventory details, character stats are stored in databases. If SQL queries are not properly filtered, attackers can exploit these vulnerabilities to delete player inventories, characters, or even affect entire database tables.

How Does SQL Deletion Vulnerability Occur?
These types of vulnerabilities typically arise when user inputs are not properly validated. For example, if a character ID received during a character deletion process is directly inserted into an SQL query without filtering, an attacker could manipulate the query by adding special characters (e.g., ' or -- ). This may cause the query to delete not only the intended character but also other characters or even entire database tables.

Methods for Detecting SQL Deletion Vulnerabilities
To detect these vulnerabilities, server logs must be analyzed. Unusual DELETE or UPDATE queries, or multiple characters being deleted simultaneously, can be warning signs. Additionally, manual tests can be conducted by entering special characters into input fields and observing the system's response. Care should be taken during these tests to avoid accidental data loss.

Fixing the Vulnerability: Recommended Practices
The most effective way to fix SQL deletion vulnerabilities is to properly validate and filter all user inputs. The following steps are recommended:

- Input validation should be performed. User inputs should be checked to ensure they contain only allowed characters.
- Prepared statements should be used. This prevents user input from being directly embedded into SQL queries.
- When necessary, escape functions should be applied. This method might be useful especially in older systems.

Security Measures in Metin2 Servers
In Metin2 private servers, security checks should be implemented both at C++ and Python levels. For example, character deletion operations handled within the game core should interact with the db core using carefully prepared SQL queries. Furthermore, secure data transfer between the auth server and game server should be ensured.

Conclusion
SQL Deletion Vulnerability is a serious security issue in Metin2 private servers that can lead to significant data losses. To prevent such vulnerabilities, regular code reviews, log analyses, and security tests should be conducted. Developers being vigilant about these issues will enhance both server stability and player satisfaction.
 

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

Benzer konular

Geri
Üst Alt