Un API es un contrato entre un autor de llamada y un receptor de llamada. Las formas de abuso de API más comunes los produce el autor de llamada cuando no consigue atender su fin de este contrato. Por ejemplo, si un programa no consigue llamar chdir() después de llamar chroot(), se viola el contrato que especifica cómo cambiar el directorio de origen activo de una forma segura. Otro buen ejemplo de un abuso de manual es esperar que el receptor devuelva una información de DNS de confianza al autor de llamada. En este caso, el autor de llamada abusa el API del receptor haciendo determinadas suposiciones sobre su comportamiento (que el valor de retorno se puede usar con fines de autenticación). También se puede violar el contrato entre el autor de llamada y el receptor desde el otro lado. Por ejemplo, si un codificador envía SecureRandom y devuelve un valor no aleatorio, se viola el contrato.
DBMS_UTILITY.EXEC_DDL_STATEMENT
solo ejecutará instrucciones clasificadas como parte del lenguaje de definición de datos. El resto de instrucciones que no sean compatibles con SQL incrustado se omitirá sin notificación alguna. Este comportamiento dificulta la detección de errores cuando se utiliza el procedimiento.http://www.example.com/index.php?param=...
, el siguiente fragmento de código de php dentro de index.php
imprimirá el valor del parámetro de URL param
(transferido en lugar de "...") en la pantalla si coincide con la expresión regular de POSIX '^[[:alnum:]]*$'
que representa a "cero o más caracteres alfanuméricos":
<?php
$pattern = '^[[:alnum:]]*$';
$string = $_GET['param'];
if (ereg($pattern, $string)) {
echo($string);
}
?>
Example 1
funciona como se esperaba con la entrada alfanumérica, debido a que se utiliza la función ereg()
no segura para validar la entrada contaminada, es posible llevar a cabo un ataque de scripts de sitios (XSS) mediante la inyección de un byte null
. Al pasar un valor para param
que contiene una cadena alfanumérica válida seguida de un byte null
y, a continuación, una etiqueta <script>
(por ejemplo, "Hello123%00<script>alert("XSS")</script>"
), ereg($pattern, $string)
seguirá siendo true
, dado que la función ereg()
ignora todo lo que sigue a un carácter de byte null
al leer la cadena de entrada (de izquierda a derecha). En este ejemplo, esto significa que la etiqueta <script>
inyectada seguida del byte null
se mostrará al usuario y se evaluará.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.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.java.io
.FileResponse
con entrada del usuario podría permitir que un usuario malintencionado descargue binarios de aplicaciones o vea archivos arbitrarios dentro de directorios protegidos.
from django.http import FileResponse
...
def file_disclosure(request):
path = request.GET['returnURL']
return FileResponse(open(path, 'rb'))
...
Ejemplo 2: el siguiente código obtiene datos que no son de confianza y los utiliza para crear una ruta que se utiliza en un reenvío del servidor.
...
String returnURL = request.getParameter("returnURL");
RequestDispatcher rd = request.getRequestDispatcher(returnURL);
rd.forward();
...
...
<% String returnURL = request.getParameter("returnURL"); %>
<jsp:include page="<%=returnURL%>" />
...
...
String returnURL = request.getParameter("returnURL");
return new ModelAndView(returnURL);
...
<webflow:end-state id="finalStep" view="${requestParameters.url}"/>
<webflow:view-state id="showView" view="${requestParameters.test}">
<bean class="org.springframework.web.servlet.view.
InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/views/" />
<property name="suffix" value=".jsp" />
</bean>
InternalResourceViewResolver
tomará el prefijo con el que está configurado, luego concatenará el valor pasado en el atributo de vista y finalmente agregará el sufijo.
...
String returnURL = request.getParameter("returnURL");
return new ActionForward(returnURL);
...
realloc()
para cambiar el tamaño de los búferes que almacenan información confidencial. Es posible que la función deje una copia de la información confidencial en la memoria, donde no se puede sobrescribir.realloc()
se utiliza normalmente para aumentar el tamaño de un bloque de memoria asignada. Esta operación requiere a menudo la copia de contenido del bloque de memoria antiguo a uno nuevo más grande. Esta operación deja intacto el contenido del bloque original, pero inaccesible para el programa, lo que impide que este pueda limpiar datos confidenciales de la memoria. Si un usuario malintencionado consigue examinar posteriormente el contenido del volcado de la memoria, los datos confidenciales podrían mostrarse.realloc()
en un búfer que contiene datos confidenciales:
plaintext_buffer = get_secret();
...
plaintext_buffer = realloc(plaintext_buffer, 1024);
...
scrub_memory(plaintext_buffer, 1024);
realloc()
, por lo que una copia de los mismos aún puede estar visible en la memoria asignada originalmente para plaintext_buffer
.VirtualLock
para bloquear páginas que contengan datos confidenciales. No siempre se implementa la función.VirtualLock
está diseñada para bloquear páginas en la memoria a fin de impedir que se transmitan a un disco. Sin embargo, en Windows 95/98/ME, la función solo se implementa como código stub y no tiene ningún efecto.