disable_functions bypass - dl function
dl
is a PHP function that can be used to load PHP extensions. It the function isn't disabled it could be abused to bypass disable_functions
and execute arbitrary commands.
However, it has some strict limitations:
The
dl
function must be present in the environment and not disabledThe PHP Extension must be compiled with the same major version (PHP API version) that the server is using (you can see this information in the output of phpinfo)
The PHP extension must be located in the directory that is defined by the
extension_dir
directive (you can see it in the output of phpinfo). It's very unprobeable that an attacker trying to abuse the server will have write access over this directory, so this requirement probably will prevent you to abuse this technique).
If you meet these requirements, continue reading this post copied from https://antichat.com/threads/70763/ to learn how to bypass disable_functions
When the admin was configuring the box he/she overlooked the dl function and didn't disable it since there was no mention of being able to execute system commands. The dl function is used to loads PHP extensions when a script is executed.
(PHP extensions are written in C/C++ and are used to give PHP more functionality.)
The attacker notices the function isn't disabled and sees potential and decides to create a PHP extension.
The attacker checks the version of PHP using a small script<?php echo 'PHP Version is '.PHP_VERSION; ?>
(PHP_VERSION is a predefined constant that contains the version number of PHP.)
The attacker notes the version and downloads the tarball from the PHP website, in this scenario the version is older than the current release so the attacker has to go to the archive.
Next he extracts the source and compiles and installs the version of PHP on his own box.
Now it's time to create the extension The attacker reads up on creating PHP extensions from the PHP site. After reading through the documentation and creating some extensions of his own he decides to look at the PHP code base since the function he's after is already created.
The function that will be duplicated will be the exec function in the code base it's located in ext/standard/exec.c
The relevant parts are implemented into a new extension of its own.
The files for the separate extension end up as below:
Once the files are created it's time to build the PHP extension.
Once this is done the compiled extension will be located in the modules sub directory with the filename bypass.so. The file is copied to a safe place, now the following commands are executed to clean up the newly created files.
Now the attacker uploads the newly created extension to the victim host.
(NOTE: Major releases of PHP use different API versions, in order for you to be able to compile the extension on one host and upload it to another the API versions must match. This is why initially the same PHP version was installed on the attackers box. )
In order to load an extension with the dl function the extension needs to be in the the extension directory which is defined by the extension_dir directive. This can be a problem since it's less likely for the attacker to have write permissions in this directory, there is however a way to get passed this. This problem has been discussed by developers on the dl function page within the notes section.
The concept that was discussed is to use a relative path from the defined extension directory. For example if the extension directory was set to /usr/php/extensions and you'd like to load bypass.so in the current web directory /home/example.com/html you would do as follows:
This will get passed the need to have the extension in the defined extension directory.
There is also an automated way so you won't have to change the relative path for different hosts, this code was created by endofyourself [at] yahoo [dot] com and improved apon later on by mag_2000 [at] front [dot] ru
There was one minor problem with the function, on some hosts the extension directory is set to "./" this function didn't take into account if the extension directory was set to a relative path, the fix for this is too use the realpath function.
The final script used to load the extension and execute system commands to bypass the disabled functions is as follows:
All the attacker has to do now to execute commands is call the URL to the script along with a cmd variable with the desired command.
Last updated