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


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

绕过XSS-Filter

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

防御:过滤<>, 也可以使用String.fromCharCode()函数执行10进制字符串:
测试代码如上,无法弹窗。

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


XSS利用方式剖析

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

网络钓鱼:

XSS重定向钓鱼:

http://www.bug.com/index.php?search="'>
也可以注入表单来进行钓鱼,如:
http://www.bug.com/index.php?search='>
也可以使用javascript编写键盘记录器等获取其他信息。

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

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


XSS测试工具

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


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:[][;charset=][;base64],

不是所有浏览器都支持DATA URI方案,在HTML中,支持DATA URI 的标签有/