...
<cfquery name = "GetSSNs" dataSource = "users"
username = "scott" password = "tiger">
SELECT SSN
FROM Users
</cfquery>
...
...
Credentials.basic("hardcoded-username", password);
...
username
y password
al archivo JSON ubicado en C:\user_info.json
:
...
StringBuilder sb = new StringBuilder();
StringWriter sw = new StringWriter(sb);
using (JsonWriter writer = new JsonTextWriter(sw))
{
writer.Formatting = Formatting.Indented;
writer.WriteStartObject();
writer.WritePropertyName("role");
writer.WriteRawValue("\"default\"");
writer.WritePropertyName("username");
writer.WriteRawValue("\"" + username + "\"");
writer.WritePropertyName("password");
writer.WriteRawValue("\"" + password + "\"");
writer.WriteEndObject();
}
File.WriteAllText(@"C:\user_info.json", sb.ToString());
JsonWriter.WriteRawValue()
, los datos que no son de confianza de username
y password
no se validarán para omitir caracteres especiales relacionados con JSON. Esto permite a un usuario introducir claves JSON de forma arbitraria, posiblemente cambiando la estructura del JSON serializado. En este ejemplo, si el usuario sin privilegios mallory
con la contraseña Evil123!
fuese a agregar ","role":"admin
a su nombre de usuario al introducirlo en la solicitud que establece el valor de la variable username
, el JSON resultante guardado en C:\user_info.json
sería:
{
"role":"default",
"username":"mallory",
"role":"admin",
"password":"Evil123!"
}
Dictionary
con JsonConvert.DeserializeObject()
de este modo:
String jsonString = File.ReadAllText(@"C:\user_info.json");
Dictionary<string, string> userInfo = JsonConvert.DeserializeObject<Dictionary<string, strin>>(jsonString);
username
, password
y role
del objeto Dictionary
serían mallory
, Evil123!
y admin
, respectivamente. Sin más comprobaciones de que los valores JSON deserializados son válidos, la aplicación asignará de forma incorrecta privilegios de "admin" al usuario mallory
.username
y password
al archivo JSON ubicado en ~/user_info.json
:
...
func someHandler(w http.ResponseWriter, r *http.Request){
r.parseForm()
username := r.FormValue("username")
password := r.FormValue("password")
...
jsonString := `{
"username":"` + username + `",
"role":"default"
"password":"` + password + `",
}`
...
f, err := os.Create("~/user_info.json")
defer f.Close()
jsonEncoder := json.NewEncoder(f)
jsonEncoder.Encode(jsonString)
}
username
y password
no se validan a fin de omitir caracteres especiales relacionados con JSON. Esto permite a un usuario introducir claves JSON de forma arbitraria, lo cual posiblemente pueda cambiar la estructura del archivo JSON serializado. En este ejemplo, si el usuario sin privilegios mallory
con la contraseña Evil123!
anexó ","role":"admin
cuando ingresó su nombre de usuario, el archivo JSON resultante guardado en ~/user_info.json
sería el siguiente:
{
"username":"mallory",
"role":"default",
"password":"Evil123!",
"role":"admin"
}
mallory
privilegios de "admin".username
y password
al archivo JSON ubicado en ~/user_info.json
:
...
JsonFactory jfactory = new JsonFactory();
JsonGenerator jGenerator = jfactory.createJsonGenerator(new File("~/user_info.json"), JsonEncoding.UTF8);
jGenerator.writeStartObject();
jGenerator.writeFieldName("username");
jGenerator.writeRawValue("\"" + username + "\"");
jGenerator.writeFieldName("password");
jGenerator.writeRawValue("\"" + password + "\"");
jGenerator.writeFieldName("role");
jGenerator.writeRawValue("\"default\"");
jGenerator.writeEndObject();
jGenerator.close();
JsonGenerator.writeRawValue()
, los datos que no son de confianza de username
y password
no se validarán para omitir caracteres especiales relacionados con JSON. Esto permite a un usuario introducir claves JSON de forma arbitraria, posiblemente cambiando la estructura del JSON serializado. En este ejemplo, si el usuario sin privilegios mallory
con la contraseña Evil123!
fuese a agregar ","role":"admin
a su nombre de usuario al introducirlo en la solicitud que establece el valor de la variable username
, el JSON resultante guardado en ~/user_info.json
sería:
{
"username":"mallory",
"role":"admin",
"password":"Evil123!",
"role":"default"
}
HashMap
con JsonParser
de Jackson de este modo:
JsonParser jParser = jfactory.createJsonParser(new File("~/user_info.json"));
while (jParser.nextToken() != JsonToken.END_OBJECT) {
String fieldname = jParser.getCurrentName();
if ("username".equals(fieldname)) {
jParser.nextToken();
userInfo.put(fieldname, jParser.getText());
}
if ("password".equals(fieldname)) {
jParser.nextToken();
userInfo.put(fieldname, jParser.getText());
}
if ("role".equals(fieldname)) {
jParser.nextToken();
userInfo.put(fieldname, jParser.getText());
}
if (userInfo.size() == 3)
break;
}
jParser.close();
username
, password
y role
del objeto HashMap
serían mallory
, Evil123!
y admin
, respectivamente. Sin más comprobaciones de que los valores JSON deserializados son válidos, la aplicación asignará de forma incorrecta privilegios de "admin" al usuario mallory
.
var str = document.URL;
var url_check = str.indexOf('name=');
var name = null;
if (url_check > -1) {
name = decodeURIComponent(str.substring((url_check+5), str.length));
}
$(document).ready(function(){
if (name !== null){
var obj = jQuery.parseJSON('{"role": "user", "name" : "' + name + '"}');
...
}
...
});
name
no se validarán para omitir caracteres especiales relacionados con JSON. Esto permite a un usuario introducir claves JSON de forma arbitraria, posiblemente cambiando la estructura del JSON serializado. En este ejemplo, si el usuario sin privilegios mallory
fuese a agregar ","role":"admin
al parámetro de nombre en la dirección URL, el JSON resultante sería:
{
"role":"user",
"username":"mallory",
"role":"admin"
}
jQuery.parseJSON()
y establecido como objeto simple, lo que significa que obj.role
devolverá "admin" en lugar de "user"._usernameField
y _passwordField
:
...
NSString * const jsonString = [NSString stringWithFormat: @"{\"username\":\"%@\",\"password\":\"%@\",\"role\":\"default\"}" _usernameField.text, _passwordField.text];
NSString.stringWithFormat:
, los datos que no son de confianza de _usernameField
y _passwordField
no se validarán para omitir caracteres especiales relacionados con JSON. Esto permite a un usuario introducir claves JSON de forma arbitraria, posiblemente cambiando la estructura del JSON serializado. En este ejemplo, si el usuario sin privilegios mallory
con la contraseña Evil123!
fuese a agregar ","role":"admin
a su nombre de usuario al introducirla en el campo _usernameField
, el JSON resultante sería:
{
"username":"mallory",
"role":"admin",
"password":"Evil123!",
"role":"default"
}
NSDictionary
con NSJSONSerialization.JSONObjectWithData:
de este modo:
NSError *error;
NSDictionary *jsonData = [NSJSONSerialization JSONObjectWithData:[jsonString dataUsingEncoding:NSUTF8StringEncoding] options:NSJSONReadingAllowFragments error:&error];
username
, password
y role
en el objeto NSDictionary
serían mallory
, Evil123!
y admin
respectivamente. Sin más comprobaciones de que los valores JSON deserializados son válidos, la aplicación asignará de forma incorrecta privilegios de "admin" al usuario mallory
.
import json
import requests
from urllib.parse import urlparse
from urllib.parse import parse_qs
url = 'https://www.example.com/some_path?name=some_value'
parsed_url = urlparse(url)
untrusted_values = parse_qs(parsed_url.query)['name'][0]
with open('data.json', 'r') as json_File:
data = json.load(json_File)
data['name']= untrusted_values
with open('data.json', 'w') as json_File:
json.dump(data, json_File)
...
name
no se validarán para escapar de los caracteres especiales relacionados con JSON. Esto permite que un usuario inserte arbitrariamente claves JSON, posiblemente cambiando la estructura del JSON serializado. En este ejemplo, si el usuario sin privilegios mallory
agregara ","role":"admin
al parámetro de nombre en la URL, el JSON se convertiría en:
{
"role":"user",
"username":"mallory",
"role":"admin"
}
usernameField
y passwordField
:
...
let jsonString : String = "{\"username\":\"\(usernameField.text)\",\"password\":\"\(passwordField.text)\",\"role\":\"default\"}"
usernameField
y passwordField
no se validarán para omitir caracteres especiales relacionados con JSON. Esto permite a un usuario introducir claves JSON de forma arbitraria, posiblemente cambiando la estructura del JSON serializado. En este ejemplo, si el usuario sin privilegios mallory
con la contraseña Evil123!
fuese a agregar ","role":"admin
a su nombre de usuario al introducirla en el campo usernameField
, el JSON resultante sería:
{
"username":"mallory",
"role":"admin",
"password":"Evil123!",
"role":"default"
}
NSDictionary
con NSJSONSerialization.JSONObjectWithData:
de este modo:
var error: NSError?
var jsonData : NSDictionary = NSJSONSerialization.JSONObjectWithData(jsonString.dataUsingEncoding(NSUTF8StringEncoding), options: NSJSONReadingOptions.MutableContainers, error: &error) as NSDictionary
username
, password
y role
en el objeto NSDictionary
serían mallory
, Evil123!
y admin
respectivamente. Sin más comprobaciones de que los valores JSON deserializados son válidos, la aplicación asignará de forma incorrecta privilegios de "admin" al usuario mallory
.
...
password = 'tiger'.
...
...
URLRequestDefaults.setLoginCredentialsForHost(hostname, "scott", "tiger");
...
...
HttpRequest req = new HttpRequest();
req.setClientCertificate('mycert', 'tiger');
...
...
NetworkCredential netCred =
new NetworkCredential("scott", "tiger", domain);
...
...
rc = SQLConnect(*hdbc, server, SQL_NTS, "scott",
SQL_NTS, "tiger", SQL_NTS);
...
...
MOVE "scott" TO UID.
MOVE "tiger" TO PASSWORD.
EXEC SQL
CONNECT :UID
IDENTIFIED BY :PASSWORD
AT :MYCONN
USING :MYSERVER
END-EXEC.
...
...
<cfquery name = "GetSSNs" dataSource = "users"
username = "scott" password = "tiger">
SELECT SSN
FROM Users
</cfquery>
...
...
var password = "foobarbaz";
...
javap -c
para acceder al código desensamblado, que contendrá los valores de las contraseñas utilizadas. El resultado de esta operación puede presentar un aspecto similar al siguiente en relación con el Example 1
:
javap -c ConnMngr.class
22: ldc #36; //String jdbc:mysql://ixne.com/rxsql
24: ldc #38; //String scott
26: ldc #17; //String tiger
password := "letmein"
...
response.SetBasicAuth(usrName, password)
...
DriverManager.getConnection(url, "scott", "tiger");
...
javap -c
para acceder al código desensamblado, que contendrá los valores de las contraseñas utilizadas. El resultado de esta operación puede presentar un aspecto similar al siguiente en relación con el Example 1
:
javap -c ConnMngr.class
22: ldc #36; //String jdbc:mysql://ixne.com/rxsql
24: ldc #38; //String scott
26: ldc #17; //String tiger
...
webview.setWebViewClient(new WebViewClient() {
public void onReceivedHttpAuthRequest(WebView view,
HttpAuthHandler handler, String host, String realm) {
handler.proceed("guest", "allow");
}
});
...
Example 1
, este código se ejecutará correctamente, pero cualquiera que tenga acceso a él, tendrá acceso a la contraseña.
...
obj = new XMLHttpRequest();
obj.open('GET','/fetchusers.jsp?id='+form.id.value,'true','scott','tiger');
...
...
{
"username":"scott"
"password":"tiger"
}
...
...
DriverManager.getConnection(url, "scott", "tiger")
...
javap -c
para acceder al código desensamblado, que contendrá los valores de las contraseñas utilizadas. El resultado de esta operación puede presentar un aspecto similar al siguiente en relación con el Example 1
:
javap -c ConnMngr.class
22: ldc #36; //String jdbc:mysql://ixne.com/rxsql
24: ldc #38; //String scott
26: ldc #17; //String tiger
...
webview.webViewClient = object : WebViewClient() {
override fun onReceivedHttpAuthRequest( view: WebView,
handler: HttpAuthHandler, host: String, realm: String
) {
handler.proceed("guest", "allow")
}
}
...
Example 1
, este código se ejecutará correctamente, pero cualquiera que tenga acceso a él, tendrá acceso a la contraseña.
...
rc = SQLConnect(*hdbc, server, SQL_NTS, "scott",
SQL_NTS, "tiger", SQL_NTS);
...
...
$link = mysql_connect($url, 'scott', 'tiger');
if (!$link) {
die('Could not connect: ' . mysql_error());
}
...
DECLARE
password VARCHAR(20);
BEGIN
password := "tiger";
END;
password = "tiger"
...
response.writeln("Password:" + password)
...
Mysql.new(URI(hostname, 'scott', 'tiger', databasename)
...
...
ws.url(url).withAuth("john", "secret", WSAuthScheme.BASIC)
...
javap -c
para acceder al código desensamblado, que contendrá los valores de las contraseñas utilizadas. El resultado de esta operación puede presentar un aspecto similar al siguiente en relación con el Example 1
:
javap -c MyController.class
24: ldc #38; //String john
26: ldc #17; //String secret
...
let password = "secret"
let username = "scott"
let con = DBConnect(username, password)
...
Ejemplo 2: La siguiente cadena de conexión ODBC utiliza una contraseña con codificación rígida:
...
https://user:secretpassword@example.com
...
...
server=Server;database=Database;UID=UserName;PWD=Password;Encrypt=yes;
...
...
Dim con As New ADODB.Connection
Dim cmd As New ADODB.Command
Dim rst As New ADODB.Recordset
con.ConnectionString = "Driver={Microsoft ODBC for Oracle};Server=OracleServer.world;Uid=scott;Passwd=tiger;"
...
...
credential_settings:
username: scott
password: tiger
...
shoes
en el siguiente documento XML:
<order>
<price>100.00</price>
<item>shoes</item>
</order>
shoes
por shoes</item><price>1.00</price><item>shoes
. El XML nuevo tendría este aspecto:
<order>
<price>100.00</price>
<item>shoes</item><price>1.00</price><item>shoes</item>
</order>
<price>
anula el valor de la primera etiqueta <price>
. Esto permite que el atacante compre un par de zapatos de 100 $ a 1 $.shoes
en el siguiente documento XML.
<order>
<price>100.00</price>
<item>shoes</item>
</order>
shoes
por shoes</item><price>1.00</price><item>shoes
. El nuevo documento XML sería:
<order>
<price>100.00</price>
<item>shoes</item><price>1.00</price><item>shoes</item>
</order>
<price>
anula el valor de la primera etiqueta <price>
. Esto permite que el atacante compre un par de zapatos de 100 $ a 1 $.shoes
en el siguiente documento XML.
<order>
<price>100.00</price>
<item>shoes</item>
</order>
shoes
por shoes</item><price>1.00</price><item>shoes
. El nuevo documento XML sería:
<order>
<price>100.00</price>
<item>shoes</item><price>1.00</price><item>shoes</item>
</order>
<price>
anula el valor de la primera etiqueta <price>
. Esto permite que el atacante compre un par de zapatos de 100 $ a 1 $.shoes
en el siguiente documento XML:
<order>
<price>100.00</price>
<item>shoes</item>
</order>
shoes
por shoes</item><price>1.00</price><item>shoes
. El XML nuevo tendría este aspecto:
<order>
<price>100.00</price>
<item>shoes</item><price>1.00</price><item>shoes</item>
</order>
<price>
anula el valor de la primera etiqueta <price>
. Esto permite que el atacante compre un par de zapatos de $ 100 a $ 1.shoes
en el siguiente documento XML.
<order>
<price>100.00</price>
<item>shoes</item>
</order>
shoes
por shoes</item><price>1.00</price><item>shoes
. El nuevo documento XML sería:
<order>
<price>100.00</price>
<item>shoes</item><price>1.00</price><item>shoes</item>
</order>
<price>
anula el valor de la primera etiqueta <price>
. Esto permite que el atacante compre un par de zapatos de 100 $ a 1 $.shoes
en el siguiente documento XML:
<order>
<price>100.00</price>
<item>shoes</item>
</order>
shoes
por shoes</item><price>1.00</price><item>shoes
. El nuevo documento XML sería:
<order>
<price>100.00</price>
<item>shoes</item><price>1.00</price><item>shoes</item>
</order>
shoes
en el siguiente documento XML.
<order>
<price>100.00</price>
<item>shoes</item>
</order>
shoes
por shoes</item><price>1.00</price><item>shoes
. El nuevo documento XML sería:
<order>
<price>100.00</price>
<item>shoes</item><price>1.00</price><item>shoes</item>
</order>
<price>
anula el valor de la primera etiqueta <price>
. Esto permite que el atacante compre un par de zapatos de 100 $ a 1 $.shoes
en el siguiente documento XML.
<order>
<price>100.00</price>
<item>shoes</item>
</order>
shoes
por shoes</item><price>1.00</price><item>shoes
. El nuevo documento XML sería:
<order>
<price>100.00</price>
<item>shoes</item><price>1.00</price><item>shoes</item>
</order>
<price>
anula el valor de la primera etiqueta <price>
. Esto permite que el atacante compre un par de zapatos de 100 $ a 1 $.
...
<?php
$goodXML = $_GET["key"];
$doc = simplexml_load_string($goodXml);
echo $doc->testing;
?>
...
Example 2
:
<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE foo [
<!ELEMENT foo ANY >
<!ENTITY xxe SYSTEM "file:///c:/boot.ini" >]><foo>&xxe;</foo>
boot.ini
del sistema. El atacante podría utilizar los elementos XML que se devuelven al cliente para extraer datos u obtener información sobre la existencia de recursos de red.shoes
en el siguiente documento XML.
<order>
<price>100.00</price>
<item>shoes</item>
</order>
shoes
por shoes</item><price>1.00</price><item>shoes
. El nuevo documento XML sería:
<order>
<price>100.00</price>
<item>shoes</item><price>1.00</price><item>shoes</item>
</order>
<price>
anula el valor de la primera etiqueta <price>
. Esto permite que el atacante compre un par de zapatos de 100 $ a 1 $.shoes
en el siguiente documento XML.
<order>
<price>100.00</price>
<item>shoes</item>
</order>
shoes
por shoes</item><price>1.00</price><item>shoes
. El nuevo documento XML sería:
<order>
<price>100.00</price>
<item>shoes</item><price>1.00</price><item>shoes</item>
</order>
<price>
anula el valor de la primera etiqueta <price>
. Esto permite que el atacante compre un par de zapatos de 100 $ a 1 $.shoes
en el siguiente documento XML.
<order>
<price>100.00</price>
<item>shoes</item>
</order>
shoes
por shoes</item><price>1.00</price><item>shoes
. El nuevo documento XML sería:
<order>
<price>100.00</price>
<item>shoes</item><price>1.00</price><item>shoes</item>
</order>
<price>
anula el valor de la primera etiqueta <price>
. Esto permite que el atacante compre un par de zapatos de 100 $ a 1 $.shoes
en el siguiente documento XML.
<order>
<price>100.00</price>
<item>shoes</item>
</order>
shoes
por shoes</item><price>1.00</price><item>shoes
. El nuevo documento XML sería:
<order>
<price>100.00</price>
<item>shoes</item><price>1.00</price><item>shoes</item>
</order>
<price>
anula el valor de la primera etiqueta <price>
. Esto permite que el atacante compre un par de zapatos de 100 $ a 1 $.a:t
desde el siguiente documento Open XML.
<a:t>YoY results: up 10%</a:t>