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.
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)
}
...
...
user_ops = request->get_form_field( 'operation' ).
CONCATENATE: 'PROGRAM zsample.| FORM calculation. |' INTO code_string,
calculator_code_begin user_ops calculator_code_end INTO code_string,
'ENDFORM.|' INTO code_string.
SPLIT code_string AT '|' INTO TABLE code_table.
GENERATE SUBROUTINE POOL code_table NAME calc_prog.
PERFORM calculation IN PROGRAM calc_prog.
...
operation
es un valor benigno. Sin embargo, si el atacante especifica operaciones de idioma que son válidas y maliciosas al mismo tiempo, dichas operaciones se ejecutarán con todos los privilegios del proceso primario. Estos ataques llegan a ser más peligrosos cuando el código que se inyecta accede a recursos del sistema o ejecuta comandos del sistema. Por ejemplo, si un usuario malintencionado especifica "MOVE 'shutdown -h now' to cmd. CALL 'SYSTEM' ID 'COMMAND' FIELD cmd ID 'TAB' FIELD TABL[]." como valor de operation
, se ejecutaría un comando de apagado en el sistema host.
...
var params:Object = LoaderInfo(this.root.loaderInfo).parameters;
var userOps:String = String(params["operation"]);
result = ExternalInterface.call("eval", userOps);
...
operation
es un valor benigno, como "8 + 7 * 2", en cuyo caso, a la variable result
se le asigna un valor de 22. Sin embargo, si un usuario malintencionado especifica operaciones de lenguaje que son válidas y malintencionadas, dichas operaciones deberían ejecutarse con todos los privilegios del proceso principal. Estos ataques son incluso más peligrosos cuando el lenguaje subyacente proporciona acceso a los recursos del sistema o permite la ejecución de comandos del sistema. En el caso de ActionScript, el atacante podría utilizar esta vulnerabilidad para ejecutar un ataque XSS (Cross-Site Scripting).
...
public static object CEval(string sCSCode)
{
CodeDomProvider icc = CodeDomProvider.CreateProvider("CSharp");
CompilerParameters cparam = new CompilerParameters();
cparam.ReferencedAssemblies.Add("system.dll");
cparam.CompilerOptions = "/t:library";
cparam.GenerateInMemory = true;
StringBuilder sb_code = new StringBuilder("");
sb_code.Append("using System;\n");
sb_code.Append("namespace Fortify_CodeEval{ \n");
sb_code.Append("public class FortifyCodeEval{ \n");
sb_code.Append("public object EvalCode(){\n");
sb_code.Append(sCSCode + "\n");
sb_code.Append("} \n");
sb_code.Append("} \n");
sb_code.Append("}\n");
CompilerResults cr = icc.CompileAssemblyFromSource(cparam, sb_code.ToString());
if (cr.Errors.Count > 0)
{
logger.WriteLine("ERROR: " + cr.Errors[0].ErrorText);
return null;
}
System.Reflection.Assembly a = cr.CompiledAssembly;
object o = a.CreateInstance("Fortify_CodeEval.FortifyCodeEval");
Type t = o.GetType();
MethodInfo mi = t.GetMethod("EvalCode");
object s = mi.Invoke(o, null);
return s;
}
...
sCSCode
es un valor benigno, como "return 8 + 7 * 2", en cuyo caso 22 es el valor de devolución de la función CEval
. Sin embargo, si el atacante especifica operaciones de idioma que son válidas y maliciosas al mismo tiempo, dichas operaciones se ejecutarán con todos los privilegios del proceso primario. Estos ataques son incluso más peligrosos cuando el lenguaje subyacente proporciona acceso a los recursos del sistema o permite la ejecución de comandos del sistema. Por ejemplo, .Net permite invocar las API de Windows. Si un atacante especifica "return System.Diagnostics.Process.Start(\"shutdown\", \"/s /t 0\");" como el valor de operation
, se ejecutará un comando de apagado en el sistema host.
...
ScriptEngineManager scriptEngineManager = new ScriptEngineManager();
ScriptEngine scriptEngine = scriptEngineManager.getEngineByExtension("js");
userOps = request.getParameter("operation");
Object result = scriptEngine.eval(userOps);
...
operation
es un valor benigno, como "8 + 7 * 2", en cuyo caso la variable result
se asigna a un valor de 22. No obstante, si un atacante especifica operaciones de idiomas que sean tanto válidas como maliciosas, estas operaciones se ejecutarían con todos los privilegios del proceso primario. Estos ataques son incluso más peligrosos cuando el lenguaje subyacente proporciona acceso a los recursos del sistema o permite la ejecución de comandos del sistema. Por ejemplo, JavaScript permite la invocación de objetos Java. Si un usuario malintencionado especifica " java.lang.Runtime.getRuntime().exec("shutdown -h now")" como valor de operation
, se ejecutará un comando de apagado en el sistema host.
...
userOp = form.operation.value;
calcResult = eval(userOp);
...
operation
es un valor benigno, como "8 + 7 * 2", en cuyo caso la variable calcResult
se asigna a un valor de 22. No obstante, si un atacante especifica operaciones de idiomas que sean tanto válidas como maliciosas, estas operaciones se ejecutarían con todos los privilegios del proceso primario. Estos ataques son incluso más peligrosos cuando el lenguaje subyacente proporciona acceso a los recursos del sistema o permite la ejecución de comandos del sistema. En el caso de JavaScript, el atacante puede utilizar esta vulnerabilidad para realizar un ataque de secuencias entre sitios.
...
@property (strong, nonatomic) WKWebView *webView;
@property (strong, nonatomic) UITextField *inputTextField;
...
[_webView evaluateJavaScript:[NSString stringWithFormat:@"document.body.style.backgroundColor="%@";", _inputTextField.text] completionHandler:nil];
...
<body>
de webView
debería tener como estilo un fondo azul. Sin embargo, si un usuario malintencionado proporciona una entrada malintencionada todavía válida, podría ser capaz de ejecutar código JavaScript arbitrario. Por ejemplo, dado que JavaScript puede obtener acceso a determinado tipo de información privada, como las cookies, si un usuario malintencionado especificara "white";document.body.innerHTML=document.cookie;"" como entrada de UITextField, la información de cookie se escribiría en la página de manera visible. Estos ataques son incluso más peligrosos cuando el lenguaje subyacente proporciona acceso a los recursos del sistema o permite la ejecución de comandos del sistema, como cuando el código inyectado se ejecuta con todos los privilegios del proceso primario.
...
$userOps = $_GET['operation'];
$result = eval($userOps);
...
operation
es un valor benigno, como "8 + 7 * 2", en cuyo caso a la variable result
se le asigna un valor de 22. No obstante, si un atacante especifica operaciones de idiomas que sean tanto válidas como maliciosas, estas operaciones se ejecutarían con todos los privilegios del proceso primario. Estos ataques son incluso más peligrosos cuando el lenguaje subyacente proporciona acceso a los recursos del sistema o permite la ejecución de comandos del sistema. Por ejemplo, si un usuario malintencionado especificara "exec('shutdown -h now')" como el valor de operation
, se ejecutaría en el sistema host un comando de apagado.
...
userOps = request.GET['operation']
result = eval(userOps)
...
operation
es un valor benigno, como "8 + 7 * 2", en cuyo caso a la variable result
se le asigna un valor de 22. No obstante, si un atacante especifica operaciones de idiomas que sean tanto válidas como maliciosas, estas operaciones se ejecutarían con todos los privilegios del proceso primario. Estos ataques son incluso más peligrosos cuando el lenguaje subyacente proporciona acceso a los recursos del sistema o permite la ejecución de comandos del sistema. Por ejemplo, si un usuario malintencionado especificara "os.system('shutdown -h now')" como el valor de operation
, se ejecutaría en el sistema host un comando de apagado.
...
user_ops = req['operation']
result = eval(user_ops)
...
operation
es un valor benigno, como "8 + 7 * 2", en cuyo caso la variable result
se asigna a un valor de 22. No obstante, si un atacante especifica operaciones de idiomas que sean tanto válidas como maliciosas, estas operaciones se ejecutarían con todos los privilegios del proceso primario. Estos ataques son incluso más peligrosos cuando el lenguaje subyacente proporciona acceso a los recursos del sistema o permite la ejecución de comandos del sistema. Con Ruby esto se permite y, dado que se pueden ejecutar varios comandos delimitando las líneas con un punto y coma (;
), también habilitaría la ejecución de múltiples comandos con una sola inyección, sin romper el programa por ello.operation
"system(\"nc -l 4444 &\");8+7*2", se abriría el puerto 4444 para escuchar una conexión en el equipo y seguiría devolviendo el valor de 22 a result
...
var webView : WKWebView
var inputTextField : UITextField
...
webView.evaluateJavaScript("document.body.style.backgroundColor="\(inputTextField.text)";" completionHandler:nil)
...
<body>
de webView
debería tener como estilo un fondo azul. Sin embargo, si un usuario malintencionado proporciona una entrada malintencionada todavía válida, podría ser capaz de ejecutar código JavaScript arbitrario. Por ejemplo, dado que JavaScript puede obtener acceso a determinado tipo de información privada, como las cookies, si un usuario malintencionado especificara "white";document.body.innerHTML=document.cookie;"" como entrada de UITextField, la información de cookie se escribiría en la página de manera visible. Estos ataques son incluso más peligrosos cuando el lenguaje subyacente proporciona acceso a los recursos del sistema o permite la ejecución de comandos del sistema, como cuando el código inyectado se ejecuta con todos los privilegios del proceso primario.
...
strUserOp = Request.Form('operation')
strResult = Eval(strUserOp)
...
operation
es "8 + 7 * 2". La variable strResult
devuelve un valor de 22. Sin embargo, si un usuario especifica otras operaciones de lenguaje válidas, esas no solo se ejecutan, sino que lo hacen con todos los privilegios del proceso principal. La ejecución de código arbitraria será más peligrosa cuando el lenguaje subyacente proporcione acceso a los recursos del sistema o permita la ejecución de comandos del sistema. Por ejemplo, si un usuario malintencionado especifica operation
como " Shell('C:\WINDOWS\SYSTEM32\TSSHUTDN.EXE 0 /DELAY:0 /POWERDOWN')" se ejecutaría un comando de apagado en el sistema host.
...
ScriptEngineManager scriptEngineManager = new ScriptEngineManager();
ScriptEngine scriptEngine = scriptEngineManager.getEngineByExtension("js");
ScriptContext newContext = new SimpleScriptContext();
Bindings engineScope = newContext.getBindings(request.getParameter("userName"));
userOps = request.getParameter("operation");
Object result = scriptEngine.eval(userOps,newContext);
...
page_scope
es el nombre de usuario previsto. Sin embargo, si un atacante especifica el valor para GLOBAL_SCOPE
, las operaciones tendrán acceso a todos los atributos de todos los motores creados por el mismo ScriptEngine
.
...
String address = request.getParameter("address");
Properties props = new Properties();
props.put(Provider_URL, "rmi://secure-server:1099/");
InitialContext ctx = new InitialContext(props);
ctx.lookup(address);
...
string name = Request["username"];
string template = "Hello @Model.Name! Welcome " + name + "!";
string result = Razor.Parse(template, new { Name = "World" });
...
operation
es un valor benigno, como "John", en cuyo caso la variable result
se asigna a un valor de "Hello World! Welcome John!". No obstante, si un atacante especifica operaciones de idiomas que sean tanto válidas como maliciosas, estas operaciones se ejecutarían con todos los privilegios del proceso primario. Estos ataques son incluso más peligrosos cuando el lenguaje subyacente proporciona acceso a los recursos del sistema o permite la ejecución de comandos del sistema. Por ejemplo, Razor permite la invocación de objetos C#; si un atacante especificase " @{ System.Diagnostics.Process proc = new System.Diagnostics.Process(); proc.EnableRaisingEvents=false; proc.StartInfo.FileName=\"calc\"; proc.Start(); }" como el valor de name
, se ejecutaría un comando del sistema en el sistema host.
...
ScriptEngineManager scriptEngineManager = new ScriptEngineManager();
ScriptEngine scriptEngine = scriptEngineManager.getEngineByExtension("js");
userOps = request.getParameter("operation");
Object result = scriptEngine.eval(userOps);
...
operation
es un valor benigno, como "8 + 7 * 2", en cuyo caso la variable result
se asigna a un valor de 22. No obstante, si un atacante especifica operaciones de idiomas que sean tanto válidas como maliciosas, estas operaciones se ejecutarían con todos los privilegios del proceso primario. Estos ataques son incluso más peligrosos cuando el lenguaje subyacente proporciona acceso a los recursos del sistema o permite la ejecución de comandos del sistema. Por ejemplo, JavaScript permite la invocación de objetos Java. Si un usuario malintencionado especifica " java.lang.Runtime.getRuntime().exec("shutdown -h now")" como valor de operation
, se ejecutará un comando de apagado en el sistema host.
...
userOp = form.operation.value;
calcResult = eval(userOp);
...
operation
es un valor benigno, como "8 + 7 * 2", en cuyo caso la variable calcResult
se asigna a un valor de 22. No obstante, si un atacante especifica operaciones de idiomas que sean tanto válidas como maliciosas, estas operaciones se ejecutarían con todos los privilegios del proceso primario. Estos ataques son incluso más peligrosos cuando el lenguaje subyacente proporciona acceso a los recursos del sistema o permite la ejecución de comandos del sistema. En el caso de JavaScript, el atacante puede utilizar esta vulnerabilidad para realizar un ataque de secuencias entre sitios.
...
strUserOp = Request.Form('operation')
strResult = Eval(strUserOp)
...
operation
es "8 + 7 * 2". La variable strResult
devuelve un valor de 22. Sin embargo, si un usuario especifica otras operaciones de lenguaje válidas, esas no solo se ejecutan, sino que lo hacen con todos los privilegios del proceso principal. La ejecución de código arbitraria será más peligrosa cuando el lenguaje subyacente proporcione acceso a los recursos del sistema o permita la ejecución de comandos del sistema. Por ejemplo, si un usuario malintencionado especifica operation
como " Shell('C:\WINDOWS\SYSTEM32\TSSHUTDN.EXE 0 /DELAY:0 /POWERDOWN')" se ejecutaría un comando de apagado en el sistema host.Delegate
en una clase determinada introduce una vulnerabilidad de ejecución de código arbitrario al deserializar la clase.Delegate
se utiliza para contener la referencia a una llamada a un método que se puede invocar más adelante en el código de usuario. .NET utiliza serialización personalizada durante los tipos de serialización Delegate
y utiliza la clase System.DelegateSerializationHolder
para almacenar la información del método que está adjunto o suscrito a un Delegate
. El flujo serializado del objeto Delegate
no es adecuado para el almacenamiento persistente o para pasarlo a una aplicación remota, porque si un atacante puede reemplazar la información del método con una que apunte a un gráfico de objeto malicioso, el atacante podrá ejecutar un código arbitrario.Delegate
y se invoca en el método Executor
:
...
[Serializable]
class DynamicRunnner
{
Delegate _del;
string[] _arg;
public DynamicRunnner(Delegate dval, params string[] arg)
{
_del = dval;
_arg = arg;
}
public bool Executor()
{
return (bool)_del.DynamicInvoke(_arg);
}
}
...
Example 1
, un atacante podría sustituir la información del método con información que apuntase a Process.Start
, con lo que se crearía un proceso arbitrario cuando se llamase al método Executor
.BeanUtilsHashMapper
para deserializar hashes de Redis que pueden permitir que los atacantes que controlen dichos hashes ejecuten código arbitrario.
HashMapper<Person, String, String> hashMapper = new BeanUtilsHashMapper<Person>(Person.class);
Person p = hashMapper.fromHash(untrusted_map);
Stream
de una conexión como entrada y lo deserializa de vuelta en un objeto .NET. A continuación, devuelve el resultado tras convertirlo en una lista de objetos de cadena:
...
List <string> Deserialize(Stream input)
{
var bf = new BinaryFormatter();
var result = (List <string>)bf.Deserialize(input);
return result;
}
...
Example 1
se puede reescribir como se muestra a continuación:
...
List <string> Deserialize(Stream input)
{
var bf = new BinaryFormatter();
object tmp = bf.Deserialize(input);
List <string> result = (List <string>)tmp;
return result;
}
...
Example 2
, la operación de deserialización se realizará correctamente siempre y cuando la secuencia de entrada sea válida, sin importar que el tipo sea List <string>
o no.bin
o en GAC
y que el atacante no puede insertar, de forma que estos ataques dependen de las clases disponibles en el entorno de la aplicación. Por desgracia, es posible aprovechar las clases comunes de otros fabricantes, o incluso las clases de .NET, para agotar los recursos del sistema, eliminar archivos, implementar archivos malintencionados o ejecutar un código arbitrario.
The pickle module is not intended to be secure against erroneous or maliciously constructed data. Never unpickle data received from an untrusted or unauthenticated source.
__reduce__
. Este método debería devolver callable
y sus argumentos. Pickle llamará al callable con los argumentos proporcionados para construir el nuevo objeto permitiendo que el atacante ejecute comandos arbitrarios.enable_unsafe_deserialization()
permite a un atacante deserializar lambdas u otros objetos invocables de Python. Si bien esta característica es útil para brindar flexibilidad y restaurar modelos complejos, plantea nuevas vulnerabilidades si los datos serializados pueden serlo.
import tensorflow as tf
tf.keras.config.enable_unsafe_deserialization()
model = tf.keras.models.load_model('evilmodel_tf.keras')
model([])
XStream
procesando entradas que no son de confianza.
XStream xstream = new XStream();
String body = IOUtils.toString(request.getInputStream(), "UTF-8");
Contact expl = (Contact) xstream.fromXML(body);
var yamlString = getYAMLFromUser();
// Setup the input
var input = new StringReader(yamlString);
// Load the stream
var yaml = new YamlStream();
yaml.Load(input);
var yaml = require('js-yaml');
var untrusted_yaml = getYAMLFromUser();
yaml.load(untrusted_yaml)
import yaml
yamlString = getYamlFromUser()
yaml.load(yamlString)
Ejemplo 1: El siguiente documento XML creará una instancia de un objeto de ProcessBuilder e invocará su método start() estático para ejecutar la calculadora en ventanas.
XMLDecoder decoder = new XMLDecoder(new InputSource(new InputStreamReader(request.getInputStream(), "UTF-8")));
Object object = decoder.readObject();
decoder.close();
<java>
<object class="java.lang.ProcessBuilder">
<array class="java.lang.String" length="1" >
<void index="0">
<string>c:\\windows\\system32\\calc.exe</string>
</void>
</array>
<void method="start"/>
</object>
</java>
Ejemplo 2: La aplicación utiliza datos no validados controlados por el usuario en una etiqueta de Spring que lleva a cabo una evaluación doble de SpEL:
String expression = request.getParameter("input");
SpelExpressionParser parser = new SpelExpressionParser();
SpelExpression expr = parser.parseRaw(expression);
<spring:message text="" code="${param['message']}"></spring:message>
sprintf()
, FormatMessageW()
o syslog()
.snprintf()
.
int main(int argc, char **argv){
char buf[128];
...
snprintf(buf,128,argv[1]);
}
%x
, que la función utiliza como argumentos a los que aplicar un formato. (En este ejemplo, la función no utiliza ningún argumento al que se le vaya aplicar un formato.) Mediante la directiva de formato %n
, el usuario malintencionado puede escribir en la pila lo que provoca que snprintf()
escriba la salida de un número de bytes hasta el momento en el argumento especificado (en lugar de leer un valor del argumento, que es el comportamiento previsto). Una versión sofisticada de este ataque utilizará cuatro operaciones de escritura escalonadas para controlar por completo el valor de un puntero en la pila.
printf("%d %d %1$d %1$d\n", 5, 9);
5 9 5 5
Example 1
.syslog()
se usa a menudo de la siguiente forma:
...
syslog(LOG_ERR, cmdBuf);
...
syslog()
es una cadena de formato, todas las directivas de formato incluidas en cmdBuf
se interpretan como se describe en el Example 1
.syslog()
:
...
syslog(LOG_ERR, "%s", cmdBuf);
...
sprintf()
, FormatMessageW()
, syslog()
, NSLog
o NSString.stringWithFormat
Ejemplo 1: el código siguiente utiliza un argumento de línea de comandos como una cadena de formato en NSString.stringWithFormat:
.
int main(int argc, char **argv){
char buf[128];
...
[NSString stringWithFormat:argv[1], argv[2] ];
}
%x
, que la función utiliza como argumentos a los que aplicar un formato. (En este ejemplo, la función no utiliza ningún argumento al que se le vaya aplicar un formato.)
printf("%d %d %1$d %1$d\n", 5, 9);
5 9 5 5
Example 1
.syslog()
se usa a menudo de la siguiente forma:
...
syslog(LOG_ERR, cmdBuf);
...
syslog()
es una cadena de formato, todas las directivas de formato incluidas en cmdBuf
se interpretan como se describe en el Example 1
.syslog()
:Ejemplo 4: las clases principales de Apple proporcionan vías interesantes para explotar las vulnerabilidades de la cadena de formato.
...
syslog(LOG_ERR, "%s", cmdBuf);
...
String.stringByAppendingFormat()
se usa a menudo de la siguiente forma:
...
NSString test = @"Sample Text.";
test = [test stringByAppendingFormat:[MyClass
formatInput:inputControl.text]];
...
stringByAppendingFormat()
:
...
NSString test = @"Sample Text.";
test = [test stringByAppendingFormat:@"%@", [MyClass
formatInput:inputControl.text]];
...
=cmd|'/C calc.exe'!Z0
. Si el usuario que abre la hoja de cálculo confía en el origen del documento, puede aceptar todas las indicaciones de seguridad presentadas por el procesador de la hoja de cálculo y dejar que la carga (en este ejemplo, abrir la calculadora de Windows) se ejecute en el sistema.
public void Service()
{
string name = HttpContext.Request["name"];
string data = GenerateCSVFor(name);
HttpContext.Response.Clear();
HttpContext.Response.Buffer = true;
HttpContext.Response.AddHeader("content-disposition", "attachment;filename=file.csv");
HttpContext.Response.Charset = "";
HttpContext.Response.ContentType = "application/csv";
HttpContext.Response.Output.Write(tainted);
HttpContext.Response.Flush();
HttpContext.Response.End();
}
=cmd|'/C calc.exe'!Z0
. Si el usuario que abre la hoja de cálculo confía en el origen del documento, puede aceptar todas las indicaciones de seguridad presentadas por el procesador de la hoja de cálculo y dejar que la carga (en este ejemplo, abrir la calculadora de Windows) se ejecute en el sistema.
func someHandler(w http.ResponseWriter, r *http.Request){
r.parseForm()
foo := r.FormValue("foo")
...
w := csv.NewWriter(file)
w.Write(foo)
}
=cmd|'/C calc.exe'!Z0
. Si el usuario que abre la hoja de cálculo confía en el origen del documento, puede aceptar todas las indicaciones de seguridad presentadas por el procesador de la hoja de cálculo y dejar que la carga (en este ejemplo, abrir la calculadora de Windows) se ejecute en el sistema.
@RequestMapping(value = "/api/service.csv")
public ResponseEntity<String> service(@RequestParam("name") String name) {
HttpHeaders responseHeaders = new HttpHeaders();
responseHeaders.add("Content-Type", "application/csv; charset=utf-8");
responseHeaders.add("Content-Disposition", "attachment;filename=file.csv");
String data = generateCSVFor(name);
return new ResponseEntity<>(data, responseHeaders, HttpStatus.OK);
}
=cmd|'/C calc.exe'!Z0
. Si el usuario que abre la hoja de cálculo confía en el origen del documento, puede aceptar todas las indicaciones de seguridad presentadas por el procesador de la hoja de cálculo y dejar que la carga (en este ejemplo, abrir la calculadora de Windows) se ejecute en el sistema.
@RequestMapping(value = "/api/service.csv")
fun service(@RequestParam("name") name: String): ResponseEntity<String> {
val responseHeaders = HttpHeaders()
responseHeaders.add("Content-Type", "application/csv; charset=utf-8")
responseHeaders.add("Content-Disposition", "attachment;filename=file.csv")
val data: String = generateCSVFor(name)
return ResponseEntity(data, responseHeaders, HttpStatus.OK)
}
PreferenceActivity
no puede restringir las clases de fragmento para las que puede crear instancias.PreferenceActivity
no segura y proporcionarle una intención :android:show_fragment
extra para que cargue una clase arbitraria. La aplicación maliciosa puede hacer que PreferenceActivity
cargue un Fragment
arbitrario de la aplicación vulnerable, el cual que se suele cargar en una actividad no exportada, para exponerlo al atacante.
@Override
public static boolean isFragmentValid(Fragment paramFragment)
{
return true;
}