当先锋百科网

首页 1 2 3 4 5 6 7

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类型

    1. HTML CSRF攻击
    2. JSON HiJacking攻击
      • 字典格式
      • 列表格式
    3. Flash CSRF攻击
      • 跨域获取隐私数据
      • 跨域提交数据操作

    CSRF防御

    1. 验证码
    2. referer check,referer告诉服务器从哪个链接请求过来的
    3. 在请求中添加Token,Token在客户端cookies,服务端session同时存放,再加以比较
    4. 禁止iframe的跨域请求
    5. X-Frame-option
      添加Token的
      1. 在session中绑定token
      2. 在form表单中加入token字段
      3. 在Ajax请求中自动添加token
      4. 对比服务端dession中token与post过来的是否一致