XSS
xss(Cross Site Scripting)跨站脚本攻击,发生在目标用户的浏览器层面上,当用户浏览器渲染整个HTML文档的过程中出现了不被预期的脚本指令并执行时,XSS就会发生
本质含义:
指攻击者通过“HTML注入”篡改了网页,插入了恶意的脚本,从而在用户浏览网页时,控制用户浏览器的一种攻击过程。
或者这样解释:还是一种“HTML注入”,用户的数据被当成了HTML代码的一部分来执行,从而混淆了原有的格式
XSS攻击类型
1.反射型XSS(非持久型)
发出请求时,XSS代码出现在URL中,作为输入提交到服务端,服务端解析后响应,在响应内容中出现这段XSS代码,最后浏览器解析执行。这个过程就像一次反射,所以称为反射型XSS
例如:
http://www.foo.com/xss/reflect1.php的代码如下
<?php
echo $_GET['x'];
?>
输入x的值未经过任何过滤就直接输出,可以提交:
http://www.foo.com/xss/reflect1.php?x=<script>alert(1)</script>
服务器端解析时,echo就会完整的输出<script>alert(1)</script>
到响应体中,然后浏览器解析执行触发
反射型xss是一次性的
2.存储型XSS(持久型)
存储型xss和反射型xss的差别仅在于:提交的xss代码会存储在服务端(不管是数据库,还是文件系统,内存等),下次请求目标页面时不用再提交xss代码
特点:
1. 攻击行为伴随攻击数据一直存在
2. 存储型xss的攻击是最隐蔽的
例如:
留言板xss,用户提交一条包含xss代码的留言存储到数据库,目标用户查看留言板时,那些留言的内容就会从数据库查询出来并显示,浏览器发现有xss代码就当做正常的HTML与JS执行,于是就触发了xss攻击
3.DOM XSS
DOM XSS和反射型xss存储型xss的差别在于,DOM XSS的xss代码并不需要服务器解析响应的直接参与,触发xss靠的就是浏览器的DOM解析可以认为完全是客户端的事情
常见的输入点有:
document.URL
document.URLUnencoded
document.location
document.referrer
window.location
window.name
xhrq请求回来的数据
document.cookie
表单项的值
常见的输出项:
直接输出的HTML内容,如:
document.write(...)
document.writeln(...)
document.body.innerHTML=...
直接修改DOM树(包括DHTML事件)如:
document.forms[0].action=...(以及其他集合,如:一些对象的src/href属性等)
document.attachEvent(...)
document.create(...)
document.execCommand(...)
document.body,...(直接通过body对象访问DOM)
window.attachEvent(...)
这些都是javascript的基本点,从这些输入输出可以看到,DOM XSS的处理逻辑就在客户端
XSS防御
- Httponly,禁止javascript访问带有Httponly属性的cookie
- 输入检查,格式检查,对特殊字符进行过滤编码
- 输出检查,编码,转译
原则 - 尽可能的减少用户的可控变量在
<style>
标签,HTML标签、css文件
中的输出 一些危险标签过滤禁止掉,如
<iframe>,<script>,<form>
CSRF
CSRF(Cross Site Request Forgery)跨站请求伪造
跨站点的请求
请求是伪造的
本质:
伪造合法用户身份
CSRF类型
- HTML CSRF攻击
- JSON HiJacking攻击
- 字典格式
- 列表格式
- Flash CSRF攻击
- 跨域获取隐私数据
- 跨域提交数据操作
CSRF防御
- 验证码
- referer check,referer告诉服务器从哪个链接请求过来的
- 在请求中添加Token,Token在客户端cookies,服务端session同时存放,再加以比较
- 禁止iframe的跨域请求
- X-Frame-option
添加Token的
- 在session中绑定token
- 在form表单中加入token字段
- 在Ajax请求中自动添加token
- 对比服务端dession中token与post过来的是否一致