XSS的简单介绍
跨站脚本攻击(Cross Site Scripting),为不和层叠样式表(Cascading Style Sheets,CSS)的缩写混淆,故将跨站脚本攻击缩写为XSS。恶意攻击者往Web页面里插入恶意Script代码,当用户浏览该页之时,嵌入其中Web里面的Script代码会被执行,从而达到恶意攻击用户目的。
XSS危害:
流量劫持
获取用户cookie信息,盗取账号
篡改、删除页面信息(钓鱼)
配合CSRF攻击,实施进一步攻击
XSS分类
反射型XSS:反射型XSS也被称为非持久性XSS,当用户访问一个带有XSS代码的HTML请求时,服务器端接收数据后处理,然后把带有XSS的数据发送到浏览器,浏览器解析这段带有XSS代码的数据后,就造成XSS漏洞,这个过程就像一次反射,所以叫反射型XSS。
存储型XSS:存储型XSS又被称为持久性XSS,存储型XSS是最危险的一种跨站脚本漏洞,当攻击者提交一段XSS代码后,被服务端接收并存储,当攻击者或用户再次访问某个页面时,这段XSS代码被程序读出来响应给浏览器,造成XSS跨站攻击,这是存储型XSS。
DOM型:不经过后端,DOM—based XSS漏洞是基于文档对象模型Document Objeet Model,DOM)的一种漏洞,dom-xss是通过url传入参数去控制触发的。
xss的检测方法
1、工具扫描
可以使用APPscan、AWVS等工具进行扫描
2、手工测试
Burpsuite、firefox(hackbar)、XSSER XSSF
使用手工检测Web应用程序是否存在XSS漏洞时,最重要的是考虑那里有输入,输入的数据在什么地方输出。在进行手工检测XSS时,人毕竟不像软件那样不知疲惫,所以一定要选择有特殊意义的字符,这样可以快速测试是否存在XSS。
(1)在目标站点上找到输入点,比如查询接口,留言板等;
(2)输入一组"特殊字符+唯一识别字符",点击提交后,查看返回的源码,是否有做对应的处理;
(3)通过搜索定位到唯一字符,结合唯一字符前后语法确认是否可以构造执行js的条件(构造闭合);提交构造的脚本代码,看是否可以成功执行,如果成功执行则说明存在XSS漏洞;
测试管理界面是否存在XSS:
在用户名框中输入">(闭合input标签)
结果,界面弹窗,证明该系统存在XSS注入
上一步验证得出,该页面存在XSS漏洞。接下来针对该漏洞进行修改链接属性实现跳转到钓鱼界面
在username=后面加上"><a(修改忘记密码a标签的href,使其指向钓鱼网站)
点击忘记密码,进入钓鱼网站
存储型xss
cms文章管理系统的留言板存在xss漏洞,现在我们通过构造代码进行注入
模拟管理员登录改文章管理系统的后台进行浏览审核用户的留言,发现触发xss弹窗,查看源代码我们发现用户输入的信息被嵌入在了html里面被浏览器解析执行了。
当管理员审核通过之后,任何浏览到该留言内容的人都会同样解析执行我们注入的payload的。
JavaScript的使用
1、语法格式
<script>
[Javascript代码]
</script>
例如:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
</head>
<body>
<script type="text/javascript">
alert('第一个javascript程序');
</script>
</body>
</html>
1、xss常用的js标签
alert
alert()方法用于显示带有一条指定消息和一个确认按钮的警告框
window.location
window.location对象用于获得当前页面的地址(URL) ,并把浏览器重定向到新的页面
ocation.href
返回当前显示的文档的完整URL
onload
一张页面或一幅图像完成加载
onerror
在加载文档或图像时发生错误
onchange
HTML 元素改变
onclick
用户点击 HTML 元素
onmouseover
鼠标指针移动到指定的元素上时发生
onmouseout
用户从一个 HTML 元素上移开鼠标时发生
onkeydown
用户按下键盘按键
XSS漏洞防范
XSS的威力主要是取决于JavaScript能够实现的程度,XSS跨站脚本的形成原因是对输入输出没有严格过滤,导致在页面上可以执行JavaScript等客户端代码,所以只要将敏感字符过滤,就可以修复XSS跨站漏洞。
修复和防范方法:
1.在cookie中设置了HttpOnly属性,那么通过JavaScript脚本将无法读取到cookie信息,这样能一定程度上防止XSS攻击。
2.假定所有输入都是可疑的,必须对所有输入中的script、iframe等字样进行严格的检查。这里的输入不仅仅是用户可以直接交互的输入接口,也包括HTTP请求中的cookie中的变量,HTTP请求头部中的变量等。
3.不仅验证数据的类型,还要验证其格式、长度、范围和内容
4.过滤“<” 、“>” 将用户输入放入引号间,基本实现数据与代码隔离;过滤双引号防止用户跨越许可的标记,添加自定义标记;过滤TAB和空格,防止关键字被拆分;过滤script关键字;过滤&#,防止HTML属性绕过检查。在客户端和服务器端同时做数据的验证与过滤。
5.对输出的数据也要检查,数据库里的值有可能会在一个大网站的多处都有输出,即使在输入做了编码等操作,在各处的输出点时也要进行安全检查。