Java Web开发 - 持久型/存储型XSS漏洞

1、什么是XSS漏洞攻击?

XSS是跨站脚本攻击(Cross Site Scripting)的简称,之所以叫XSS而不是CSS相比大家都能明白了吧,那就是为了跟层叠样式表(Cascading Style Sheets,CSS)区别。

2、XSS漏洞攻击的原理

恶意攻击者往web页面中插入恶意HTML代码,当用户浏览该web页面时,嵌入到该web页面的恶意HTML代码就会被执行,从而达到恶意攻击用户的特殊目的。

XSS漏洞又分为两类,一类是持久型/存储型XSS,另一类是反射型XSS;

1)持久型/存储型XSS:嵌入到web页面的恶意HTML会被存储到应用服务器端,简而言之就是会被存储到数据库,等用户在打开页面时,会继续执行恶意代码,能够持续的攻击用户;

2)反射型XSS:反射型XSS是一次性的,仅对当次的页面访问产生影响。非持久型xss攻击要求用户访问一个被攻击者篡改后的链接,用户访问该链接时,被植入的攻击脚本被用户游览器执行,从而达到攻击目的;

本次主要说的是持久型/存储型XSS漏洞攻击

3、下面是一个示例

1)这个页面时个简单的添加页面

java xss输出 java -xss_java  存储型跨站漏洞

2)保存成功之后,可以去查看下数据库,备注字段中的JavaScript代码已经存储到数据库中了,如下:

java xss输出 java -xss_java  存储型跨站漏洞_02

3)在打开用户查询列表的页面(只要页面中包含该用户的备注字段都可以),就会出现如下的信息,代表我们攻击成功了。

java xss输出 java -xss_java xss输出_03

总结:

到这里,可能有人会问,这个能有什么用啊?试想,如果把上面的“备注”字段的值修改成如下的代码,会有什么结果?

点击就送百元现金

如果是这些恶意代码,那么攻击者就能获取到这个用户的cookie信息,进而以该用户角色登录系统了。

4、我们如何来防止这种XSS攻击呢?我总结了以下几点,大家可以参考下

1)在页面上添加用户输入长度限制;

2)在服务端(数据库)添加长度限制;

3)过滤用户输入的特殊字符串,对其进行转义,如下

示例字符串"",下面是转义之后的字符串

StringEscapeUtils - <script>是不是document.getElementById(‘a‘).href=‘‘+document.cookie;</script>
HtmlUtils - <script>是不是document.getElementById('a').href=''+document.cookie;</script>

4)http相关的设置

A)cookie.setHttpOnly(true);-保护用户cookie

B)res.setHeader("X-Frame-Options", "SAMEORIGIN");X-Frame-Options对应的属性值含义

DENY:这个页面不允许被以frame的方式加载

SAMEORIGIN:这个页面只允许同源页面加载

:这个页面只能被特定的域加载

C)res.setHeader("X-xss-protection", "1;mode=block");

D)res.setHeader("X-Content-Type-Options", "nosniff ");阻止浏览器进行content-type 嗅探。告诉浏览器相信此服务器下发的资源的类型,防止类    型嗅探攻击。