"

[Exploit] + [Bug] + [Patch]: Cutenews

« Older   Newer »
  Share  
view post Posted on 15/9/2010, 18:22     +1   -1


Group:
Amministratori
Posts:
6,931
Reputation:
0

Status:


Buonasera,

l' altro ieri Landon96 mi chiese di trasferirgli il login del Cutenews (1.4.6) in un'altra pagina, allora io dissi che non c'era problema alcuno e scaricai in locale Cutenews.
Controllando alcuni file per curiositŕ, notai che le stringhe derivate da GET venivano inserite in variabili mediante una funzione del mini-CMS, cute_query_string();
Visto che non ho mai trattato cosě i GET ho provato a controllare se erano ben protetti da XSS (visto che non fa uso di MySQL, ergo niente Injection).
Ho preso search.php solo perchč basta premere il bottone Search che compare la lista delle news con i dati inviati via GET.
Allora ho smanettato un pň e che trovo ?
Una bella falla che se si fosse trovata in un'altra pagina piů delicata avrebbe messo ancora piů in pericolo il sito.
Creo questo topic per spiegarvi in cosa consiste il bug, come sfruttarlo (a puro scopo didattico) e, naturalmente, come patcharlo.

----------------------------------------------------------------------------------------------------------------------------
| Pagina contenente il bug: /cutenews/search.php
| Tipo di exploit: XSS Injection
| Causa del bug: Un mancato controllo diretto della stringa in entrata
| Versione vulnerabile: 1.4.6 (non ho avuto il modo di controllare le precedenti)
----------------------------------------------------------------------------------------------------------------------------

Ecco a voi un proof of concept, per farvi capire l' uso pratico dell' exploit.
Dato un host "X", seguire il seguente link: http://www.X.ext/cutenews/search.php?title...ript>alert(/XSS pwned Cutenews./);</script>
Il contenuto della variabile superglobale $_GET['title'] (come anche le altra tra cui story) viene inserito, dopo essere passato per la funzione proprietaria cute_query_string(); nella seguente riga HTML:

CODICE
<input type=text value="$title" name=title size="24">


Inserendo "> chiudiamo l' input ed "estraniamo" da esso la variabile il quale contenuto (inserito fuori da qualunque tag) viene elaborato dal client come se fosse un semplice script inserito dal programmatore.
Il mio proof of concept consiste in un normale alert con il testo "XSS pwned Cutenews" ma potrebbe essere ben'altro come potete ben immaginare.

Passiamo ora alla patch (piů che patch sono 4 righe di codice ma va beh) che ho scritto ad hoc.
In modo molto semplice, prima che la stringa data dal GET venga iniettata nell' input, viene "passata" in una funzione nativa di PHP, htmlentities(); che converte in hex ogni stringa speciale (potete vedere una lista nella reference).
Il tutto sembra non compromettere minimamente il funzionamento dello script.
Vi chiedo se trovate un bug dovuto alle mie 4 righe di segnalarmelo.
Di seguito la patch da aggiungere precisamente sotto le seguenti 4 righe e prima di "// Define user".
Ecco l'area interessata (č la prima parte dello script) script senza patch, come lo trovate ora

search.php
CODICE
$user_query = cute_query_string($QUERY_STRING, array("search_in_archives", "start_from", "archive", "subaction", "id", "cnshow",
"ucat","dosearch", "story", "title", "user", "from_date_day", "from_date_month", "from_date_year", "to_date_day", "to_date_month", "to_date_year"));
$user_post_query = cute_query_string($QUERY_STRING, array("search_in_archives", "start_from", "archive", "subaction", "id", "cnshow",
"ucat","dosearch", "story", "title", "user", "from_date_day", "from_date_month", "from_date_year", "to_date_day", "to_date_month", "to_date_year"), "post");

// Define Users
$all_users = file("$cutepath/data/users.db.php");
$my_names = array();
foreach($all_users as $my_user)
{
       if(!eregi("<\?",$member_db_line)){
               $user_arr = explode("|",$my_user);
               if($user_arr[4] != ""){ $my_names[$user_arr[2]] = "$user_arr[4]"; }
               else{ $my_names[$user_arr[2]] = "$user_arr[2]"; }
   }
}


Ora dovete inserire la patch, ovvero

search.php
CODICE
/*
This page contains a bug that, if exploited, enables a XSS attack.
Now I clean the vulnerables variables (trasmitted by the link) so as to prevent an exploit.
--------------------------------------------------------------------------------
Questa pagina contiene un bug che, se sfruttato, permette un attacco XSS.
Ora pulisco le variabili vulnerabili (trasmesse dal link) cosě da prevenire l' exploit.

Roxas Shadow (webmaster@technicianpokemon.com)
*/
 
// START PATCH
$story = htmlentities($story);
$title = htmlentities($title);
$user = htmlentities($user);
$selected_search_arc = htmlentities($selected_search_arc);
// END PATCH


Il tutto diverrŕ cosě

search.php
CODICE
$user_query = cute_query_string($QUERY_STRING, array("search_in_archives", "start_from", "archive", "subaction", "id", "cnshow",
"ucat","dosearch", "story", "title", "user", "from_date_day", "from_date_month", "from_date_year", "to_date_day", "to_date_month", "to_date_year"));
$user_post_query = cute_query_string($QUERY_STRING, array("search_in_archives", "start_from", "archive", "subaction", "id", "cnshow",
"ucat","dosearch", "story", "title", "user", "from_date_day", "from_date_month", "from_date_year", "to_date_day", "to_date_month", "to_date_year"), "post");

/*
This page contains a bug that, if exploited, enables a XSS attack.
Now I clean the vulnerables variables (trasmitted by the link) so as to prevent an exploit.
--------------------------------------------------------------------------------
Questa pagina contiene un bug che, se sfruttato, permette un attacco XSS.
Ora pulisco le variabili vulnerabili (trasmesse dal link) cosě da prevenire l' exploit.

Roxas Shadow (webmaster@technicianpokemon.com)
*/
 
// START PATCH
$story = htmlentities($story);
$title = htmlentities($title);
$user = htmlentities($user);
$selected_search_arc = htmlentities($selected_search_arc);
// END PATCH


// Define Users
$all_users = file("$cutepath/data/users.db.php");
$my_names = array();
foreach($all_users as $my_user)
{
       if(!eregi("<\?",$member_db_line)){
               $user_arr = explode("|",$my_user);
               if($user_arr[4] != ""){ $my_names[$user_arr[2]] = "$user_arr[4]"; }
               else{ $my_names[$user_arr[2]] = "$user_arr[2]"; }
   }
}


Un' alternativa consiste nel semplicemente eliminare il file search.php, ma puň sempre tornare utile per creare una sorta di motore di ricerca dell news.
Se volete diffondete la voce, se avete problemi/dubbi/critiche non esistate a contattarmi.

P.S.: Sarebbe il caso di comunicare il bug anche agli sviluppatori ?
 
Web  Top
Lord Scizor
view post Posted on 15/9/2010, 21:23     +1   -1




Non hai un cazzo da fare, eh? lol

Comunque segnala :sisi:
 
Top
view post Posted on 16/9/2010, 14:23     +1   -1


Group:
Amministratori
Posts:
6,931
Reputation:
0

Status:


Non dire cosě dai, comunque dopo faccio XD
 
Web  Top
2 replies since 15/9/2010, 18:22   278 views
  Share