Home > Desarrollo, Librerías/Frameworks, Seguridad > XSS: detectar, explotar y corregir vulnerabilidades (II, inyección JS)

XSS: detectar, explotar y corregir vulnerabilidades (II, inyección JS)

En el post anterior vimos cómo inyectar un script en un formulario HTML. También vimos cómo corregir la vulnerabilidad usando la librería ESAPI.

Sin embargo, cómo explotar y corregir la vulnerabilidad depende de cómo se estén usando los parámetros vulnerables. En el ejemplo anterior se usaban para completar código HTML. A continuación veremos una situación en la que el parámetro vulnerable se usa para completar código Javascript.

Seguimos con el mismo ejemplo del atacante que pretende obtener tarjetas de crédito aprovechando una vulnerabilidad en una pasarela de pago. La única diferencia , en este caso, será que la página con el formulario de entrada, en lugar de usar el parámetro amount para completar un input del formulario (HTML), actualiza el valor de dicho campo del formulario mediante Javascript.

A continuación el susodicho JSP:

<%@ page language="java" contentType="text/html; charset=ISO-8859-15"
 pageEncoding="ISO-8859-15"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-15">
<title>XSS vulnerable</title>
<script language="javascript">

function sendPaymentRequest(){
 form = document.getElementById("sendForm");
 alert("Would submit form request... ");
 return false;
}
</script>
</head>
<body>
<h3>Inserte los datos de su tarjeta</h3>
<form method="POST" name="sendForm" id="sendForm" 
onsubmit="return sendPaymentRequest()">

<table>
<tr>
<td> Cantidad a pagar</td>
<td>
<input type="text" name="amount" maxlength="6" size="6" value="" /> &euro;
<td>
</tr>
<tr>
<td>Tarjeta de crédito</td>
<td> <input type="text" name="cc" value="" maxlength="16" size="16"/>
</td>
</tr>
<tr>
<td>Fecha caducidad (mm/yy)</td>
<td>
<input type="text" name="expMonth" value="" maxlength="2" size="2"/>
/<input type="text" name="expYear" value="" maxlength="2" size="2"/></td>
</tr>
<tr>
<td>CVV2</td>
<td><input type="password" name="cvv" value="" maxlength="3" size="3"/>
</td>
</tr>
<tr>
<td colspan="2">
<input type="submit" value="Realizar Pago" name="button1" id="button1" />
</td>
</tr>
</table>
</form>

<script language="javascript"> 
var form = document.getElementById("sendForm"); 
<% final String amount = request.getParameter("amount"); %> 
form = document.getElementById("sendForm"); 
form.amount.value = "<%=amount%>"; 
</script>

</body>
</html>

Se ha resaltado el pequeño código Javascript que actualiza el valor de amount en lugar de completarlo directamente en HTML como se hacía en el post anterior.

Si probamos a inyectar el código anterior, aunque sigue siendo posible, no produce los efectos deseados. El código a inyectar, en este caso, podría intentar dejar el fragmento de código JS tal que así:

<script language="javascript">
var form = document.getElementById("sendForm");
form = document.getElementById("sendForm");

form.amount.value = "23.34" ; 
function sendCC(){ 
form = document.getElementById('sendForm'); 
cc = form.cc.value; 
cvv = form.cvv.value; 
year = form.expYear.value; 
month = form.expMonth.value;
alert('Sending to bad guy cc:' + cc + ' date:' 
+ month + '/' + year + ' cvv:' + cvv); return sendPaymentRequest(); 
} 
window.onload = function () { 
var submitForm = document.getElementById('sendForm');
submitForm.setAttribute('onsubmit', 'sendCC()'); 
} //";

</script>

Produciendo de nuevo el mismo efecto que en el caso HTML, como puede apreciarse:

 

En este caso la solución consistiría en reemplazar la línea:

final String amount = request.getParameter("amount");

por

final String amount = ESAPI.encoder().
encodeForJavaScript(request.getParameter("amount"));

La única diferencia con respecto a la solución en el caso en que inyectábamos en HTML es que se ha usado el método encodeForJavaScript en lugar de encodeForHTML.

Advertisements
  1. No comments yet.
  1. No trackbacks yet.

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

%d bloggers like this: