跨站脚本攻击(Cross Site Scripting,缩写为XSS)本质上仍是注入攻击的一种。当实施此类攻击时,攻击者通过直接或间接的方式,向WEB应用提交包含恶意代码数据,而WEB应用未对提交数据进行合法性验证或转义处理,最终致使恶意代码在被攻击者的浏览器中执行。
跨站脚本是所有WEB应用安全漏洞中最常见的一种,一些安全公司的统计数据显示,其数量占据了WEB应用安全漏洞总数的一半以上。跨站脚本漏洞可能引发的多种安全威胁,包括篡改页面显示内容、实施钓鱼攻击、会话劫持等。最终可能造成的危害程度与WEB应用的用途、所涉及数据的敏感度、WEB应用所采取的安全控制措施有关,可能是较低危害,也可能造成严重危害。
已知的跨站脚本攻击漏洞有三种:1)存储式;2)反射式;3)基于DOM。 本篇文章首先介绍反射式跨站脚本攻击。 反射式跨站脚本攻击又名非持久型跨站脚本攻击。此类攻击发生时,包含恶意代码的请求由被攻击者浏览器发往WEB应用服务器,恶意代码经过WEB应用服务器“反射”回被攻击者的浏览器,并得以执行。跨站脚本漏洞的产生原因是WEB应用没有对输入内容进行有效的验证或转义处理,导致输入内容中的恶意代码在受害人浏览器中执行。 通常跨站脚本漏洞在满足以下两条件时出现:
- 数据由不可靠来源输入到WEB应用;
- 输入数据未作充分的合法性验证或转义处理,且被用于动态构建供用户访问的内容。
利用跨站脚本漏洞可能实施的攻击有很多种,难以一一列举。最常见的攻击包括窃取隐私信息、劫持会话、将被攻击者重定向至恶意页面、诱使被攻击者浏览器执行恶意操作等。
反射型跨站脚本攻击涉及的功能点:URL参数需要在页面显示的功能点都可能存在反射型跨站脚本攻击,例如站内搜索、查询功能点。 以下是一个典型的反射式跨站脚本攻击流程:
- 攻击者发现WEB应用存在反射式跨站脚本漏洞,并根据此漏洞构造包含恶意代码的链接;
- 攻击者发送向被攻击者发送电子邮件,邮件中包含有事先构造的恶意链接;
- 被攻击者收到电子邮件后,点击恶意链接,将包含恶意代码的请求发往WEB应用;
- WEB应用收到请求后,由于未能对内容作充分的合法性验证和转义处理,致使其中包含的恶意代码作为执行脚本返还至被攻击者的浏览器;
- 恶意代码在被攻击者的浏览器中执行,执行攻击者预设的攻击动作,例如弹出虚假信息、将被攻击者引诱至恶意站点、劫持当前会话等等。
文本输入框
'> |
"> |
--> |
[img]javascript:alert(123456)[/img] |
t>alert(123456)t> |
整体的防范措施是验证所有输入数据,有效检测攻击;对所有输出数据进行适当的编码,以防止任何已成功注入的脚本在浏览器端运行。具体如下。 输入验证 某个数据被接受为可被显示或存储之前,使用标准输入验证机制,验证所有输入数据的长度、类型、语法以及业务规则。 输出编码 跨站产生的原因在于在对用户输入的内容进行显示时,未对html标签以及js内容进行正确的处理,导致数据作为脚本在浏览器中执行了,因此对跨站漏洞的修复要针对变量输出的位置进行不同的处理,具体方案如下: (1)当变量输出位置为HTML标签和属性中时,如
$var2
,要对其进行html escape转义,函数需要转移的字符如下:
需要转移的字符 | 转义结果 | ||
< | 小于号 | > | < |
> | 大于号 | < | > |
& | 和号 | & | & |
" | 引号 | " | " |
' | 撇号 | ' | ' |
参考代码:
function html_encode(str){ if(str.length ==0)return""; str = str.replace(/&/g,"&"); //转义& str = str.replace(/"); //转义< str = str.replace(/>/g," str = str.replace(/\"/g,""");//转义" str = str.replace(/\'/g,"'"); //转义' str = str.replace(/
/g,"\n");//转义换行符 str = str.replace(/ /g," "); //转义空格}
(2)当变量的输出位置在js代码中时,如
需要转移的字符 | 转义结果 |
\ | \\ |
/ | \/ |
" | \" |
' | \' |
(3)当变量输出在标签的事件中时,如
(4)针对DOM类型的输出,即在js脚本中通过html()等函数将变量输出在html中时,需要对变量先进行htmlescape,然后进行javascriptescape,即javascriptescape(htmlescape($var));
(5)当变量在url中输出时:首先保证完整的url是以“http://”开头,其次对内容进行urlescape,需要转移的字符如下:
需要转移的字符 | 转义结果 |
< | %3C |
> | %3E |
" | %22 |
' | %27 |
本文章仅用来为大家提供已存在且公开安全问题的相关知识。由于传播、利用此安全公告所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,公众号不为此承担任何责任。 本公众号拥有对此文章的修改和解释权。如欲转载或传播此文章,必须保证此文章的完整性,包括声明等全部内容。未经本公众号允许,不得随意修改或者增减此文章的内容,不得以任何方式将其用于商业目的。