记录XSS和CSRF攻击

158 阅读6分钟

记录学习XSS和CSRF攻击原理和防御。

什么是XSS攻击

XSS(cross site scripting)即跨站脚本攻击,为了不和CSS重名,故为XSS。是指浏览器执行恶意脚本(无论是同域还是跨域),拿到用户信息进行一些操作。

大致可以做到这些事情

  1. 窃取cookie
  2. 监听用户行为,直接发动到黑客服务器
  3. 修改dom伪造登录表单
  4. 在页面生成悬浮窗广告

通常情况下XSS攻击大致可以分为三类:

存储型

存储是指将恶意脚本存储到了服务器,比如说文章的评论添加了恶意的脚本代码,这段代码存储到了数据库,每次打开页面都会执行恶意脚本的代码,这就是存储型xss攻击。

反射型

反射型XSS指的是恶意请求作为网络请求中的一部分 比如我输入

http://sanyuan.com?q=<script>alert("你完蛋了")</script>

这样,在服务器拿到q参数,然后将其余的返回给前端,前端将这些内容当做html解析发现是一个脚本,直接执行了,这样就被攻击了。

之所以叫它反射型。是说恶意脚本作为参数发送到服务器,服务器返回当前参数,参数在前端被解析执行。 和存储型不一样的是,恶意脚本并不会存储到服务器

文档型

是指劫持网络数据直接修改HTML文档,并不会经过服务端,这样的劫持方式包括本地恶意软件运营商劫持

怎样规避XSS攻击

一个信念

不行新用户的任何输入,无论是前端还是后端都要对用户的输入进行转码和过滤。

<script>alert('你完蛋了')</script>

转码后

&lt;script&gt;alert(&#39;你完蛋了&#39;)&lt;/script&gt;

或者采用关键字过滤的方式直接将恶意脚本删除。

利用CSP

即是浏览器中的安全策略,它的核心思想就是限制加载哪些资源,具体来说就是:

  1. 限制其它域下的资源加载
  2. 禁止向其它域提交数据
  3. 提供上报机制,能帮助我们及时发现XSS攻击。

利用HttpOnly

很多XSS脚本都是通过获取cookie来达到攻击的目的,使用HttpOnly之后就不能通过脚本来获取cookie从而达到防御的目的。

总结

XSS是用户故意植入脚本并在页面中执行,拿到用户信息进行操作,主要分为存储型反射型文档型

防御的措施包括: · 一个信念:不相信用户的任何输入,将输入进行转码过滤。 · 利用CSP 对加载的资源或者可访问的网站进行限制 · 利用HttpOnly 不能通过脚本获取cookie

CSRF

什么是CSRF?

CSRF(Cross-site request forgery)即跨站请求伪造。是指诱导点击黑客的网站,打开黑客的网站,利用用户目前的登录状态发起跨站请求。

举个例子,你深夜打开了一个不知名网站,点击了一个经过黑客精心挑选的小姐姐的图片,那么恭喜你你被攻击了!

发生了什么?

可能会做三种事情:

自动发get请求

黑客网页有这样一段代码

<img src="https://xxx.com/info?user=hhh&count=100">

当图片加载的时候,可能已经向你曾经登陆过的网站发送请求了,恐怖的是这个请求是可以携带cookie的,这个请求可以是汇款转账之类的。

自动发POST请求

黑客可能自己填了一个表单,写了一段自动提交的脚本

<form id='hacker-form' action="https://xxx.com/info" method="POST">
  <input type="hidden" name="user" value="hhh" />
  <input type="hidden" name="count" value="100" />
</form>
<script>document.getElementById('hacker-form').submit();</script>

这同样会携带cookie信息,让误以为是正常的请求,从而让恶意操作变为可能。

诱导点击GET请求

黑客网站上可能会放一个诱导链接,比如

<a href="https://xxx/info?user=hhh&count=100" taget="_blank">点击进入修仙世界</a>

点击后自动发get请求,接下来的原理和自动发get请求相同。

这就是CSRF攻击的原理,

  1. 诱导点击进入黑客网站
  2. 利用用户的已登录状态服务器的验证漏洞模拟用户进行操作

想一想可以利用XSS攻击的防御方式吗?转码过滤?CSP? HttpOnly?,好像都不行,因为XSS的防御方式都是针对本网站的,现在是要防止已登录网站的登录信息被窃取,怎么进行防御呢?

CSRF防范措施

1. 利用Cookie的SimeSite属性

CSRF重要的一环就是窃已登录网站的Cookie,因此在Cookie上做文章是防范的不二之选。

恰好在Cookie中有这样一个字段,可以对携带Cookie做限制这个字段就是SameSite

SameSite可以设置三个属性,StrictLaxNone

  1. Strict模式下,浏览器完全禁止第三方请求携带Cookie,比如说 www.xxx.com,只有在当前域名当中才能携带Cookie,其它网站下的请求都不可以,
  2. Lax就稍微宽松一点,但是只能在get请求方法中a链接请求的情况下才能携带cookie,其它情况均不能
  3. None模式下,也就是默认模式下,会自动携带Cookie

验证来源站点

就需要用到请求头中的两个字段:OriginReferer 其中Origin只包含了域名信息,Referer包含了具体的URL路径 当然这两者都是可以伪造的,自定义请求头即可,安全性略差

CSRF Token

浏览器向服务器发送请求时,服务器会返回一个字符串,返回到前端。

然后浏览器要发送请求就必须携带这个字符串,来验证请求是否合法,通常这个字符串其它网站是拿不到的,所以会被拒绝,这个字符串就是CSRF Token。笔者所在的公司做的项目也有这个token,只是不知道原来这个叫CSRF Token,不知道是用来防御CSRF攻击的,这就。。。。

CSRF总结

CSRF(Cross-site request forgery)跨站请求伪造。指的是诱导用户点击黑客链接,打开页面,利用用户其它页面已登录的状态,获取用户信息伪造请求从而达到攻击的目的。

一般主要有三种攻击方式:

  1. 自动发GET
  2. POST请求
  3. 诱导发送get请求

防御措施:

  1. 利用CookieSameSite属性
  2. 利用OriginReferer
  3. 利用CSRF Token

本篇文章记录了学习XSS和CSRF攻击的原理和防御的方法,忘了可以来这看看,😋。

水平有限,难免有错误之处,欢迎指出。

这篇记录来源三元大佬的灵魂之问系列,推荐去阅读原文。