Esta sección incluye todo lo que está fuera del código fuente pero aun así es importante para la seguridad del producto que se está creando. Dado que todas las cuestiones incluidas en esta sección no están directamente relacionadas con el código fuente, las hemos separado de las demás secciones.
{}
en la definición security
de una operación confidencial. Esto anula los requisitos de seguridad definidos globalmente y hace que la operación createUsers
sea vulnerable al acceso no autorizado y no autenticado.
{
"openapi": "3.0.0",
"info": {
...
},
"paths": {
"/users": {
"post": {
"security": [
{},
{
"my_auth": [
"write:users"
]
}
],
"summary": "Create a user",
"operationId": "createUsers",
...
}
...
}
}
{}
en la definición security
de una operación confidencial. Esto anula los requisitos de seguridad definidos globalmente y hace que la operación createUsers
sea vulnerable al acceso no autorizado y no autenticado.
openapi: 3.0.0
info:
...
paths:
/users:
post:
operationId: createUsers
security:
- {}
- oauth_auth:
- write:users
- read:users
responses:
'201':
...
allow_url_fopen
permite funciones de PHP que aceptan un nombre de archivo para trabajar con archivos remotos mediante una URL HTTP o FTP. Esta opción, que se introdujo en PHP 4.0.4 y se encuentra activada de forma predeterminada, es peligrosa porque puede permitir a los atacantes introducir contenido malintencionado en una aplicación. En el mejor de los casos, trabajar con archivos remotos hace que la aplicación sea susceptible de ataques que alteran el archivo remoto para incluir contenido malintencionado. En el peor de los casos, si los atacantes pueden controlar una URL con la que trabaja la aplicación, pueden introducir contenido malintencionado arbitrario en la aplicación suministrando una URL a un servidor remoto. $file
se controla mediante un parámetro de solicitud, un atacante podría burlar las suposiciones del programador suministrando una URL a un archivo remoto.
<?php
$file = fopen ($_GET["file"], "r");
if (!$file) {
// handle errors
}
while (!feof ($file)) {
$line = fgets ($file, 1024);
// operate on file content
}
fclose($file);
?>
allow_url_include
permite funciones de PHP que especifican un archivo para que se incluya en la página actual, como include()
y require()
, y acepte una URL HTTP o FTP a un archivo remoto. Esta opción, que se introdujo en PHP 5.2.0 y se encuentra desactivada de forma predeterminada, es peligrosa porque puede permitir a los atacantes introducir contenido malintencionado en una aplicación. En el mejor de los casos, incluir archivos remotos hace que la aplicación sea susceptible de ataques que alteran el archivo remoto para incluir contenido malintencionado. En el peor de los casos, si los atacantes pueden controlar una URL que la aplicación utiliza para especificar el archivo remoto que se debe incluir, pueden introducir contenido malintencionado arbitrario en la aplicación suministrando una URL a un servidor remoto.cgi.force_redirect
, que está activada de forma predeterminada, se encuentra desactivada, los atacantes con acceso a /cgi-bin/php pueden utilizar los permisos del intérprete de PHP para acceder a documentos web arbitrarios, con lo que estarían burlando las comprobaciones de control de acceso que realiza el servidor.dl
para eludir las restricciones open_basedir
.enable_dl
permite la carga dinámica de bibliotecas. Estas bibliotecas podrían hacer que un atacante eludiera las restricciones establecidas con la configuración open_basedir y permitirle el acceso a cualquier archivo del sistema.enable_dl
puede facilitar a los atacantes el aprovechamiento de otras vulnerabilidades.file_uploads
está activada, permite a los usuarios de PHP que carguen archivos arbitrarios al servidor. Permitir a los usuarios que carguen archivos no representa una vulnerabilidad de seguridad en sí misma. Sin embargo, esta función puede permitir distintos ataques dado que brinda a los usuarios malintencionados una vía para introducir datos en el entorno de servidor.
<?php
$udir = 'upload/'; // Relative path under Web root
$ufile = $udir . basename($_FILES['userfile']['name']);
if (move_uploaded_file($_FILES['userfile']['tmp_name'], $ufile)) {
echo "Valid upload received\n";
} else {
echo "Invalid upload rejected\n";
} ?>
open_basedir
intenta evitar que los programas PHP operen en archivos fuera de los árboles de directorios especificados en php.ini. Si no se especifican directorios mediante la opción open_basedir
, los programas que se ejecutan bajo PHP tienen acceso completo a archivos arbitrarios en el sistema de archivos local, lo que puede permitir a los atacantes leer, escribir o crear archivos a los que no deberían tener acceso.open_basedir
puede facilitar a los atacantes la explotación de otras vulnerabilidades.open_basedir
es una bendición general para la seguridad, la implementación adolece de una condición de carrera que puede permitir a los atacantes eludir sus restricciones en algunas circunstancias [2]. Existe una condición de carrera de tiempo de comprobación, tiempo de uso (TOCTOU) entre el momento en que PHP realiza la comprobación de permisos de acceso y cuando se abre el archivo. Al igual que con las condiciones de carrera del sistema de archivos en otros lenguajes, esta condición de carrera puede permitir a los atacantes reemplazar un vínculo simbólico a un archivo que pasa una verificación de control de acceso por otro para el cual la prueba fallaría, obteniendo así acceso al archivo protegido.safe_mode
está activado, la opción safe_mode_exec_dir
restringe la ejecución de comandos por parte de PHP a los comandos de los directorios especificados. Aunque la ausencia de una entrada safe_mode_exec_dir
no supone una vulnerabilidad de seguridad en sí misma, los atacantes pueden aprovechar esta indulgencia añadida junto con otras vulnerabilidades para realizar acciones más peligrosas.open_basedir
especifica el directorio de trabajo que se puede cambiar.open_basedir
intenta evitar que los programas PHP operen en archivos fuera de los árboles de directorio especificados en el archivo php.ini. Si se especifica el directorio de trabajo con .
, puede cambiarlo potencialmente un atacante que usechdir()
.open_basedir
es un beneficio general para la seguridad, la implementación sufre una condición de carrera que puede permitir a los atacantes burlar las restricciones en algunas circunstancias [2]. Existe una condición de carrera de hora de comprobación/hora de uso (TOCTOU) entre la hora a la que PHP realiza la comprobación de permiso de acceso y el momento en que se abre el archivo. Como ocurre con las condiciones de carrera de los sistemas de archivos en otros lenguajes, esta condición de carrera puede permitir a los atacantes que sustituyan un symlink a un archivo que pasa una comprobación de control de acceso por otro que no superaría la prueba, obteniendo así acceso al archivo protegido.register_globals
hace que PHP registre todas las variables EGPCS (entorno, GET, POST, cookie y servidor) de forma global, por lo que se puede acceder a ellas en cualquier ámbito de cualquier programa de PHP. Esta opción anima a los programadores a escribir programas más o menos desconocedores del origen de los valores en los que confían, lo cual puede provocar un comportamiento inesperado en entornos bienintencionados y deja la puerta abierta a los atacantes en entornos malintencionados. Al reconocerse las peligrosas implicaciones de seguridad de register_globals
, esta opción estaba desactivada de forma predeterminada en PHP 4.2.0 y se eliminó en PHP 6.$username
se origina desde la sesión controlada por el servidor, pero un atacante puede suministrar un valor malintencionado para $username
como un parámetro de solicitud. Con register_globals
activado, este código incluirá un valor malintencionado enviado por un atacante en el contenido HTML dinámico que genere.
<?php
if (isset($username)) {
echo "Hello <b>$username</b>";
} else {
echo "Hello <b>Guest</b><br />";
echo "Would you like to login?";
}
?>
safe_mode
es una de las funciones de seguridad más importantes de PHP. Cuando safe_mode
está desactivado, PHP trabaja en los archivos con los permisos del usuario que lo invocó, que por lo general es un usuario con privilegios. Aunque configurar PHP con safe_mode
desactivado no supone una vulnerabilidad de seguridad en sí misma, los atacantes pueden aprovechar esta indulgencia añadida junto con otras vulnerabilidades para realizar acciones más peligrosas.session.use_trans_sid
está activada, PHP pasa el id. de sesión en la URL, lo cual hace mucho más sencillo para los atacantes secuestrar las sesiones activas o engañar a los usuarios para que utilicen una sesión existente que ya controla un atacante. open_basedir
de PHP contiene un error de diseño que lo hace vulnerable a condiciones de carrera de acceso a archivos, lo cual puede permitir a un atacante eludir las comprobaciones de control de acceso en el sistema de archivos.open_basedir
está presente, intenta impedir a los programas de PHP que trabajen con archivos ubicados fuera del los árboles de directorios especificados en php.ini. Aunque la opción open_basedir
es un beneficio general para la seguridad, la implementación sufre una condición de carrera que puede permitir a los atacantes burlar las restricciones en algunas circunstancias [2]. Existe una condición de carrera de hora de comprobación/hora de uso (TOCTOU) entre la hora a la que PHP realiza la comprobación de permiso de acceso y el momento en que se abre el archivo. Como ocurre con las condiciones de carrera de los sistemas de archivos en otros lenguajes, esta vulnerabilidad puede permitir a los atacantes que sustituyan un symlink a un archivo que pasa la comprobación de control de acceso por otro que no superaría la prueba, obteniendo así acceso al archivo protegido.form-bean
con el mismo nombre. Los nombres de form-bean
duplicados a menudo indican un código de depuración sobrante o un error tipográfico.form-bean
duplicados no sirven para nada, ya que solo se registrará la última entrada cuando se utilice el mismo nombre en varias etiquetas <form-bean>
.form-bean
con el mismo nombre.
<form-beans>
<form-bean name="loginForm" type="org.apache.struts.validator.DynaValidatorForm">
<form-property name="name" type="java.lang.String" />
<form-property name="password" type="java.lang.String" />
</form-bean>
<form-bean name="loginForm" type="org.apache.struts.validator.DynaActionForm">
<form-property name="favoriteColor" type="java.lang.String" />
</form-bean>
</form-beans>
path
para localizar el recurso necesario para controlar una solicitud. Dado que la ruta de acceso es una ubicación relativa al módulo, es un error si no comienza con un carácter "/".Ejemplo 2: La siguiente configuración utiliza una ruta de acceso que no empieza por un carácter "/".
<global-exceptions>
<exception key="global.error.invalidLogin" path="" scope="request" type="InvalidLoginException" />
</global-exceptions>
<global-forwards>
<forward name="login" path="Login.jsp" />
</global-forwards>
input
en acciones de Struts con nombre que pueden devolver errores de validación.input
siempre que una acción con nombre devuelva errores de validación [2]. El atributo input
especifica la página utilizada para mostrar mensajes de error cuando ocurren errores de validación.input
.
<action-mappings>
<action path="/Login"
type="com.LoginAction"
name="LoginForm"
scope="request"
validate="true" />
</action-mappings>
<exception>
que no contengan un atributo type
no se utilizarán.<exception>
requiere que se defina un tipo de excepción. La ausencia de un atributo type
o que esté vacío indica un controlador de excepciones superfluo o una omisión accidental. Si un desarrollador tenía la intención de controlar una excepción, pero olvidó definir el tipo de excepción, entonces la aplicación podría filtrar información confidencial sobre el sistema.<exception>
.
<global-exceptions>
<exception
key="error.key"
handler="com.mybank.ExceptionHandler"/>
</global-exceptions>