xp_cmdshell
no se puede utilizar con seguridad, por lo que no debe usarse.xp_cmdshell
inicia un shell de comandos de Windows para ejecutar la cadena de comandos proporcionada. El comando se ejecuta en el sistema predeterminado o en un contexto de proxy proporcionado. Sin embargo, no hay ninguna forma de limitar un usuario al conjunto especificado previamente de operaciones con privilegios y cualquier concesión de privilegio anima al usuario a ejecutar la cadena de comandos que desee.if
. Exige que la variable s
sea no nula, mientras que en la única ruta de acceso en la que a s
se le puede asignar un valor no nulo hay una instrucción return
.
String s = null;
if (b) {
s = "Yes";
return;
}
if (s != null) {
Dead();
}
...
CALL FUNCTION 'ENQUE_SLEEP'
EXPORTING
SECONDS = usrInput.
...
GetTokenBucketLimiter()
utiliza una dirección IP remota (RemoteIpAddress
) como clave de partición al crear una RateLimitPartition:
...
builder.Services.AddRateLimiter(limiterOptions => {
limiterOptions.GlobalLimiter = PartitionedRateLimiter.Create<HttpContext, IPAddress>(context => {
IPAddress? ip = context.Connection.RemoteIpAddress;
return RateLimitPartition.GetTokenBucketLimiter(ip!, _ =>
new TokenBucketRateLimiterOptions
{
TokenLimit = 7
});
});
});
...
unsigned int usrSleepTime = uatoi(usrInput);
sleep(usrSleepTime);
Sleep(url.duration);
Future
. Si especifica un número grande, un atacante puede bloquear la función Future
indefinidamente.
final duration = Platform.environment['DURATION'];
Future.delayed(Duration(seconds: int.parse(duration!)), () => ...);
func test(r *http.Request) {
...
i, _ := strconv.Atoi(r.FormValue("TIME"))
runtime.KeepAlive(i)
...
}
Ejemplo 2: el siguiente código lee una cadena de un archivo zip. Como utiliza el método
int usrSleepTime = Integer.parseInt(usrInput);
Thread.sleep(usrSleepTime);
readLine()
, leerá una cantidad ilimitada de datos de entrada. Un atacante podría aprovechar este código para provocar una OutOfMemoryException
o consumir una gran cantidad de memoria a fin de que el programa dedique más tiempo a realizar la recopilación de elementos no utilizados o se quede sin memoria durante alguna operación posterior.
InputStream zipInput = zipFile.getInputStream(zipEntry);
Reader zipReader = new InputStreamReader(zipInput);
BufferedReader br = new BufferedReader(zipReader);
String line = br.readLine();
Ejemplo 2: el código siguiente escribe en un archivo. Dado que se puede escribir y volver a escribir una y otra vez en el archivo hasta que el agente usuario lo considere cerrado, se ven afectados la cuota de disco, el ancho de banda de E/S y los procesos que puedan requerir un análisis del contenido del archivo.
var fsync = requestFileSystemSync(0, userInput);
function oninit(fs) {
fs.root.getFile('applog.txt', {create: false}, function(fileEntry) {
fileEntry.createWriter(function(fileWriter) {
fileWriter.seek(fileWriter.length);
var bb = new BlobBuilder();
bb.append('Appending to a file');
fileWriter.write(bb.getBlob('text/plain'));
}, errorHandler);
}, errorHandler);
}
window.requestFileSystem(window.TEMPORARY, 1024*1024, oninit, errorHandler);
procedure go_sleep (
usrSleepTime in NUMBER)
is
dbms_lock.sleep(usrSleepTime);
connect
. Si especifica un número grande, un atacante puede bloquear la función connect
de forma indefinida.
...
insecure_config_ssl_connection_timeout = {
'user': username,
'password': retrievedPassword,
'host': databaseHost,
'port': "3306",
'connection_timeout': connection_timeout
}
mysql.connector.connect(**insecure_config_ssl_connection_timeout)
...
Ejemplo 2: el siguiente código lee una cadena de un archivo. Como utiliza el método
Kernel.sleep(user_input)
readline()
sin especificar un límite, leerá una cantidad ilimitada de datos de entrada. Un atacante podría aprovechar este código para provocar que el proceso se cuelgue, a la vez que consume más y más memoria, hasta que posiblemente se quede sin memoria por completo.
fd = File.new(myFile)
line = fd.readline
Formatter.format()
.
...
Formatter formatter = new Formatter(Locale.US);
String format = "The customer: %s %s has the balance %4$." + userInput + "f";
formatter.format(format, firstName, lastName, accountNo, balance);
...
java.util.MissingFormatArgumentException
y, puesto que no está en un bloque try, provocar un error en la aplicación. accountNo
confidencial en la cadena resultante.java.lang.Double.parseDouble()
y métodos relacionados que puede provocar que el subproceso se bloquee al analizar cualquier número incluido en el intervalo [2^(-1022) - 2^(-1075) : 2^(-1022) - 2^(-1076)]
. Este defecto se puede utilizar para ejecutar un ataque de denegación de servicio (DoS).
Double d = Double.parseDouble(request.getParameter("d"));
d
es un valor incluido en un intervalo como, por ejemplo, "0.0222507385850720119e-00306"
, para provocar que el programa se bloquee al procesar la solicitud.
(e+)+
([a-zA-Z]+)*
(e|ee)+
(e+)+
([a-zA-Z]+)*
(e|ee)+
(e+)+
([a-zA-Z]+)*
(e|ee)+
(e+)+
([a-zA-Z]+)*
(e|ee)+
(e+)+
([a-zA-Z]+)*
(e|ee)+
(e+)+
([a-zA-Z]+)*
(e|ee)+
(e+)+
([a-zA-Z]+)*
(e|ee)+
(e+)+
([a-zA-Z]+)*
(e|ee)+
NSString *regex = @"^(e+)+$";
NSPredicate *pred = [NSPRedicate predicateWithFormat:@"SELF MATCHES %@", regex];
if ([pred evaluateWithObject:mystring]) {
//do something
}
(e+)+
([a-zA-Z]+)*
(e|ee)+
(e+)+
([a-zA-Z]+)*
(e|ee)+
(e+)+
([a-zA-Z]+)*
(e+)+
([a-zA-Z]+)*
(e|ee)+
(e+)+
([a-zA-Z]+)*
(e|ee)+
let regex : String = "^(e+)+$"
let pred : NSPredicate = NSPRedicate(format:"SELF MATCHES \(regex)")
if (pred.evaluateWithObject(mystring)) {
//do something
}
Example 1
, si el usuario malintencionado proporciona la cadena "eeeeZ", a continuación, habrá 16 evaluaciones internas que el analizador regex deberá seguir para identificar una coincidencia. Si el usuario malintencionado proporciona 16 "e" ("eeeeeeeeeeeeeeeeZ") como cadena, el analizador regex deberá realizar 65536 (2^16) evaluaciones. El usuario malintencionado puede llegar a consumir recursos informáticos al aumentar el número de caracteres consecutivos de coincidencia. No hay implementaciones de expresiones regulares conocidas que sean inmunes a esta vulnerabilidad. Todas las plataformas y los lenguajes son vulnerables a este ataque.routes.Ignore
en aplicaciones ASP.NET. Este método permite que la entrada externa defina comportamientos de enrutamiento. Específicamente, el uso de comodines, como {*allaspx}
, proporciona a los atacantes un punto de apoyo para manipular las acciones de enrutamiento. El problema central surge cuando la entrada que controla estos patrones comodín no se valida o desinfecta meticulosamente.
Marker child = MarkerManager.getMarker("child");
Marker parent = MarkerManager.getMarker("parent");
child.addParents(MarkerManager.getMarker(userInput));
parent.addParents(MarkerManager.getMarker(userInput2));
String toInfinity = child.toString();
child
y parent
en un marcador definido por el usuario. Si el usuario introduce el marcador principal de child
para que sea parent
, y el marcador principal de parent
para que sea child
, se crea un enlace circular en la estructura de datos del marcador. Al ejecutar el método recursivo toString
en la estructura de datos que contiene el enlace circular, el programa generará una excepción de desbordamiento de pila y fallará. Esto provoca una denegación de servicio por agotamiento de la pila.StringBuilder
o StringBuffer
inicializada con el tamaño de matriz de respaldo predeterminado, JVM podría consumir espacio de la memoria en montón de forma excesiva.StringBuilder
o StringBuffer
inicializada con el tamaño de matriz de caracteres de respaldo predeterminado (16), la aplicación podría consumir una gran cantidad de memoria en montón mientras se cambia el tamaño de la matriz subyacente para acomodar los datos del usuario. Cuando se anexan datos a una instancia StringBuilder
o StringBuffer
, la instancia determinará si la matriz de caracteres de respaldo posee suficiente espacio libre para almacenar los datos. Si los datos no se pueden acomodar, la instancia StringBuilder
o StringBuffer
creará una nueva matriz con una capacidad como mínimo dos veces mayor que la anterior, conservándose la matriz antigua en el montón hasta que se recolecte. Los atacantes pueden aprovechar este detalle de implementación para ejecutar un ataque de Denial of Service (DoS).StringBuilder
inicializada con el constructor predeterminado.
...
StringBuilder sb = new StringBuilder();
final String lineSeparator = System.lineSeparator();
String[] labels = request.getParameterValues("label");
for (String label : labels) {
sb.append(label).append(lineSeparator);
}
...
StringBuilder
o StringBuffer
inicializada con el tamaño de matriz de respaldo predeterminado, JVM podría consumir espacio de la memoria en montón de forma excesiva.StringBuilder
o StringBuffer
inicializada con el tamaño de matriz de caracteres de respaldo predeterminado (16), la aplicación podría consumir una gran cantidad de memoria en montón mientras se cambia el tamaño de la matriz subyacente para acomodar los datos del usuario. Cuando se anexan datos a una instancia StringBuilder
o StringBuffer
, la instancia determinará si la matriz de caracteres de respaldo posee suficiente espacio libre para almacenar los datos. Si los datos no se pueden acomodar, la instancia StringBuilder
o StringBuffer
creará una nueva matriz con una capacidad como mínimo dos veces mayor que la anterior, conservándose la matriz antigua en el montón hasta que se recolecte. Los atacantes pueden aprovechar este detalle de implementación para ejecutar un ataque de Denial of Service (DoS).StringBuilder
inicializada con el constructor predeterminado.
...
val sb = StringBuilder()
val labels = request.getParameterValues("label")
for (label in labels) {
sb.appendln(label)
}
...
chroot()
podría permitir a los usuarios malintencionados escapar de un aprisionamiento chroot.chroot()
permite a un proceso cambiar su percepción del directorio raíz del sistema de procesamiento de archivos. Después de llamar correctamente a chroot()
, un proceso no puede acceder a ningún archivo que se encuentre fuera del árbol de directorios definido por el nuevo directorio raíz. Un entorno de este tipo recibe el nombre de aprisionamiento chroot y se utiliza normalmente para impedir la posibilidad de que los procesos puedan subvertirse y usarse para obtener acceso a archivos no autorizados. Por ejemplo, muchos servidores FTP se ejecutan en aprisionamientos chroot para impedir que un usuario malintencionado que descubra una nueva vulnerabilidad en el servidor descargue el archivo de contraseñas u otros archivos confidenciales del sistema.chroot()
puede permitir a los usuarios malintencionados escaparse del aprisionamiento chroot. La función chroot()
no cambia el directorio de trabajo actual del proceso, por lo que las rutas relativas aún pueden hacer referencia a los recursos del sistema de archivos que se encuentran fuera del aprisionamiento chroot una vez que se haya llamado a chroot()
.
chroot("/var/ftproot");
...
fgets(filename, sizeof(filename), network);
localfile = fopen(filename, "r");
while ((len = fread(buf, 1, sizeof(buf), localfile)) != EOF) {
fwrite(buf, 1, sizeof(buf), network);
}
fclose(localfile);
GET
de FTP. El servidor FTP llama a chroot()
en sus rutinas de inicialización en un intento de impedir el acceso a los archivos ubicados fuera de /var/ftproot
. Sin embargo, como el servidor no cambia el directorio de trabajo actual llamando a chdir("/")
, un usuario malintencionado podría solicitar el archivo "../../../../../etc/passwd
" y obtener una copia del archivo de contraseña del sistema.exclude
. Esto es difícil de mantener y es susceptible a errores. Si los desarrolladores agregan campos nuevos al formulario o al Model
que respalda el formulario y olvidan actualizar el filtro exclude
, podrían estar exponiendo campos confidenciales a los atacantes. Los atacantes podrán enviar y enlazar datos malintencionados a cualquier campo no excluido.User
, pero controla en una lista de rechazados el id
del usuario:
from myapp.models import User
...
class UserForm(ModelForm):
class Meta:
model = User
exclude = ['id']
...
User
se actualizó con un atributo role
nuevo y el UserForm
asociado no se actualizó, el atributo role
se expondría en el formulario.SECRET_KEY
. Si la configuración SECRET_KEY
se filtra, un usuario malintencionado no solo puede falsificar los datos de sesión, sino que además, si la aplicación utiliza una subclase para serializar los datos de sesión en cookies, un usuario malintencionado podrá diseñar datos de subclase malintencionados que ejecutarán código arbitrario en el momento de deserialización.Host
se puede permitir que un usuario malintencionado envíe un valor de Host
falso que se puede utilizar para falsificación de solicitud de Cross-Site Scripting, ataques de envenenamiento de caché y envenenamiento de vínculos en correos electrónicos.*
" como una entrada en la configuración de ALLOWED_HOSTS
. django.http.HttpRequest.get_host()
utiliza esta configuración para validar el encabezado de Host
. Un valor de "*
" permitirá cualquier host en el encabezado de Host
. Un atacante podría utilizar esto en ataques de envenenamiento de caché o para el envenenamiento de vínculos en correos electrónicos.Host
para hacer referencia al sitio que facilita la función para restablecer la contraseña a fin de evitar direcciones URL con codificación rígida. Por ejemplo:
...
def reset_password(request):
url = "http://%s/new_password/?token=%s" % (request.get_host(), generate_token())
send_email(reset_link=url)
redirect("home")
...
Host
falso que señale un servidor que controla. La víctima recibirá un correo electrónico con un vínculo al sistema para restablecer contraseñas y si decide visitar el vínculo, estará visitando el sitio controlado por el usuario malintencionado que facilitará un formulario falso para recopilar las credenciales de la víctima.SECRET_KEY
se filtra, un usuario malintencionado podrá almacenar datos arbitrarios en la cookie de sesión que se deserializará en el servidor, lo que provocará la ejecución de código arbitrario.SECRET_KEY
si se codifica en el archivo de configuración settings.py
:
...
def some_view_method(request):
url = request.GET['url']
if "http://" in url:
content = urllib.urlopen(url)
return HttpResponse(content)
...
Example 1
comprueba que el parámetro url
sea una dirección URL válida al comprobar que "http://" esté presente en la dirección URL. Un atacante malintencionado podría enviar la siguiente dirección URL para filtrar el archivo de configuración settings.py
que puede contener SECRET_KEY
:
file://proc/self/cwd/app/settings.py#http://
const dns = require('dns');
// User-controlled input for DNS servers
const customDnsServers = from_user_controlled_input;
// Set custom DNS servers
dns.setServers(customDnsServers);
customDnsServers
se le asigna un valor derivado de la entrada controlada por el usuario. Esta entrada se utiliza luego para configurar los servidores DNS usandodns.setServers(customDnsServers)
. Si un atacante proporciona direcciones de servidor DNS maliciosas, puede dirigir la aplicación para que resuelva nombres de dominio utilizando sus servidores, lo que puede devolver direcciones IP falsas.Dockerfile
no especifica un USER
, los contenedores de Docker se ejecutan con privilegios de superusuario de forma predeterminada. Estos privilegios de superusuario se propagan al código que se ejecuta dentro del contenedor, que suele ser más permisivo de lo necesario. La ejecución del contenedor Docker con privilegios de superusuario amplía la superficie de ataque, lo que podría permitir a los atacantes realizar formas de explotación más graves.