278 votos

Explotables funciones PHP

Estoy tratando de construir una lista de funciones que se pueden utilizar para la ejecución de código arbitrario. El propósito no está a la lista de funciones que deberían estar en la lista negra o de otro tipo no permitido. Más bien, me gustaría tener un grep-capaz de lista de rojo de la bandera de palabras clave útiles cuando se busca un servidor vulnerable para puertas.

La idea es que si usted quiere construir un multi-propósito malicioso script PHP -- como una "cáscara" de la secuencia de comandos como c99 o r57, vas a tener que usar uno o más de un conjunto relativamente pequeño de funciones en algún lugar en el archivo con el fin de permitir al usuario ejecutar código arbitrario. En la búsqueda de aquellas aquellas funciones que le ayuda más rápidamente, reducir un pajar de decenas de miles de archivos PHP a un conjunto relativamente pequeño de secuencias de comandos que requieren un examen más detenido.

Claramente, por ejemplo, cualquiera de los siguientes sería considerado malicioso (o terrible de codificación):

<? eval($_GET['cmd']); ?>

<? system($_GET['cmd']); ?>

<? preg_replace('/.*/e',$_POST['code']); ?>

y así sucesivamente.

Buscando a través de un sitio comprometido, el otro día, no me di cuenta de una pieza de código malicioso, porque yo no me di cuenta preg_replace podría ser hecha peligrosos por el uso de la /e bandera (que, en serio? ¿Por qué es que aún existe?). Hay otros que me perdí?

Aquí está mi lista hasta el momento:

De Ejecución En Shell

  • system
  • exec
  • popen
  • backtick operator
  • pcntl_exec

Ejecutar PHP

  • eval
  • preg_replace (con /e modificador)
  • create_function
  • include[_once] / require[_once] (ver mario respuesta para explotar detalles)

También podría ser útil tener una lista de funciones que son capaces de modificar los archivos, pero me imagino que el 99% del tiempo de un código de explotación contendrá, al menos, una de las funciones anteriores. Pero si usted tiene una lista de todas las funciones capaces de modificar o transmitir archivos, post y voy a incluir aquí. (Y no estoy contando mysql_execute, ya que eso es parte de otra clase de explotar.)

205voto

Rook Puntos 34698

Para construir esta lista he usado 2 fuentes. Un Estudio En Escarlata y RATAS. También he añadido algunos de mis propios a la mezcla y de la gente en este hilo han ayudado a salir.

Edit: Después de la publicación de esta lista me puse en contacto con el fundador de RIPS y a partir de ahora este tipo de herramientas se busca en el código PHP para el uso de cada función en esta lista.

La mayoría de estas llamadas de función se clasifican como Sumideros. Cuando un contaminados de la variable ($_REQUEST) se transmite a un receptor de la función, entonces usted tiene una vulnerabilidad. Programas como RATAS y RIPS utilizar grep como la funcionalidad para identificar todo se hunde en una aplicación. Esto significa que los programadores deben tener especial cuidado al usar estas funciones, pero si se donde prohibidos, entonces usted no será capaz de conseguir mucho más por hacer.

"Con gran poder viene una gran responsabilidad."

--Stan Lee

Ejecución De Comandos

exec           - Returns last line of commands output
passthru       - Passes commands output directly to the browser
system         - Passes commands output directly to the browser and returns last line
shell_exec     - Returns commands output
`` (backticks) - Same as shell_exec()
popen          - Opens read or write pipe to process of a command
proc_open      - Similar to popen() but greater degree of control
pcntl_exec     - Executes a program

La Ejecución de Código PHP

Aparte de eval hay otras formas de ejecutar código PHP: include/require puede ser utilizado para la ejecución remota de código en la forma de Archivos Local Incluyen y Archivo Remoto Incluyen vulnerabilidades.

eval()
assert()  - identical to eval()
preg_replace('/.*/e',...) - /e does an eval() on the match
create_function()
include()
include_once()
require()
require_once()
$_GET['func_name']($_GET['argument']);
$func = new ReflectionFunction($_GET['func_name']); $func->invoke(); or $func->invokeArgs(array());

Lista de funciones que aceptan devoluciones de llamada

Estas funciones aceptan un parámetro de cadena que podría ser utilizado para llamar a una función de la elección del atacante. Dependiendo de la función que el atacante puede o puede no tener la capacidad para pasar de un parámetro. En ese caso, un Information Disclosure función phpinfo() podría ser utilizado.

Function                     => Position of callback arguments
'ob_start'                   =>  0,
'array_diff_uassoc'          => -1,
'array_diff_ukey'            => -1,
'array_filter'               =>  1,
'array_intersect_uassoc'     => -1,
'array_intersect_ukey'       => -1,
'array_map'                  =>  0,
'array_reduce'               =>  1,
'array_udiff_assoc'          => -1,
'array_udiff_uassoc'         => array(-1, -2),
'array_udiff'                => -1,
'array_uintersect_assoc'     => -1,
'array_uintersect_uassoc'    => array(-1, -2),
'array_uintersect'           => -1,
'array_walk_recursive'       =>  1,
'array_walk'                 =>  1,
'assert_options'             =>  1,
'uasort'                     =>  1,
'uksort'                     =>  1,
'usort'                      =>  1,
'preg_replace_callback'      =>  1,
'spl_autoload_register'      =>  0,
'iterator_apply'             =>  1,
'call_user_func'             =>  0,
'call_user_func_array'       =>  0,
'register_shutdown_function' =>  0,
'register_tick_function'     =>  0,
'set_error_handler'          =>  0,
'set_exception_handler'      =>  0,
'session_set_save_handler'   => array(0, 1, 2, 3, 4, 5),
'sqlite_create_aggregate'    => array(2, 3),
'sqlite_create_function'     =>  2,

Divulgación De Información

La mayoría de estas llamadas a función no se hunde. Sino que es tal vez una vulnerabilidad en caso de que alguno de los datos devueltos se puede ver a un atacante. Si un atacante puede observar phpinfo() es definitivamente una vulnerabilidad.

phpinfo
posix_mkfifo
posix_getlogin
posix_ttyname
getenv
get_current_user
proc_get_status
get_cfg_var
disk_free_space
disk_total_space
diskfreespace
getcwd
getlastmo
getmygid
getmyinode
getmypid
getmyuid

Otros

extract - Opens the door for register_globals attacks (see study in scarlet).
parse_str -  works like extract if only one argument is given.  
putenv
ini_set
mail - has CRLF injection in the 3rd parameter, opens the door for spam. 
header - on old systems CRLF injection could be used for xss or other purposes, now it is still a problem if they do a header("location: ..."); and they do not die();. The script keeps executing after a call to header(), and will still print output normally. This is nasty if you are trying to protect an administrative area. 
proc_nice
proc_terminate
proc_close
pfsockopen
fsockopen
apache_child_terminate
posix_kill
posix_mkfifo
posix_setpgid
posix_setsid
posix_setuid

Sistema De Ficheros Funciones

De acuerdo a las RATAS de todos los sistema de ficheros con funciones en php son desagradables. Algunos de estos no parecen ser muy útil para el atacante. Otros son más útiles de lo que usted podría pensar. Por ejemplo, si allow_url_fopen=On luego de una dirección url puede ser utilizado como una ruta de archivo, por lo que una llamada a copy($_GET['s'], $_GET['d']); puede ser utilizado para cargar un script de PHP en cualquier lugar en el sistema. También si el sitio es vulnerable a una solicitud de enviar a través de CONSEGUIR cada uno de los archivos de las funciones del sistema se puede abusar de la canal y el ataque a otro host a través de su servidor.

// open filesystem handler
fopen
tmpfile
bzopen
gzopen
SplFileObject->__construct
// write to filesystem (partially in combination with reading)
chgrp
chmod
chown
copy
file_put_contents
lchgrp
lchown
link
mkdir
move_uploaded_file
rename
rmdir
symlink
tempnam
touch
unlink
imagepng   - 2nd parameter is a path.
imagewbmp  - 2nd parameter is a path. 
image2wbmp - 2nd parameter is a path. 
imagejpeg  - 2nd parameter is a path.
imagexbm   - 2nd parameter is a path.
imagegif   - 2nd parameter is a path.
imagegd    - 2nd parameter is a path.
imagegd2   - 2nd parameter is a path.
iptcembed
ftp_get
ftp_nb_get
// read from filesystem
file_exists
file_get_contents
file
fileatime
filectime
filegroup
fileinode
filemtime
fileowner
fileperms
filesize
filetype
glob
is_dir
is_executable
is_file
is_link
is_readable
is_uploaded_file
is_writable
is_writeable
linkinfo
lstat
parse_ini_file
pathinfo
readfile
readlink
realpath
stat
gzfile
readgzfile
getimagesize
imagecreatefromgif
imagecreatefromjpeg
imagecreatefrompng
imagecreatefromwbmp
imagecreatefromxbm
imagecreatefromxpm
ftp_put
ftp_nb_put
exif_read_data
read_exif_data
exif_thumbnail
exif_imagetype
hash_file
hash_hmac_file
hash_update_file
md5_file
sha1_file
highlight_file
show_source
php_strip_whitespace
get_meta_tags

59voto

mario Puntos 76989

Usted tendría que escanear para incluir($tmp) y require(HTTP_REFERER) y *_once así. Si un exploit secuencia de comandos puede escribir en un archivo temporal, se podría incluir más adelante. Básicamente de dos pasos eval.

Y es incluso posible para ocultar remota de código con soluciones como:

 include("data:text/plain;base64,$_GET[code]");

También, si tu servidor web ya ha sido comprometida no siempre va a ver sin codificar mal. A menudo, la explotación de shell es codificado de gzip. Piensa include("zlib:script2.png.gz"); No eval aquí mismo efecto.

48voto

Aillyn Puntos 5955

Esto no es una respuesta per se, pero aquí hay algo interesante:

$y = str_replace('z', 'e', 'zxzc');
$y("malicious code");

En el mismo espíritu, call_user_func_array() puede ser utilizado para ejecutar las funciones alteradas.

20voto

Bill Karwin Puntos 204877

Me sorprende que nadie ha mencionado echo y print como puntos de explotación de seguridad.

Cross-Site Scripting (XSS) es una proeza de seguridad grave, porque es más común que hazañas de ejecución de código del lado del servidor.

19voto

Cheekysoft Puntos 16532

me gustaría especialmente que desee agregar unserialize() a esta lista. Ha tenido una larga historia de varias vulnerabilidades, incluyendo la ejecución arbitraria de código, denegación de servicio y la memoria de la fuga de información. Nunca debe ser llamado en datos proporcionados por el usuario. Muchos de estos vuls han sido corregidos en comunicados de prensa sobre el último rocío años, pero todavía conserva un par de desagradables vuls en el actual momento de la escritura.

Para otra información sobre la chunga de las funciones de php/uso de mirar alrededor de la Endurecido Proyecto de PHP y sus advertencias. También el reciente Mes de la Seguridad de PHP y 2007 es el Mes de los Errores de PHP proyectos

También tenga en cuenta que, por diseño, unserializing un objeto hará que el constructor y destructor de las funciones a ejecutar; otra razón para no llamarlo en datos proporcionados por el usuario.

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X