class AccessLevel{
public static final int ROOT = 0;
//...
public static final int NONE = 9;
}
//...
class User {
private static int access;
public User(){
access = AccessLevel.ROOT;
}
public static int getAccessLevel(){
return access;
}
//...
}
class RegularUser extends User {
private static int access;
public RegularUser(){
access = AccessLevel.NONE;
}
public static int getAccessLevel(){
return access;
}
public static void escalatePrivilege(){
access = AccessLevel.ROOT;
}
//...
}
//...
class SecureArea {
//...
public static void doRestrictedOperation(User user){
if (user instanceof RegularUser){
if (user.getAccessLevel() == AccessLevel.ROOT){
System.out.println("doing a privileged operation");
}else{
throw new RuntimeException();
}
}
}
}
getAccessLevel()
en la instancia user
y no en las clases User
o RegularUser
, la condición siempre devolverá true
y se llevará a cabo la operación restringida aunque se utilice instanceof
para entrar en esta parte del bloque if/else
.
private void writeObject(java.io.ObjectOutputStream out) throws IOException;
private void readObject(java.io.ObjectInputStream in) throws IOException, ClassNotFoundException;
private void readObjectNoData() throws ObjectStreamException;
serialPersistentFields
correctamente, debe declararse como private
, static
y final
.serialPersistentFields
. Esta característica solo funcionará si serialPersistentFields
se declara como private
, static
y final
.serialPersistentFields
no se utilizará para definir campos Serializable
porque no es private
, static
y final
.
class List implements Serializable {
public ObjectStreamField[] serialPersistentFields = { new ObjectStreamField("myField", List.class) };
...
}
Object.equals()
en una matriz en vez de java.util.Arrays.equals().
.Object.equals()
en una matriz es casi siempre un error, ya que comprobará la igualdad de las direcciones de las matrices, en vez de la igualdad de los elementos de las matrices, y debería reemplazarse por java.util.Arrays.equals()
. Object.equals()
.
...
int[] arr1 = new int[10];
int[] arr2 = new int[10];
...
if (arr1.equals(arr2)){
//treat arrays as if identical elements
}
...
System.Object.Equals()
:
public boolean Equals(string obj) {
...
}
System.Object.Equals()
utiliza un argumento de tipo object
, nunca se llama al método.Object.equals()
:
public boolean equals(Object obj1, Object obj2) {
...
}
Object.equals()
toma solo un argumento, el método en el Example 1
no se llama nunca.getWriter()
después de haber llamado getOutputStream
o viceversa.HttpServletRequest
, redirigir una HttpServletResponse
o vaciar el flujo de salida del servlet provoca la confirmación del flujo asociado. Todo restablecimiento de búfer o confirmación de flujo, como los vaciados o los redireccionamientos adicionales, provocarán una IllegalStateException
s.ServletOutputStream
o PrintWriter
, pero no ambos. Llamar getWriter()
después de haber llamado getOutputStream()
, o viceversa, también provocará una IllegalStateException
.IllegalStateException
impide que el controlador de respuesta se ejecute hasta la finalización, entregando la respuesta de forma eficaz. Esto puede causar inestabilidad en el servidor, señal de que un servlet se ha implementado incorrectamente.Ejemplo 2: por otra parte, el código siguiente intenta escribir en el búfer de
public class RedirectServlet extends HttpServlet {
public void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
...
OutputStream out = res.getOutputStream();
...
// flushes, and thereby commits, the output stream
out.flush();
out.close(); // redirecting the response causes an IllegalStateException
res.sendRedirect("http://www.acme.com");
}
}
PrintWriter
y vaciarlo después de que la solicitud se haya enviado.
public class FlushServlet extends HttpServlet {
public void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
...
// forwards the request, implicitly committing the stream
getServletConfig().getServletContext().getRequestDispatcher("/jsp/boom.jsp").forward(req, res);
...
// IllegalStateException; cannot redirect after forwarding
res.sendRedirect("http://www.acme.com/jsp/boomboom.jsp");
PrintWriter out = res.getWriter();
// writing to an already-committed stream will not cause an exception,
// but will not apply these changes to the final output, either
out.print("Writing here does nothing");
// IllegalStateException; cannot flush a response's buffer after forwarding the request
out.flush();
out.close();
}
}
Content-Length
está configurado como negativo.Content-Length
de una solicitud indica que el desarrollador está interesado en0
o unContent-Length
incorrecto.
URL url = new URL("http://www.example.com");
HttpURLConnection huc = (HttpURLConnection)url.openConnection();
huc.setRequestProperty("Content-Length", "-1000");
Content-Length
está configurado como negativo.Content-Length
de una solicitud indica que el desarrollador está interesado en0
o unContent-Length
como negativo:
xhr.setRequestHeader("Content-Length", "-1000");
java.io.Serializable
pueden ocasionar problemas y filtrar información de la clase externa.
...
class User implements Serializable {
private int accessLevel;
class Registrator implements Serializable {
...
}
}
Example 1
, cuando se serializa la clase interna Registrator
, también se serializa el campo accessLevel
de la clase externa User
.synchronized
, garantizando un comportamiento correcto cuando varios subprocesos acceden a la misma instancia. Todos los métodos de reemplazo también deben ser declarados como synchronized
porque, de no ser así, podría producirse un comportamiento inesperado.Foo
reemplaza a la clase Bar
, pero no declara el método synchronizedMethod
para que sea synchronized
:
public class Bar {
public synchronized void synchronizedMethod() {
for (int i=0; i<10; i++) System.out.print(i);
System.out.println();
}
}
public class Foo extends Bar {
public void synchronizedMethod() {
for (int i=0; i<10; i++) System.out.print(i);
System.out.println();
}
}
Foo
en el tipo Bar
. Si se da la misma instancia a dos subprocesos distintos y synchronizedMethod
se ejecuta repetidamente, el comportamiento se impredecible.obj.Equals(null)
debe ser siempre false.Equals()
para comparar un objeto con null
. El contrato del método Equals()
requiere que esta comparación devuelva siempre un valor "false".obj.equals(null)
siempre será "false".equals()
para comparar un objeto con null
. Esta comparación siempre devolverá false, porque el objeto no es null
. (Si el objeto es null
, el programa lanzará una NullPointerException
).readObject()
de la clase llama a una función que puede anularse.readObject()
actúa como un constructor, por lo que la inicialización del objeto no se completa hasta que finaliza esta función. Así, cuando una función readObject()
de una clase Serializable
llama a una función que se puede sobrescribir, puede permitir que el método de sobrescritura acceda al estado del objeto antes de que se inicialice por completo.readObject()
llama a un método que se puede sobrescribir.
...
private void readObject(final ObjectInputStream ois) throws IOException, ClassNotFoundException {
checkStream(ois);
ois.defaultReadObject();
}
public void checkStream(ObjectInputStream stream){
...
}
checkStream()
y su clase envolvente no son final
y públicas, la función se puede sobrescribir y un atacante puede sobrescribir la función checkStream()
para tener acceso al objeto durante la deserialización.
Marker child = MarkerManager.getMarker("child");
Marker parent = MarkerManager.getMarker("parent");
child.addParents(parent);
parent.addParents(child);
String toInfinity = child.toString();
toString()
, que incluye un método de procesamiento recursivo, desencadena una excepción de desbordamiento de pila (agotamiento de pila). Esta excepción se produce debido al enlace circular entre elemento secundario y elemento principal.String
no es fiable y no debe hacerse.String
, es necesario cambiarlo primero por un objeto String
, por lo general, mediante una función como Double.toString()
. En función de la forma y el valor de la variable de punto flotante, al convertirla en un objeto String
, puede ser "NaN", "Infinity" o "-Infinity", incluir alguna cantidad de decimales finales con ceros o contener un campo de exponente. Si se convierte en una cadena hexadecimal, la representación también podría diferir en gran medida.String
.
...
int initialNum = 1;
...
String resultString = Double.valueOf(initialNum/10000.0).toString();
if (s.equals("0.0001")){
//do something
...
}
...
ToString()
se llama en una matriz.ToString()
en una matriz indica que un desarrollador está interesado en devolver el contenido de la matriz como cadena. Sin embargo, una llamada directa ToString()
en una matriz devolverá un valor de cadena que contiene el tipo de la matriz.System.String[]
.
String[] stringArray = { "element 1", "element 2", "element 3", "element 4" };
System.Diagnostics.Debug.WriteLine(stringArray.ToString());
toString()
se llama en una matriz.toString()
en una matriz indica que un desarrollador está interesado en devolver el contenido de la matriz como cadena. Sin embargo, una llamada directa para toString()
en una matriz devolverá un valor de cadena que contiene el tipo de matriz y el código hash en memoria.[Ljava.lang.String;@1232121
.
String[] strList = new String[5];
...
System.out.println(strList);
APPHOME
para determinar el directorio en el que está instalado y, a continuación, ejecuta una secuencia de comandos de inicialización basada en una ruta de acceso relativa desde el directorio especificado.
...
CALL FUNCTION 'REGISTRY_GET'
EXPORTING
KEY = 'APPHOME'
IMPORTING
VALUE = home.
CONCATENATE home INITCMD INTO cmd.
CALL 'SYSTEM' ID 'COMMAND' FIELD cmd ID 'TAB' FIELD TABL[].
...
Example 1
se permite a un usuario malintencionado ejecutar comandos arbitrarios con el privilegio elevado de la aplicación mediante la modificación de la entrada del registro APPHOME
para que apunte a otra ruta de acceso que contiene una versión malintencionada de INITCMD
. Dado que el programa no valida el valor leído desde el registro, si un usuario malintencionado puede controlar el valor de la clave del registro APPHOME
, podrá engañar a la aplicación para que ejecute código malintencionado y tome el control del sistema.rman
y después ejecutar una secuencia de comandos cleanup.bat
para eliminar algunos archivos temporales. La secuencia de comandos rmanDB.bat
acepta un único parámetro de línea de comandos que especifica el tipo de copia de seguridad que realizar. Dado que se restringe el acceso a la base de datos, la aplicación ejecuta la copia de seguridad como un usuario con privilegios.
...
btype = request->get_form_field( 'backuptype' )
CONCATENATE `/K 'c:\\util\\rmanDB.bat ` btype `&&c:\\util\\cleanup.bat'` INTO cmd.
CALL FUNCTION 'SXPG_COMMAND_EXECUTE_LONG'
EXPORTING
commandname = cmd_exe
long_params = cmd_string
EXCEPTIONS
no_permission = 1
command_not_found = 2
parameters_too_long = 3
security_risk = 4
OTHERS = 5.
...
backuptype
por parte del usuario. El módulo de función SXPG_COMMAND_EXECUTE_LONG
no suele ejecutar varios comandos, pero en este caso el programa ejecuta primero el shell cmd.exe
para ejecutar varios comandos con una única llamada a CALL 'SYSTEM'
. Una vez que se invoca el comando de shell, permitirá que se ejecuten varios comandos separados por dos signos de Y comercial. Si un usuario malintencionado pasa una cadena del tipo "&& del c:\\dbms\\*.*"
, la aplicación ejecutará este comando junto con los demás comandos especificados por el programa. Debido a la naturaleza de la aplicación, se ejecuta con los privilegios necesarios para interactuar con la base de datos, lo que significa que cualquier comando que el usuario malintencionado inserte, se ejecutará también con estos privilegios.make
en el directorio /var/yp
.
...
MOVE 'make' to cmd.
CALL 'SYSTEM' ID 'COMMAND' FIELD cmd ID 'TAB' FIELD TABL[].
...
CALL 'SYSTEM'
. Si un usuario malintencionado puede modificar la variable $PATH
para que señale a un binario malintencionado que se denomina make
y hacer que el programa pueda ejecutarse en su entorno, entonces el archivo binario malintencionado se cargará en lugar del que se pretende. Debido a la naturaleza de la aplicación, se ejecuta con los privilegios necesarios para realizar las operaciones del sistema, lo que significa que el comando make
del usuario malintencionado ahora se ejecutará con estos privilegios, posiblemente proporcionando al usuario malintencionado control total sobre el sistema.
...
var fs:FileStream = new FileStream();
fs.open(new File(String(configStream.readObject())+".txt"), FileMode.READ);
home = String(fs.readObject(home));
var cmd:String = home + INITCMD;
fscommand("exec", cmd);
...
Example 1
permite a un usuario malintencionado ejecutar comandos arbitrarios con el privilegio elevado de la aplicación mediante la modificación del contenido del archivo de configuración configStream
para que apunte a otra ruta de acceso que contiene una versión malintencionada de INITCMD
. Dado que el programa no valida el valor leído desde el archivo, si un usuario malintencionado puede controlar este valor, podrá engañar a la aplicación para que ejecute código malintencionado y tomar el control del sistema.rman
y, a continuación, ejecutar un script cleanup.bat
para eliminar algunos archivos temporales. La secuencia de comandos rmanDB.bat
acepta un único parámetro de línea de comandos que especifica el tipo de copia de seguridad que realizar. Dado que se restringe el acceso a la base de datos, la aplicación ejecuta la copia de seguridad como un usuario con privilegios.
...
var params:Object = LoaderInfo(this.root.loaderInfo).parameters;
var btype:String = String(params["backuptype"]);
var cmd:String = "cmd.exe /K \"c:\\util\\rmanDB.bat " + btype + "&&c:\\util\\cleanup.bat\"";
fscommand("exec", cmd);
...
backuptype
por parte del usuario. La función fscommand()
no suele ejecutar varios comandos, pero en este caso el programa ejecuta primero el shell cmd.exe
para ejecutar varios comandos con una única llamada a fscommnd()
. Una vez que se invoca el comando de shell, permitirá que se ejecuten varios comandos separados por dos signos de Y comercial. Si un usuario malintencionado pasa una cadena del tipo "&& del c:\\dbms\\*.*"
, la aplicación ejecutará este comando junto con los demás comandos especificados por el programa. Debido a la naturaleza de la aplicación, se ejecuta con los privilegios necesarios para interactuar con la base de datos, lo que significa que cualquier comando que el usuario malintencionado inserte, se ejecutará también con estos privilegios.make
en el directorio /var/yp
.
...
fscommand("exec", "make");
...
fscommand()
. Si un usuario malintencionado puede modificar la variable $PATH
para que señale a un binario malintencionado que se denomina make
y hacer que el programa pueda ejecutarse en su entorno, entonces el archivo binario malintencionado se cargará en lugar del que se pretende. Debido a la naturaleza de la aplicación, se ejecuta con los privilegios necesarios para realizar las operaciones del sistema, lo que significa que el comando make
del usuario malintencionado ahora se ejecutará con estos privilegios, posiblemente proporcionando al usuario malintencionado control total sobre el sistema.APPHOME
para determinar el directorio de instalación y, a continuación, ejecuta un script de inicialización en función de una ruta relativa desde el directorio especificado.
...
string val = Environment.GetEnvironmentVariable("APPHOME");
string cmd = val + INITCMD;
ProcessStartInfo startInfo = new ProcessStartInfo(cmd);
Process.Start(startInfo);
...
Example 1
se permite a un usuario malintencionado ejecutar comandos arbitrarios con el privilegio elevado de la aplicación mediante la modificación de la propiedad del sistema APPHOME
para que apunte a otra ruta de acceso que contiene una versión malintencionada de INITCMD
. Como el programa no valida el valor leído desde el entorno, si el usuario malintencionado puede controlar el valor de la propiedad del sistema APPHOME
, puede engañar a la aplicación para que ejecute código malintencionado y asuma el control del sistema.rman
y, a continuación, ejecutar un script cleanup.bat
para eliminar algunos archivos temporales. La secuencia de comandos rmanDB.bat
acepta un único parámetro de línea de comandos que especifica el tipo de copia de seguridad que realizar. Dado que se restringe el acceso a la base de datos, la aplicación ejecuta la copia de seguridad como un usuario con privilegios.
...
string btype = BackupTypeField.Text;
string cmd = "cmd.exe /K \"c:\\util\\rmanDB.bat"
+ btype + "&&c:\\util\\cleanup.bat\""));
Process.Start(cmd);
...
BackupTypeField
. La función Process.Start()
no suele ejecutar varios comandos, pero en este caso el programa ejecuta primero el shell cmd.exe
para ejecutar varios comandos con una única llamada a Process.Start()
. Una vez que se invoca el comando de shell, permitirá que se ejecuten varios comandos separados por dos signos de Y comercial. Si un usuario malintencionado pasa una cadena del tipo "&& del c:\\dbms\\*.*"
, la aplicación ejecutará este comando junto con los demás comandos especificados por el programa. Debido a la naturaleza de la aplicación, se ejecuta con los privilegios necesarios para interactuar con la base de datos, lo que significa que cualquier comando que el usuario malintencionado inserte, se ejecutará también con estos privilegios.update.exe
de la siguiente forma:
...
Process.Start("update.exe");
...
Process.start()
. Si un usuario malintencionado puede modificar la variable $PATH
para que señale a un binario malintencionado que se denomina update.exe
y hacer que el programa pueda ejecutarse en su entorno, entonces el archivo binario malintencionado se cargará en lugar del que se pretende. Debido a la naturaleza de la aplicación, se ejecuta con los privilegios necesarios para realizar las operaciones del sistema, lo que significa que el comando update.exe
del usuario malintencionado ahora se ejecutará con estos privilegios, posiblemente proporcionando al usuario malintencionado control total sobre el sistema.setuid root
porque está diseñado como herramienta de aprendizaje para permitir a los administradores del sistema en formación inspeccionar los archivos del sistema con privilegios sin concederles la capacidad de modificarlos o dañar el sistema.
int main(char* argc, char** argv) {
char cmd[CMD_MAX] = "/usr/bin/cat ";
strcat(cmd, argv[1]);
system(cmd);
}
root
, la llamada a system()
también se ejecuta con privilegios root
. Si un usuario especifica un nombre de archivo estándar, la llamada presenta el funcionamiento previsto. Sin embargo, si un atacante transfiere una cadena con el formato ";rm -rf /"
, la llamada a system()
no se ejecuta cat
debido a la falta de argumentos y, a continuación, pasa a eliminar de forma recursiva el contenido de la partición raíz.$APPHOME
para determinar el directorio de instalación de la aplicación y, a continuación, ejecuta una secuencia de comandos de inicialización en ese directorio.
...
char* home=getenv("APPHOME");
char* cmd=(char*)malloc(strlen(home)+strlen(INITCMD));
if (cmd) {
strcpy(cmd,home);
strcat(cmd,INITCMD);
execl(cmd, NULL);
}
...
Example 1
, el código de este ejemplo permite a un usuario malintencionado ejecutar comandos arbitrarios con el privilegio elevado de la aplicación. En este ejemplo, el atacante puede modificar la variable de entorno $APPHOME
para especificar una ruta diferente que contenga una versión malintencionada de INITCMD
. Como el programa no valida el valor leído del entorno, al controlar este, el atacante puede engañar a la aplicación para que ejecute código malicioso.make
en el directorio /var/yp
. Tenga en cuenta que, como el programa actualiza los registros de contraseñas, se ha instalado setuid root
.make
de la siguiente forma:
system("cd /var/yp && make &> /dev/null");
system()
. Sin embargo, como el programa no especifica una ruta absoluta para make
ni limpia ninguna variable de entorno antes de llamar al comando, el atacante puede modificar la variable $PATH
para que señale a un archivo binario malicioso denominado make
y ejecutar la secuencia de comandos de CGI desde el indicador de shell. Y, como el programa ha instalado setuid root
, la versión de make
del usuario malintencionado se ejecuta ahora con privilegios root
.CreateProcess()
directamente o mediante una llamada a una de las funciones de la familia _spawn()
, se debe tener cuidado en el caso de que haya un espacio en un ejecutable o en una ruta.
...
LPTSTR cmdLine = _tcsdup(TEXT("C:\\Program Files\\MyApplication -L -S"));
CreateProcess(NULL, cmdLine, ...);
...
CreateProcess()
analiza los espacios, el primer ejecutable que el sistema operativo intentará ejecutar es Program.exe
y no MyApplication.exe
. Por lo tanto, si un atacante es capaz de instalar una aplicación malintencionada llamada Program.exe
en el sistema, cualquier programa que de manera incorrecta llame a CreateProcess()
utilizando el directorio Program Files
ejecutará esta aplicación en lugar de la que pretendía ejecutar.system()
, exec()
y CreateProcess()
utilizan el entorno del programa que les llama, por lo que los atacantes disponen de una oportunidad potencial de influir en el comportamiento de dichas llamadas.$PATH
u otros aspectos del entorno de ejecución del programa.make
en el directorio /var/yp
. Tenga en cuenta que, como el programa actualiza los registros de contraseñas, se ha instalado setuid root
.make
de la siguiente manera:
MOVE "cd /var/yp && make &> /dev/null" to command-line
CALL "CBL_EXEC_RUN_UNIT" USING command-line
length of command-line
run-unit-id
stack-size
flags
CBL_EXEC_RUN_UNIT
. Sin embargo, dado que el programa no especifica una ruta absoluta para make
y no limpia sus variables de entorno antes de invocar el comando, el atacante puede modificar su variable de $PATH
para que se dirija a un binario malintencionado denominado make
y ejecutar el script CGI desde una indicación del comando de shell. Además, puesto que en el programa se ha instalado setuid root
, la versión del atacante de make
funciona con privilegios de root
.pdfprint
.
DISPLAY "TEMP" UPON ENVIRONMENT-NAME
ACCEPT ws-temp-dir FROM ENVIRONMENT-VARIABLE
STRING "pdfprint " DELIMITED SIZE
ws-temp-dir DELIMITED SPACE
"/" DELIMITED SIZE
ws-pdf-filename DELIMITED SPACE
x"00" DELIMITED SIZE
INTO cmd-buffer
CALL "SYSTEM" USING cmd-buffer
pdfprint
, el atacante puede modificar su variable de $PATH
para que se dirija a un binario malintencionado. Además, aunque las frases DELIMITED SPACE
evitan los espacios incrustados en ws-temp-dir
y ws-pdf-filename
, podrían existir metacaracteres del comando de shell (como &&
) incrustados en cualquiera de ellos.cmd
.
...
<cfset var="#url.cmd#">
<cfexecute name = "C:\windows\System32\cmd.exe"
arguments = "/c #var#"
timeout = "1"
variable="mycmd">
</cfexecute>
...
APPHOME
para determinar el directorio en el que está instalado y luego ejecuta un guion de inicialización basado en una ruta relativa del directorio especificado.
...
final cmd = String.fromEnvironment('APPHOME');
await Process.run(cmd);
...
Example 1
se permite a un usuario malintencionado ejecutar comandos arbitrarios con el privilegio elevado de la aplicación mediante la modificación de la propiedad del sistema APPHOME
para que apunte a otra ruta de acceso que contiene una versión malintencionada de INITCMD
. Como el programa no valida el valor leído desde el entorno, si el usuario malintencionado puede controlar el valor de la propiedad del sistema APPHOME
, puede engañar a la aplicación para que ejecute código malintencionado y asuma el control del sistema.
cmdName := request.FormValue("Command")
c := exec.Command(cmdName)
c.Run()
APPHOME
para determinar el directorio de instalación y, a continuación, ejecuta una secuencia de comandos de inicialización en función de una ruta relativa desde el directorio especificado.
...
String home = System.getProperty("APPHOME");
String cmd = home + INITCMD;
java.lang.Runtime.getRuntime().exec(cmd);
...
Example 1
se permite a un usuario malintencionado ejecutar comandos arbitrarios con el privilegio elevado de la aplicación mediante la modificación de la propiedad del sistema APPHOME
para que apunte a otra ruta de acceso que contiene una versión malintencionada de INITCMD
. Como el programa no valida el valor leído desde el entorno, si el usuario malintencionado puede controlar el valor de la propiedad del sistema APPHOME
, puede engañar a la aplicación para que ejecute código malintencionado y asuma el control del sistema.rman
y, a continuación, ejecutar un script cleanup.bat
para eliminar algunos archivos temporales. La secuencia de comandos rmanDB.bat
acepta un único parámetro de línea de comandos que especifica el tipo de copia de seguridad que realizar. Dado que se restringe el acceso a la base de datos, la aplicación ejecuta la copia de seguridad como un usuario con privilegios.
...
String btype = request.getParameter("backuptype");
String cmd = new String("cmd.exe /K
\"c:\\util\\rmanDB.bat "+btype+"&&c:\\util\\cleanup.bat\"")
System.Runtime.getRuntime().exec(cmd);
...
backuptype
por parte del usuario. La función Runtime.exec()
no suele ejecutar varios comandos, pero en este caso el programa ejecuta primero el shell cmd.exe
para ejecutar varios comandos con una única llamada a Runtime.exec()
. Una vez que se invoca el comando de shell, permitirá que se ejecuten varios comandos separados por dos signos de Y comercial. Si un usuario malintencionado pasa una cadena del tipo "&& del c:\\dbms\\*.*"
, la aplicación ejecutará este comando junto con los demás comandos especificados por el programa. Debido a la naturaleza de la aplicación, se ejecuta con los privilegios necesarios para interactuar con la base de datos, lo que significa que cualquier comando que el usuario malintencionado inserte, se ejecutará también con estos privilegios.make
en el directorio /var/yp
.
...
System.Runtime.getRuntime().exec("make");
...
Runtime.exec()
. Si un usuario malintencionado puede modificar la variable $PATH
para que señale a un binario malintencionado que se denomina make
y hacer que el programa pueda ejecutarse en su entorno, entonces el archivo binario malintencionado se cargará en lugar del que se pretende. Debido a la naturaleza de la aplicación, se ejecuta con los privilegios necesarios para realizar las operaciones del sistema, lo que significa que el comando make
del usuario malintencionado ahora se ejecutará con estos privilegios, posiblemente proporcionando al usuario malintencionado control total sobre el sistema.
...
String[] cmds = this.getIntent().getStringArrayExtra("commands");
Process p = Runtime.getRuntime().exec("su");
DataOutputStream os = new DataOutputStream(p.getOutputStream());
for (String cmd : cmds) {
os.writeBytes(cmd+"\n");
}
os.writeBytes("exit\n");
os.flush();
...
APPHOME
para determinar el directorio de instalación y, a continuación, ejecuta un script de inicialización en función de una ruta relativa desde el directorio especificado.
var cp = require('child_process');
...
var home = process.env('APPHOME');
var cmd = home + INITCMD;
child = cp.exec(cmd, function(error, stdout, stderr){
...
});
...
Example 1
se permite a un usuario malintencionado ejecutar comandos arbitrarios con el privilegio elevado de la aplicación mediante la modificación de la propiedad del sistema APPHOME
para que apunte a otra ruta de acceso que contiene una versión malintencionada de INITCMD
. Como el programa no valida el valor leído desde el entorno, si el usuario malintencionado puede controlar el valor de la propiedad del sistema APPHOME
, puede engañar a la aplicación para que ejecute código malintencionado y asuma el control del sistema.rman
. La secuencia de comandos rmanDB.bat
acepta un único parámetro de línea de comandos que especifica el tipo de copia de seguridad que realizar. Dado que se restringe el acceso a la base de datos, la aplicación ejecuta la copia de seguridad como un usuario con privilegios.
var cp = require('child_process');
var http = require('http');
var url = require('url');
function listener(request, response){
var btype = url.parse(request.url, true)['query']['backuptype'];
if (btype !== undefined){
cmd = "c:\\util\\rmanDB.bat" + btype;
cp.exec(cmd, function(error, stdout, stderr){
...
});
}
...
}
...
http.createServer(listener).listen(8080);
backuptype
por parte del usuario aparte de verificar su existencia. Una vez que se invoca el shell, puede permitir la ejecución de varios comandos y, debido a la naturaleza de la aplicación, se ejecutará con los privilegios necesarios para interactuar con la base de datos, lo que significa que cualquier comando que el atacante introduzca se ejecutará también con estos privilegios.make
en el directorio /var/yp
.
...
require('child_process').exec("make", function(error, stdout, stderr){
...
});
...
make
y no puede limpiar su entorno antes de ejecutar la llamada a child_process.exec()
. Si un usuario malintencionado puede modificar la variable $PATH
para que señale a un binario malintencionado que se denomina make
y hacer que el programa pueda ejecutarse en su entorno, entonces el archivo binario malintencionado se cargará en lugar del que se pretende. Debido a la naturaleza de la aplicación, se ejecuta con los privilegios necesarios para realizar las operaciones del sistema, lo que significa que el comando make
del usuario malintencionado ahora se ejecutará con estos privilegios, posiblemente proporcionando al usuario malintencionado control total sobre el sistema.APPHOME
para determinar el directorio de instalación y, a continuación, ejecuta una secuencia de comandos de inicialización en función de una ruta relativa desde el directorio especificado.
...
$home = $_ENV['APPHOME'];
$cmd = $home . $INITCMD;
system(cmd);
...
Example 1
se permite a un usuario malintencionado ejecutar comandos arbitrarios con el privilegio elevado de la aplicación mediante la modificación de la propiedad del sistema APPHOME
para que apunte a otra ruta de acceso que contiene una versión malintencionada de INITCMD
. Como el programa no valida el valor leído desde el entorno, si el usuario malintencionado puede controlar el valor de la propiedad del sistema APPHOME
, puede engañar a la aplicación para que ejecute código malintencionado y asuma el control del sistema.rman
y, a continuación, ejecutar un script cleanup.bat
para eliminar algunos archivos temporales. La secuencia de comandos rmanDB.bat
acepta un único parámetro de línea de comandos que especifica el tipo de copia de seguridad que realizar. Dado que se restringe el acceso a la base de datos, la aplicación ejecuta la copia de seguridad como un usuario con privilegios.
...
$btype = $_GET['backuptype'];
$cmd = "cmd.exe /K \"c:\\util\\rmanDB.bat " . $btype . "&&c:\\util\\cleanup.bat\"";
system(cmd);
...
backuptype
por parte del usuario. La función Runtime.exec()
no suele ejecutar varios comandos, pero en este caso el programa ejecuta primero el shell cmd.exe
para ejecutar varios comandos con una única llamada a Runtime.exec()
. Una vez que se invoca el comando de shell, permitirá que se ejecuten varios comandos separados por dos signos de Y comercial. Si un usuario malintencionado pasa una cadena del tipo "&& del c:\\dbms\\*.*"
, la aplicación ejecutará este comando junto con los demás comandos especificados por el programa. Debido a la naturaleza de la aplicación, se ejecuta con los privilegios necesarios para interactuar con la base de datos, lo que significa que cualquier comando que el usuario malintencionado inserte, se ejecutará también con estos privilegios.make
en el directorio /var/yp
.
...
$result = shell_exec("make");
...
Runtime.exec()
. Si un usuario malintencionado puede modificar la variable $PATH
para que señale a un binario malintencionado que se denomina make
y hacer que el programa pueda ejecutarse en su entorno, entonces el archivo binario malintencionado se cargará en lugar del que se pretende. Debido a la naturaleza de la aplicación, se ejecuta con los privilegios necesarios para realizar las operaciones del sistema, lo que significa que el comando make
del usuario malintencionado ahora se ejecutará con estos privilegios, posiblemente proporcionando al usuario malintencionado control total sobre el sistema.
...
CREATE PROCEDURE dbo.listFiles (@path NVARCHAR(200))
AS
DECLARE @cmd NVARCHAR(500)
SET @cmd = 'dir ' + @path
exec xp_cmdshell @cmd
GO
...
APPHOME
para determinar el directorio de instalación y, a continuación, ejecuta una secuencia de comandos de inicialización en función de una ruta relativa desde el directorio especificado.
...
home = os.getenv('APPHOME')
cmd = home.join(INITCMD)
os.system(cmd);
...
Example 1
se permite a un usuario malintencionado ejecutar comandos arbitrarios con el privilegio elevado de la aplicación mediante la modificación de la propiedad del sistema APPHOME
para que apunte a otra ruta de acceso que contiene una versión malintencionada de INITCMD
. Como el programa no valida el valor leído desde el entorno, si el usuario malintencionado puede controlar el valor de la propiedad del sistema APPHOME
, puede engañar a la aplicación para que ejecute código malintencionado y asuma el control del sistema.rman
y, a continuación, ejecutar un script cleanup.bat
para eliminar algunos archivos temporales. La secuencia de comandos rmanDB.bat
acepta un único parámetro de línea de comandos que especifica el tipo de copia de seguridad que realizar. Dado que se restringe el acceso a la base de datos, la aplicación ejecuta la copia de seguridad como un usuario con privilegios.
...
btype = req.field('backuptype')
cmd = "cmd.exe /K \"c:\\util\\rmanDB.bat " + btype + "&&c:\\util\\cleanup.bat\""
os.system(cmd);
...
backuptype
por parte del usuario. La función Runtime.exec()
no suele ejecutar varios comandos, pero en este caso el programa ejecuta primero el shell cmd.exe
para ejecutar varios comandos con una única llamada a Runtime.exec()
. Una vez que se invoca el comando de shell, permitirá que se ejecuten varios comandos separados por dos signos de Y comercial. Si un usuario malintencionado pasa una cadena del tipo "&& del c:\\dbms\\*.*"
, la aplicación ejecutará este comando junto con los demás comandos especificados por el programa. Debido a la naturaleza de la aplicación, se ejecuta con los privilegios necesarios para interactuar con la base de datos, lo que significa que cualquier comando que el usuario malintencionado inserte, se ejecutará también con estos privilegios.make
en el directorio /var/yp
.
...
result = os.system("make");
...
os.system()
. Si un usuario malintencionado puede modificar la variable $PATH
para que señale a un binario malintencionado que se denomina make
y hacer que el programa pueda ejecutarse en su entorno, entonces el archivo binario malintencionado se cargará en lugar del que se pretende. Debido a la naturaleza de la aplicación, se ejecuta con los privilegios necesarios para realizar las operaciones del sistema, lo que significa que el comando make
del usuario malintencionado ahora se ejecutará con estos privilegios, posiblemente proporcionando al usuario malintencionado control total sobre el sistema.APPHOME
para determinar el directorio de instalación y, a continuación, ejecuta una secuencia de comandos de inicialización en función de una ruta relativa desde el directorio especificado.
...
home = ENV['APPHOME']
cmd = home + INITCMD
Process.spawn(cmd)
...
Example 1
se permite a un usuario malintencionado ejecutar comandos arbitrarios con el privilegio elevado de la aplicación mediante la modificación de la propiedad del sistema APPHOME
para que apunte a otra ruta de acceso que contiene una versión malintencionada de INITCMD
. Como el programa no valida el valor leído desde el entorno, si el usuario malintencionado puede controlar el valor de la propiedad del sistema APPHOME
, puede engañar a la aplicación para que ejecute código malintencionado y asuma el control del sistema.rman
y después ejecutar una secuencia de comandos cleanup.bat
para eliminar algunos archivos temporales. La secuencia de comandos rmanDB.bat
acepta un único parámetro de línea de comandos que especifica el tipo de copia de seguridad que realizar. Dado que se restringe el acceso a la base de datos, la aplicación ejecuta la copia de seguridad como un usuario con privilegios.
...
btype = req['backuptype']
cmd = "C:\\util\\rmanDB.bat #{btype} &&C:\\util\\cleanup.bat"
spawn(cmd)
...
backuptype
por parte del usuario. Una vez que se invoca el comando de shell mediante Kernel.spawn
, permitirá que se ejecuten varios comandos separados por dos signos de Y comercial. Si un usuario malintencionado pasa una cadena del tipo "&& del c:\\dbms\\*.*"
, la aplicación ejecutará este comando junto con los demás comandos especificados por el programa. Debido a la naturaleza de la aplicación, se ejecuta con los privilegios necesarios para interactuar con la base de datos, lo que significa que cualquier comando que el usuario malintencionado inserte, se ejecutará también con estos privilegios.make
en el directorio /var/yp
.
...
system("make")
...
Kernel.system()
. Si un usuario malintencionado puede modificar la variable $PATH
para que señale a un binario malintencionado que se denomina make
y hacer que el programa pueda ejecutarse en su entorno, entonces el archivo binario malintencionado se cargará en lugar del que se pretende. Debido a la naturaleza de la aplicación, se ejecuta con los privilegios necesarios para realizar las operaciones del sistema, lo que significa que el comando make
del usuario malintencionado ahora se ejecutará con estos privilegios, posiblemente proporcionando al usuario malintencionado control total sobre el sistema.
def changePassword(username: String, password: String) = Action { request =>
...
s'echo "${password}" | passwd ${username} --stdin'.!
...
}
APPHOME
para determinar el directorio de instalación y, a continuación, ejecuta un script de inicialización en función de una ruta relativa desde el directorio especificado.
...
Dim cmd
Dim home
home = Environ$("AppHome")
cmd = home & initCmd
Shell cmd, vbNormalFocus
...
Example 1
se permite a un usuario malintencionado ejecutar comandos arbitrarios con el privilegio elevado de la aplicación mediante la modificación de la propiedad del sistema APPHOME
para que apunte a otra ruta de acceso que contiene una versión malintencionada de INITCMD
. Como el programa no valida el valor leído desde el entorno, si el usuario malintencionado puede controlar el valor de la propiedad del sistema APPHOME
, puede engañar a la aplicación para que ejecute código malintencionado y asuma el control del sistema.rman
y, a continuación, ejecutar un script cleanup.bat
para eliminar algunos archivos temporales. La secuencia de comandos rmanDB.bat
acepta un único parámetro de línea de comandos que especifica el tipo de copia de seguridad que realizar. Dado que se restringe el acceso a la base de datos, la aplicación ejecuta la copia de seguridad como un usuario con privilegios.
...
btype = Request.Form("backuptype")
cmd = "cmd.exe /K " & Chr(34) & "c:\util\rmanDB.bat " & btype & "&&c:\util\cleanup.bat" & Chr(34) & ";
Shell cmd, vbNormalFocus
...
backuptype
por parte del usuario. Una vez que se invoca el comando de shell, permitirá que se ejecuten varios comandos separados por dos signos de Y comercial. Si un usuario malintencionado pasa una cadena del tipo "&& del c:\\dbms\\*.*"
, la aplicación ejecutará este comando junto con los demás comandos especificados por el programa. Debido a la naturaleza de la aplicación, se ejecuta con los privilegios necesarios para interactuar con la base de datos, lo que significa que cualquier comando que el usuario malintencionado inserte, se ejecutará también con estos privilegios.make
en el directorio /var/yp
.
...
$result = shell_exec("make");
...
Runtime.exec()
. Si un usuario malintencionado puede modificar la variable $PATH
para que señale a un binario malintencionado que se denomina make
y hacer que el programa pueda ejecutarse en su entorno, entonces el archivo binario malintencionado se cargará en lugar del que se pretende. Debido a la naturaleza de la aplicación, se ejecuta con los privilegios necesarios para realizar las operaciones del sistema, lo que significa que el comando make
del usuario malintencionado ahora se ejecutará con estos privilegios, posiblemente proporcionando al usuario malintencionado control total sobre el sistema.content://my.authority/messages
content://my.authority/messages/123
content://my.authority/messages/deleted
content://my.authority/messages/deleted
proporcionando un código msgId con el valor deleted
:
// "msgId" is submitted by users
Uri dataUri = Uri.parse(WeatherContentProvider.CONTENT_URI + "/" + msgId);
Cursor wCursor1 = getContentResolver().query(dataUri, null, null, null, null);
isSecure
configurado como true
.Secure
para cada cookie. Si se define una marca, el explorador solo puede enviar la cookie a través de HTTPS. Enviar cookies a través de un canal no cifrado puede exponerlas a ataques de espionaje de red. Las marcas seguras ayudan a mantener la confidencialidad del valor de una cookie. Esto es especialmente importante cuando la cookie contiene datos privados o porta un identificador de sesión.isSecure
como true
.
...
Cookie cookie = new Cookie('emailCookie', emailCookie, path, maxAge, false, 'Strict');
...
isSecure
, las cookies enviadas durante una solicitud HTTPS también se envían en las solicitudes HTTP subsiguientes. El espionaje del tráfico de red a través de conexiones inalámbricas no cifradas es una tarea fácil para los atacantes. Enviar cookies (sobre todo las que incluyen ID de sesión) a través de HTTP puede poner en peligro la aplicación.Secure
configurada como true
.Secure
en cada cookie. Si se incluye una marca, el explorador solo puede enviar la cookie a través de HTTPS. Enviar cookies a través de un canal no cifrado puede exponerlas a ataques de reconocimiento de red, por lo que las marcas seguras ayudan a mantener la confidencialidad del valor de una cookie. Esto es especialmente importante cuando la cookie contiene datos privados o porta un identificador de sesión.Secure
.
...
HttpCookie cookie = new HttpCookie("emailCookie", email);
Response.AppendCookie(cookie);
...
Secure
, las cookies enviadas durante una solicitud HTTPS también se enviarán en subsiguientes solicitudes HTTP. Espiar tráfico de red a través de conexiones inalámbricas no cifradas es una tarea fácil para los atacantes, por lo que enviar cookies (sobre todo con ID de sesión) a través de HTTP puede poner en peligro la aplicación.Secure
en true
.Secure
para cada cookie. Si se define una marca, el explorador solo puede enviar la cookie a través de HTTPS. Enviar cookies a través de un canal no cifrado puede exponerlas a ataques de espionaje de red, por lo que las marcas seguras ayudan a mantener la confidencialidad del valor de una cookie. Esto es especialmente importante cuando la cookie contiene datos privados o identificadores de sesión, o cuando porta un token de CSRF.Secure
.
cookie := http.Cookie{
Name: "emailCookie",
Value: email,
}
http.SetCookie(response, &cookie)
...
Secure
, las cookies enviadas durante una solicitud HTTPS también se enviarán en las subsiguientes solicitudes HTTP. Los atacantes pueden secuestrar el tráfico de red no cifrado y poner en peligro la cookie, lo cual es especialmente fácil en el caso de las redes inalámbricas.Secure
configurada como true
.Secure
para cada cookie. Si se define una marca, el explorador solo puede enviar la cookie a través de HTTPS. Enviar cookies a través de un canal no cifrado puede exponerlas a ataques de espionaje de red, por lo que las marcas seguras ayudan a mantener la confidencialidad del valor de una cookie. Esto es especialmente importante cuando la cookie contiene datos privados o porta un identificador de sesión.use-secure-cookie
permite el envío de la cookie remember-me
a través de un transporte sin cifrar.
<http auto-config="true">
...
<remember-me use-secure-cookie="false"/>
</http>
Secure
, las cookies enviadas durante una solicitud HTTPS también se enviarán en las solicitudes HTTP subsiguientes. El espionaje del tráfico de red a través de conexiones inalámbricas no cifradas es una tarea fácil para los atacantes, por lo que enviar cookies (sobre todo las que incluyen ID de sesión) a través de HTTP puede poner en peligro la aplicación.Secure
configurada como true
.Secure
en cada cookie. Si se incluye una marca, el explorador solo puede enviar la cookie a través de HTTPS. Enviar cookies a través de un canal no cifrado puede exponerlas a ataques de reconocimiento de red, por lo que las marcas seguras ayudan a mantener la confidencialidad del valor de una cookie. Esto es especialmente importante cuando la cookie contiene datos privados o porta un identificador de sesión.Secure
como true
.
res.cookie('important_cookie', info, {domain: 'secure.example.com', path: '/admin', httpOnly: true, secure: false});
Secure
, las cookies enviadas durante una solicitud HTTPS también se enviarán en subsiguientes solicitudes HTTP. Espiar tráfico de red a través de conexiones inalámbricas no cifradas es una tarea fácil para los atacantes, por lo que enviar cookies (sobre todo con ID de sesión) a través de HTTP puede poner en peligro la aplicación.NSHTTPCookieSecure
configurada como TRUE
.Secure
en cada cookie. Si se incluye una marca, el explorador solo puede enviar la cookie a través de HTTPS. Enviar cookies a través de un canal no cifrado puede exponerlas a ataques de reconocimiento de red, por lo que las marcas seguras ayudan a mantener la confidencialidad del valor de una cookie. Esto es especialmente importante cuando la cookie contiene datos privados o porta un identificador de sesión.Secure
.
...
NSDictionary *cookieProperties = [NSDictionary dictionary];
...
NSHTTPCookie *cookie = [NSHTTPCookie cookieWithProperties:cookieProperties];
...
Secure
, las cookies enviadas durante una solicitud HTTPS también se enviarán en subsiguientes solicitudes HTTP. Espiar tráfico de red a través de conexiones inalámbricas no cifradas es una tarea fácil para los atacantes, por lo que enviar cookies (sobre todo con ID de sesión) a través de HTTP puede poner en peligro la aplicación.Secure
en true
.Secure
en cada cookie. Si se incluye una marca, el explorador solo puede enviar la cookie a través de HTTPS. Enviar cookies a través de un canal no cifrado puede exponerlas a ataques de reconocimiento de red, por lo que las marcas seguras ayudan a mantener la confidencialidad del valor de una cookie. Esto es especialmente importante cuando la cookie contiene datos privados o porta un identificador de sesión.Secure
.
...
setcookie("emailCookie", $email, 0, "/", "www.example.com");
...
Secure
, las cookies enviadas durante una solicitud HTTPS también se enviarán en las subsiguientes solicitudes HTTP. Los atacantes pueden secuestrar el tráfico de red no cifrado y poner en peligro la cookie, lo cual es especialmente fácil en el caso de las redes inalámbricas.Secure
en True
.Secure
en cada cookie. Si se incluye una marca, el explorador solo puede enviar la cookie a través de HTTPS. Enviar cookies a través de un canal no cifrado puede exponerlas a ataques de reconocimiento de red, por lo que las marcas seguras ayudan a mantener la confidencialidad del valor de una cookie. Esto es especialmente importante cuando la cookie contiene datos privados o identificadores de sesión, o cuando porta un token de CSRF.Secure
.
from django.http.response import HttpResponse
...
def view_method(request):
res = HttpResponse()
res.set_cookie("emailCookie", email)
return res
...
Secure
, las cookies enviadas durante una solicitud HTTPS también se enviarán en las subsiguientes solicitudes HTTP. Los atacantes pueden secuestrar el tráfico de red no cifrado y poner en peligro la cookie, lo cual es especialmente fácil en el caso de las redes inalámbricas.Secure
configurada como true
.Secure
para cada cookie. Si se define una marca, el explorador solo puede enviar la cookie a través de HTTPS. Enviar cookies a través de un canal no cifrado puede exponerlas a ataques de espionaje de red, por lo que las marcas seguras ayudan a mantener la confidencialidad del valor de una cookie. Esto es especialmente importante cuando la cookie contiene datos privados o porta un identificador de sesión.Secure
.
Ok(Html(command)).withCookies(Cookie("sessionID", sessionID, secure = false))
Secure
, las cookies enviadas durante una solicitud HTTPS también se enviarán en las solicitudes HTTP subsiguientes. El espionaje del tráfico de red a través de conexiones inalámbricas no cifradas es una tarea fácil para los atacantes, por lo que enviar cookies (sobre todo las que incluyen ID de sesión) a través de HTTP puede poner en peligro la aplicación.NSHTTPCookieSecure
configurada como TRUE
.Secure
para cada cookie. Si se define una marca, el explorador solo puede enviar la cookie a través de HTTPS. Enviar cookies a través de un canal no cifrado puede exponerlas a ataques de espionaje de red, por lo que las marcas seguras ayudan a mantener la confidencialidad del valor de una cookie. Esto es especialmente importante cuando la cookie contiene datos privados o porta un identificador de sesión.Secure
.
...
let properties = [
NSHTTPCookieDomain: "www.example.com",
NSHTTPCookiePath: "/service",
NSHTTPCookieName: "foo",
NSHTTPCookieValue: "bar"
]
let cookie : NSHTTPCookie? = NSHTTPCookie(properties:properties)
...
Secure
, las cookies enviadas durante una solicitud HTTPS también se enviarán en las solicitudes HTTP subsiguientes. El espionaje del tráfico de red a través de conexiones inalámbricas no cifradas es una tarea fácil para los atacantes, por lo que enviar cookies (sobre todo las que incluyen ID de sesión) a través de HTTP puede poner en peligro la aplicación.HttpOnly
como true
.HttpOnly
que evita que scripts del lado del cliente puedan acceder a la cookie. Los ataques Cross-Site Scripting suelen acceder a las cookies con el fin de robar los identificadores de sesión o los tokens de autenticación. Cuando el indicador HttpOnly
no está habilitado, los usuarios malintencionados pueden acceder más fácilmente a las cookies del usuario.HttpOnly
.
HttpCookie cookie = new HttpCookie("emailCookie", email);
Response.AppendCookie(cookie);
HttpOnly
como true
.HttpOnly
que evita que los scripts del lado del cliente accedan a la cookie. Los ataques Cross-Site Scripting suelen acceder a las cookies con el fin de robar los identificadores de sesión o los tokens de autenticación. Cuando HttpOnly
no está habilitado, los usuarios malintencionados pueden acceder más fácilmente a las cookies del usuario.HttpOnly
.
cookie := http.Cookie{
Name: "emailCookie",
Value: email,
}
...
HttpOnly
como true
.HttpOnly
que evita que scripts del lado del cliente puedan acceder a la cookie. Los ataques Cross-Site Scripting suelen acceder a las cookies con el fin de robar los identificadores de sesión o los tokens de autenticación. Cuando el indicador HttpOnly
no está habilitado, los usuarios malintencionados pueden acceder más fácilmente a las cookies del usuario.HttpOnly
.
javax.servlet.http.Cookie cookie = new javax.servlet.http.Cookie("emailCookie", email);
// Missing a call to: cookie.setHttpOnly(true);
HttpOnly
como true
.HttpOnly
que evita que scripts del lado del cliente puedan acceder a la cookie. Los ataques Cross-Site Scripting suelen acceder a las cookies con el fin de robar los identificadores de sesión o los tokens de autenticación. Cuando el indicador HttpOnly
no está habilitado, los usuarios malintencionados pueden acceder más fácilmente a las cookies del usuario.httpOnly
.
res.cookie('important_cookie', info, {domain: 'secure.example.com', path: '/admin'});
HttpOnly
como true
.HttpOnly
que evita que scripts del lado del cliente puedan acceder a la cookie. Los ataques Cross-Site Scripting suelen acceder a las cookies con el fin de robar los identificadores de sesión o los tokens de autenticación. Cuando el indicador HttpOnly
no está habilitado, los usuarios malintencionados pueden acceder más fácilmente a las cookies del usuario.HttpOnly
.
setcookie("emailCookie", $email, 0, "/", "www.example.com", TRUE); //Missing 7th parameter to set HttpOnly
HttpOnly
como True
.HttpOnly
que evita que scripts del lado del cliente puedan acceder a la cookie. Los ataques de Cross-Site Scripting suelen acceder a las cookies con el fin de robar los identificadores de sesión o los tokens de autenticación. Cuando HttpOnly
no está habilitado, los atacantes pueden acceder más fácilmente a las cookies del usuario.HttpOnly
.
from django.http.response import HttpResponse
...
def view_method(request):
res = HttpResponse()
res.set_cookie("emailCookie", email)
return res
...
HttpOnly
como true
.HttpOnly
que evita que scripts del lado del cliente puedan acceder a la cookie. Los ataques Cross-Site Scripting suelen acceder a las cookies con el fin de robar los identificadores de sesión o los tokens de autenticación. Cuando el indicador HttpOnly
no está habilitado, los usuarios malintencionados pueden acceder más fácilmente a las cookies del usuario.HttpOnly
.
Ok(Html(command)).withCookies(Cookie("sessionID", sessionID, httpOnly = false))
HttpOnly
como true
.HttpOnly
que evita que scripts del lado del cliente puedan acceder a la cookie. Los ataques Cross-Site Scripting suelen acceder a las cookies con el fin de robar los identificadores de sesión o los tokens de autenticación. Cuando el indicador HttpOnly
no está habilitado, los usuarios malintencionados pueden acceder más fácilmente a las cookies del usuario.HttpOnly
como true
.
server.servlet.session.cookie.http-only=false
HttpOnly
como true
.HttpOnly
que evita que scripts del lado del cliente puedan acceder a la cookie. Los ataques Cross-Site Scripting suelen acceder a las cookies con el fin de robar los identificadores de sesión o los tokens de autenticación. Cuando el indicador HttpOnly
no está habilitado, los usuarios malintencionados pueden acceder más fácilmente a las cookies del usuario.HttpOnly
como true
.
session_set_cookie_params(0, "/", "www.example.com", true, false);
HttpOnly
para true
en las cookies de sesión.HttpOnly
que evita que scripts del lado del cliente puedan acceder a la cookie. Los ataques de Cross-Site Scripting suelen acceder a las cookies con el fin de robar los identificadores de sesión o los tokens de autenticación. Cuando HttpOnly
no está habilitado, los atacantes pueden acceder más fácilmente a las cookies del usuario.HttpOnly
.
...
MIDDLEWARE = (
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'csp.middleware.CSPMiddleware',
'django.middleware.security.SecurityMiddleware',
...
)
...
SESSION_COOKIE_HTTPONLY = False
...