githubEdit

Cmd Injection

Where Would You Find Command Injection

  • In the following places:

  • Text boxes that take in input

  • Hidden URLs that take input

  • E.g. /execute/command-name

  • Or through queries e.g. /location?parameter=command

  • When using URLs, remember to URL encode the characters that aren’t accepted

  • Hidden ports:

  • Some frameworks open debug ports that take in arbitrary commands

Overview

  • Use command line symbols within the input to alter the executed command

  • Pay close attention to functions within an application that tend to be performed by an OS command

  • Two forms exist, blind command injection --> you do not see the returned output, and non-blind cmd injection --> the system command output gets returned back to you

  • Ensure you use the proper system commands per the OS

cat vs type 
ping -c vs ping -n #ping -n causes an infinte ping loop in linux
ls vs dir
  • Try to start with reading a world readable file

Injection Operators Table

Operator
URL-Encoded
Executed

;

%3b

Both

\n (newline)

%0a

Both

&

%26

Both (2nd shown first)

| (pipe)

%7c

Both (only 2nd output)

&&

%26%26

Both (only if 1st succeeds)

||

%7c%7c

2nd (only if 1st fails)

` (backtick)

%60%60

Both (Linux only)

$()

%24%28%29

Both (Linux only)

#

%23

Truncates (Linux only)

Note: ; doesn't work in Windows CMD, but works in PowerShell.


Using # (Hash) to Truncate Commands

In bash, # starts a comment, which means anything after it on the same line is ignored. This is extremely useful in command injection when your injected payload is concatenated with additional characters that would break your command.

Example scenario: The backend command is:

If you inject into username, the @hostname part would break your payload. Using # truncates the rest:

Real-world example:

The # prevents the rest of the backend command from being interpreted, allowing your payload to execute cleanly.


Non-Blind CMD Inj.

  • At the most basic level:

  • Use command line symbols within the input to alter the executed command

  • Once you have identified a potential injection point, use command line symbols within the input to alter the executed command

  • Once you have exploited non-blind cmd injection, escalate to a reverse shell.

Blind CMD Injection

Identification

  • ICMP and DNS are useful to determine blind cmd injection

  • Can also try to ping yourself, however many corporate environments have firewalls in place to stop this, so doesn't always mean blind cmd injection isn't taking place

  • Use tcpdump to capture the icmp echo requests.

  • This proves blind cmd injection, escalate to reverse shell

Burp Collaborator

  • Launch Burp, and choose:

  • Press Poll Now to see if the request came through

  • If the above worked, move down to Data Exfil section

Data Exfil via DNS and Burp Collaborator

  • Once you have your Burp Collaborator Domain, try your command injection

  • Press Poll now and you should have something returned like this:

  • Then type the following in your local terminal

  • If this fails as Invalid Base32 add 1, or 2 equal signs at the end for padding

Bypassing Character Blocklist with ffuf

  • If you see that some special characters are banned, create a burp request to the resource you want to test

  • It should be a post request

  • Identify the parameter that it is using to post the data to the server

  • Swap out the command injection attempt that is getting blocked in the burp request with:

  • Save the burp request to your local machine in a file

  • You usually will have to ignore the & character as many webservers will think you are going to pass in another parameter

  • Now that you have your results back you must filter out the most common side that you see being returned

  • -fs 724

  • Can comma seperate filter size i.e. you see alot of 724 and 726 returned saying that character you posted is blocked

  • -fs 724,726

  • Ensure you also -mc all or match code to see all the different http status codes returned, look for 5XX errors

  • If you see errors on:

IFS Bypass No Spaces CmdInjection

  • whitespace bypass

  • can see above that the username (our injection point) cannot contain spaces, we can use {IFS}to bypass this restriction and get cmd injection

  • Gaining a reverse shell, encode your payload and have it decode and execute to avoid special character issues


Space Bypass Techniques

Technique
Example
OS

Tab

%09

Both

${IFS}

cat${IFS}/etc/passwd

Linux

$IFS$9

cat$IFS$9/etc/passwd

Linux

Brace Expansion

{cat,/etc/passwd}

Linux

< redirect

cat</etc/passwd

Linux


Slash (/) Bypass

Linux - Using Environment Variables

Windows CMD

Windows PowerShell


Semicolon (;) Bypass


Character Shifting (Linux)


Command Obfuscation

Quote Insertion (Linux & Windows)

Linux-Only Characters

Windows Caret


Case Manipulation

Windows (case insensitive)

Linux (needs tr)


Reversed Commands

Linux

Windows PowerShell


Base64 Encoded Commands

Linux

Windows PowerShell

Encode for PowerShell from Linux


Obfuscation Tools

Bashfuscator (Linux)

DOSfuscation (Windows)


Newline Bypass

Often not blacklisted - use %0a:


Example Challenge Payload

Breakdown:

  • %09 = tab (space bypass)

  • $(rev<<<'tac') = reversed cat command

  • ${PATH:0:1} = / character


Netcat Port Parameter Injection

When PHP uses escapeshellcmd() instead of escapeshellarg(), you can inject additional arguments.

Vulnerable Code Pattern

Exploitation

The intval() function extracts the leading integer, so 1234 -e /bin/bash becomes 1234 for validation but the full string is used in the command.

Payload:

Resulting command:

Listener:

Key Points

  • intval("1234 -e /bin/bash") returns 1234 (passes validation)

  • Original $port variable retains full payload

  • escapeshellcmd() doesn't prevent argument injection, only escapes shell metacharacters

  • Always look for type coercion bugs where sanitized values aren't used in final command

Last updated