学习XSS之前, 我们很有必要知道XSS到底是什么东西。 其英文名是(Cross Site Scripting), 意思就是跨站脚本攻击, 是黑客常用的攻击手段之一, 因为与层叠样式表CSS(Cascading Style Sheets)同名, 为了避免混淆, 故将其命名为XSS。 好了, 现在知道了它的名字的由来之后, 最重要的就是去了解XSS的实现原理。
XSS实现原理
因为浏览器本身的设计缺陷, 浏览器只负责解释执行html+css+javascript代码, 并不会检验其安全性。 故如果你的服务器对没有对XSS漏洞准备安全的预防措施, 都会存在XSS漏洞。 下面具体讲一下XSS的攻击过程:
1.用户登陆web应用程序上的网页;.该网页已经被攻击者利用各种手段注入了javascript等脚本代码;
2.服务器对用户的浏览请求做出反应, 用户获取攻击者注入过代码的URL;
3.攻击者的javascript代码在浏览者的浏览器上打开;此时可能会伴随用户浏览器向攻击者发送会话令牌, 然后攻击者劫持用户会话等现象的发生。
在接触了几天XSS之后, 大致有以下特点:
1.XSS即是web应用程序上的计算机安全漏洞, 也是黑客常用的攻击手段;对于攻击者而言, 需要有很好的计算机语言基础, 如JavaScript, HTML5, Ajax, Css和其他脚本语言。
2.XSS产生的主要原因是web浏览器对用户的输入过滤不足。
3.通过将代码注入到网页, 虽然对Web服务器没有直接伤害, 但它借助网络传播, 其危害最终会反馈到服务器。
4.XSS漏洞如此普遍主要是因为web浏览器本身的设计是不安全的, 开发人员在交互过程中的设计阶段忽略了XSS防护, 加上大部分人还没认识到XSS的危害和错误的认为XSS就只会在浏览器上弹出一个窗口而已, 加上触发跨站脚本的方式简单且众多和web2.0的流行和社交功能的迅猛发展, 奠定了XSS发展的基础。
5.XSS最重要也是最核心的是利用自己构造好的XSS语句, 欺骗web应用程序上的过滤器, 实现绕过其安全检测, 达成向网页中注入javaScript等脚本信息的目的, 从而导致XSS漏洞在互联网上传播。
6.要善于利用工具提高效率, 要学会利用各种编码方式提高XSS的攻击性和隐蔽性。 例如, unicode, escapes, URL编码, 十六进制, 八进制等, 同时对于特定情境下也可以利用脚本加密技术实现XSS攻击。
7.有时候配合CSRF漏洞, 将会由意想不到的效果
同时XSS攻击也有一下弊端
1.XSS攻击无对应软件完成自动化攻击, 且有一定几率不成功;
2.是一种被动的攻击手段, 对website有http-only, crossdomiar。
下面几个概念需要理解好
1.shellcode——起初是溢出程序和蠕虫程序的核心, 注入目标网页中, 使用脚本编写好的代码;
2.Exploit——完整编写好的漏洞利用工具;
3.POC(Proof of Concept)——一段证明漏洞存在的程序代码片段;
4.payload——意思为有效载荷, 概念验证, 即是漏洞验证脚本;是组成Poc和Exp的必要组成部分。
XSS的分类
一.持久型的XSS
攻击方把恶意脚本代码固化在页面中, 当其他用户访问到此页面的时候, 浏览器会解析并且执行该脚本代码, 进而对其他用户进行XSS攻击。 最典型的例子是留言板。
二.非持久性(反射型)的XSS
攻击方通过改写网页访问的URL, 使其指向攻击方已经准备好的脚本代码。 典型的例子是, 搜索栏中输入脚本代码。 欺骗用户自己去点击链接才能触发XSS代码。
三.DOM型的XSS
攻击方利用javascript来展开攻击, 用户请求一个由攻击方提供的经过专门设计的URL, 包括嵌入式的javascript, 服务器响应用户请求的时候不对URL进行处理, 当用户浏览这个相应的时候, 脚本得以触发。
如何防止XSS跨站脚本攻击:
原则:不相信用户输入的数据
将重要的cookie标记为http only, 这样的话Javascript 中的document.cookie语句就不能获取到cookie了
只允许用户输入我们期望的数据。 例如:年龄的textbox中, 只允许用户输入数字, 而数字之外的字符都过滤掉
对数据进行Html Encode 处理。 < 转化为 <、> 转化为 >、& 转化为 &
、' 转化为 '、" 转化为 "、空格 转化为
1
2
过滤或移除特殊的Html标签。 例如:<script>、<iframe>、<
for <、> for >、" for
过滤JavaScript 事件的标签。
例如 “onclick=”、”onfocus” 等等
1
2
3
4
很多浏览器都加入了安全机制来过滤XSS
另外:
如何防止SQL注入:
永远不要信任用户的输入。 对用户的输入进行校验, 可以通过正则表达式, 或限制长度;对单引号和双”-“进行转换等。
永远不要使用动态拼装sql, 可以使用参数化的sql或者直接使用存储过程进行数据查询存取
永远不要使用管理员权限的数据库连接, 为每个应用使用单独的权限有限的数据库连接
不要把机密信息直接存放, 加密或者hash掉密码和敏感的信息
应用的异常信息应该给出尽可能少的提示, 最好使用自定义的错误信息对原始错误信息进行包装
……