一次性付费进群,长期免费索取教程,没有付费教程。
进微信群回复公众号:微信群;QQ群:460500587
教程列表 见微信公众号底部菜单 | 本文底部有推荐书籍微信公众号:计算机与网络安全
ID:Computer-network
为了与层叠样式表(Cascading Style Sheets,CSS)的缩写进行区分,故将跨站脚本攻击(Cross Site Scripting)缩写为XSS。跨站脚本攻击指的是攻击者在Web页面里插入了恶意代码,其没有被严格的控制或过滤,最终显示给来访的用户。攻击者通过注入的代码执行恶意指令,这些恶意网页程序通常是JavaScript、VBScript、ActiveX、Flash等,使用户加载并执行攻击者恶意制造的网页程序,从而达到恶意攻击用户的特殊目的。
XSS在研发过程中很难引起研发人员的重视,但它的危害却是很严重的,XSS容易引起的安全问题如表1所示。
表1 各类危害及危害说明
1、反射型XSS
反射型XSS也叫非持久化型XSS,是指攻击者通过构造非法请求将恶意代码嵌入页面,欺骗用户主动点击浏览进行触发,攻击者主要通过邮件或者聊天窗口向用户发送一些链接,让受害者进行点击。同样也会出现在搜索引擎收录的搜索页面中,当用户进行关键字搜索并点击时可触发XSS攻击。
例如,研发人员为了方便,在页面上显示当前页码直接从浏览器读取。下面的写法会造成XSS漏洞。
当用户在浏览器输入的参数中带有JavaScript可执行脚本时会产生XSS攻击脚本。例如,攻击者可以在地址栏中输入下面的代码进行XSS漏洞探测。
http://test.test.com/index.php?page=1;alert(1);
执行结果如图1所示。
图1 XSS漏洞
这时可以猜到页面是通过$_GET方法获取page参数输出的,那么就可以构造URL,向页面写入JavaScript代码,让其执行。当把该URL进行加密,然后发送给受害者时,受害者就会执行恶意代码。
如果构造请求远程地址如图2所示,将下页的URL输入到浏览器地址栏中(URL开头的“http://”被默认隐藏),可以将获取的Cookie发送给远程的攻击者,造成Cookie泄露,攻击者可以获取用户访问该站的全部权限。
http://test.test.com/index.php?page=1;document.write('')
图2 会话推送给第三方
图3所示是反射型XSS的攻击过程。
图3 反射型XSS
1)用户正常登录Web应用程序,浏览器会保存用户的全部Cookie信息,其中包含Session ID。
2)攻击者将含有恶意代码的URL发送给用户。
3)用户打开攻击者发送过来的恶意URL。
4)浏览器程序执行用户发出的请求。
5)同时执行该恶意URL中所含的攻击者的恶意代码。
6)攻击者使用的攻击代码的作用是将用户的Cookie信息发送到攻击者的服务器并记录下来。
7)攻击者在得到用户的Cookie信息后,将可以利用这些信息来劫持用户的会话,以该用户的身份进行登录。
2、存储型XSS
存储型XSS也叫持久化型XSS。当攻击者输入恶意数据保存在数据库,再由服务器脚本程序从数据库中读取数据,然后显示在页面上时,所有浏览该页面的用户都会受到攻击。攻击行为伴随着攻击数据一直存在,如在发表文章等地方加入代码,如果没有过滤或过滤不严,那么这些代码将储存到服务器中,用户访问该页面的时候就会触发代码执行。这种XSS比较危险,容易造成蠕虫、盲打后端管理平台、盗窃Cookie等。
图4所示是存储型XSS的攻击过程。
图4 存储型XSS
1)攻击者通过XSS漏洞将恶意代码提交到Web服务器进行永久存储。
2)用户/网站管理员正常登录Web应用程序,登录成功则浏览器保存用户的全部Cookie,其中包含会话ID。用户/网站管理员请求受感染页面。
3)服务器将用户请求的页面返回到浏览器。
4)浏览器执行恶意页面中所含的攻击者的恶意代码。
5)恶意代码将用户的Cookie信息发送到攻击者的服务器并记录下来。
6)攻击者在得到用户的Cookie信息后,利用这些信息来劫持用户的会话,以该用户的身份进行登录,其中包括以平台管理员身份登录。
3、DOM型XSS
DOM型XSS是一种特殊类型的XSS,它也是一种反射型XSS,是基于文档对象模型(Document Object Model,DOM)的一种漏洞。触发漏洞的原因是,使用JavaScript将用户的请求嵌入页面,从而执行了用户的恶意代码。
var s=location.search;
s=s.substring(1,s.length); // 获取URL
var url="";
if(s.indexOf("url=")>-1) {
var pos=s.indexOf("url=")+4; // 过滤掉"url="字符
url=s.substring(pos,s.length); // 得到地址栏里的URL参数值
} else {
url="参数为空";
}
document.write("url: "+url+""); // 输出
当用户使用下面的URL请求进行访问时,会触发地址栏中携带的JavaScript脚本执行,从而引发XSS注入漏洞。
http://127.0.0.1/hacker.php?url='
同样,在HTML中DOM事件函数允许JavaScript在HTML文档元素中注册不同事件处理程序,如果使用不当同时也会引起XSS注入漏洞。
通过PHP程序输出数据到浏览器前,要进行严格的输出检查,以免造成XSS漏洞。表2列举了一些JavaScript中常见的容易触发XSS漏洞的函数,在使用的时候一定要注意。
表2 容易造成XSS的JavaScript函数
4、通过编码过滤和转换进行防御
过滤是指对DOM属性和标签进行过滤,如通过程序逻辑将