Skocz do zawartości
Masz już aplikację Sharegon?

Odkryj wszystkie możliwości. Dowiedz się więcej

Sharegon.pl

Zainstaluj aplikację Sharegon i korzystaj z powiadomień push oraz licznika nowych aktywności bezpośrednio z ekranu głównego.

Aby zainstalować tę aplikację na iOS i iPadOS.
  1. Tap the Share icon in Safari
  2. Przewiń menu i stuknij Dodaj do ekranu początkowego.
  3. Stuknij Dodaj w prawym górnym rogu.
Zainstaluj aplikację Sharegon na Androidzie
  1. Otwórz Sklep Google Play na swoim smarfonie.
  2. Wyszukaj „Sharegon” w pasku wyszukiwania.
  3. Stuknij „Zainstaluj”, aby pobrać aplikację.

Naprawa luki bezpieczeństwa w systemie autoryzacji do ACP

Featured Replies

Opublikowano

image.png.a144663d4007d16872d3413c4a1a8bf3.png

 

Cześć wszystkim, 

 

Dziś zajmiemy się problemem, który może powodować dodatkowe obciążenie dla naszego serwera. Chodzi o błąd, który pozwala na utrzymywanie otwartych połączeń bez odpowiednich uprawnień.

Kiedy ktoś wykorzysta ten błąd, może wysyłać do naszego serwera wiele pakietów. Serwer będzie musiał odpowiadać na każdy pakiet, co może spowodować jego zablokowanie.

Aby rozwiązać ten problem, musimy zadbać o to, aby połączenia były zamykane.

 

 

Implementacja:

📂 Lokalizacja pliku: 'game -> input.cpp'

 

🔍 Szukaj

Tylko zalogowani Zaloguj się, aby wyświetlić chronioną treść Ten post zawiera treści dostępne tylko dla członków. Zaloguj się lub utwórz konto, aby odblokować całą zawartość tego posta. Zaloguj się Utwórz konto

 

Mamy tutaj warunek, który sprawdza, czy użytkownik próbujący wejść na stronę administratora ma odpowiednie uprawnienia. Jeśli nie, rejestruje próbę dostępu i zwraca -1, co oznacza brak dostępu.

Niestety, warunek ten nie zamyka połączenia, gdy użytkownik nie ma uprawnień do dostępu. Może to spowodować, że serwer będzie obciążony, zwłaszcza jeśli ktoś celowo wykorzysta ten błąd i będzie próbował połączyć się z serwerem tysiące razy bez uprawnień.

 

 

Zrobimy też bardziej profesjonalny log, który będzie odrębny dla 'IsEmptyAdminPage' i 'IsAdminPage'.

 

♻️ Zamień

 

🔍 Szukaj

 

♻️ Zamień

 

 🗒️Podgląd implementacji:

[hide]

Spoiler

[/hide]

Opublikowano

Dziękujemy!

U mnie to wygląda tak i teraz mam dwa razy "podobne" ale bez 

return -1;

@SevenceMógłbym prosić o wsparcie techniczne działu telekomunikacji miejskiej 😄

Spoiler

 

Edytowane przez ExoCarossa

Opublikowano

Szacunek i podziękowania za udostępnienie tego fixa – uratowałeś moje wieczory z debugowaniem tego błędu!

 

Opublikowano

Po dodaniu tego mam odpalone channele, db, auth ALE nie zaloguje się do gry bo wisi na połączeniu xD. Załączyłem całą funkcje z input.cpp 

Możliwe że ja jestem tak bardzo odklejony..

 

Spoiler

 

Opublikowano
W dniu 23.11.2023 o 21:31, ExoCarossa napisał(a):

Po dodaniu tego mam odpalone channele, db, auth ALE nie zaloguje się do gry bo wisi na połączeniu xD. Załączyłem całą funkcje z input.cpp 

Możliwe że ja jestem tak bardzo odklejony..

 

  Pokaż ukrytą zawartość

 


Możesz porównać sobie z moim lecz widzę że źle wgrałeś.
https://pastebin.com/nNfL1eBZ



A co to za kod? chyba to może kolidować.

CKod został skopiowany
    if (bHeader == HEADER_CG_TEXT)    {        ++c_pData;        const char * c_pSep;


U mnie to tak wygląda prawidłowo :
 

CKod został skopiowany
int CInputHandshake::Analyze(LPDESC d, BYTE bHeader, const char * c_pData){    if (bHeader == 10)         return 0;     if (bHeader == HEADER_CG_TEXT)    { //naprawa-luki-bezpieczeństwa-w-systemie-autoryzacji-do-acp                const int ACCESS_DENIED_ERROR_CODE = -1;                if (IsEmptyAdminPage())                 {                    sys_log(0, "ACCESS DENIED: Attempt to access Admin Panel failed - Panel Configuration Missing. IP: %s, Host: %s", inet_ntoa(d->GetAddr().sin_addr), d->GetHostName());                    d->SetPhase(PHASE_CLOSE);                    return ACCESS_DENIED_ERROR_CODE;                }                 if (!IsAdminPage(inet_ntoa(d->GetAddr().sin_addr)))                 {                    sys_log(0, "ACCESS DENIED: Unauthorized Admin Panel Access Attempt. IP: %s, Host: %s", inet_ntoa(d->GetAddr().sin_addr), d->GetHostName());                    d->SetPhase(PHASE_CLOSE);                    return ACCESS_DENIED_ERROR_CODE;                }        ++c_pData;        const char * c_pSep;                 if (!(c_pSep = strchr(c_pData, '\n')))                {                    d->SetPhase(PHASE_CLOSE);                    return ACCESS_DENIED_ERROR_CODE;                }//naprawa-luki-bezpieczeństwa-w-systemie-autoryzacji-do-acp         if (*(c_pSep - 1) == '\r')            --c_pSep;         std::string stResult;        std::string stBuf;        stBuf.assign(c_pData, 0, c_pSep - c_pData);         sys_log(0, "SOCKET_CMD: FROM(%s) CMD(%s)", d->GetHostName(), stBuf.c_str());

 

  • 3 tygodnie później...
  • 2 miesiące temu...

Jeśli chcesz dodać odpowiedź, zaloguj się lub zarejestruj nowe konto

Konto

Nawigacja

Skonfiguruj powiadomienia push w przeglądarce.

Chrome (Android)
  1. Stuknij ikonę kłódki obok paska adresu.
  2. Wybierz Uprawnienia → Powiadomienia.
  3. Dostosuj swoje preferencje.
Chrome (Desktop)
  1. Kliknij ikonę kłódki na pasku adresu.
  2. Wybierz Ustawienia witryny.
  3. Znajdź Powiadomienia i dostosuj swoje preferencje.