记录学习XSS和CSRF攻击原理和防御。
什么是XSS攻击
XSS(cross site scripting)即跨站脚本攻击,为了不和CSS重名,故为XSS。是指浏览器执行恶意脚本(无论是同域还是跨域),拿到用户信息进行一些操作。
大致可以做到这些事情
- 窃取cookie
- 监听用户行为,直接发动到黑客服务器
- 修改dom伪造登录表单
- 在页面生成悬浮窗广告
通常情况下XSS攻击大致可以分为三类:
存储型
存储是指将恶意脚本存储到了服务器,比如说文章的评论添加了恶意的脚本代码,这段代码存储到了数据库,每次打开页面都会执行恶意脚本的代码,这就是存储型xss攻击。
反射型
反射型XSS指的是恶意请求作为网络请求中的一部分
比如我输入
http://sanyuan.com?q=<script>alert("你完蛋了")</script>
这样,在服务器拿到q参数,然后将其余的返回给前端,前端将这些内容当做html解析发现是一个脚本,直接执行了,这样就被攻击了。
之所以叫它反射型。是说恶意脚本作为参数发送到服务器,服务器返回当前参数,参数在前端被解析执行。 和存储型不一样的是,恶意脚本并不会存储到服务器
文档型
是指劫持网络数据直接修改HTML文档,并不会经过服务端,这样的劫持方式包括本地恶意软件和运营商劫持
怎样规避XSS攻击
一个信念
不行新用户的任何输入,无论是前端还是后端都要对用户的输入进行转码和过滤。
<script>alert('你完蛋了')</script>
转码后
<script>alert('你完蛋了')</script>
或者采用关键字过滤的方式直接将恶意脚本删除。
利用CSP
即是浏览器中的安全策略,它的核心思想就是限制加载哪些资源,具体来说就是:
- 限制其它域下的资源加载
- 禁止向其它域提交数据
- 提供上报机制,能帮助我们及时发现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攻击的原理,
- 诱导点击进入黑客网站
- 利用用户的已登录状态和服务器的验证漏洞来
模拟用户进行操作
想一想可以利用XSS攻击的防御方式吗?转码过滤?CSP? HttpOnly?,好像都不行,因为XSS的防御方式都是针对本网站的,现在是要防止已登录网站的登录信息被窃取,怎么进行防御呢?
CSRF防范措施
1. 利用Cookie的SimeSite属性
CSRF重要的一环就是窃已登录网站的Cookie,因此在Cookie上做文章是防范的不二之选。
恰好在Cookie中有这样一个字段,可以对携带Cookie做限制这个字段就是SameSite
SameSite可以设置三个属性,Strict、Lax和None
- 在
Strict模式下,浏览器完全禁止第三方请求携带Cookie,比如说www.xxx.com,只有在当前域名当中才能携带Cookie,其它网站下的请求都不可以, - 在
Lax就稍微宽松一点,但是只能在get请求方法中和a链接请求的情况下才能携带cookie,其它情况均不能 - 在
None模式下,也就是默认模式下,会自动携带Cookie
验证来源站点
就需要用到请求头中的两个字段:Origin和Referer
其中Origin只包含了域名信息,Referer包含了具体的URL路径
当然这两者都是可以伪造的,自定义请求头即可,安全性略差
CSRF Token
浏览器向服务器发送请求时,服务器会返回一个字符串,返回到前端。
然后浏览器要发送请求就必须携带这个字符串,来验证请求是否合法,通常这个字符串其它网站是拿不到的,所以会被拒绝,这个字符串就是CSRF Token。笔者所在的公司做的项目也有这个token,只是不知道原来这个叫CSRF Token,不知道是用来防御CSRF攻击的,这就。。。。
CSRF总结
CSRF(Cross-site request forgery)跨站请求伪造。指的是诱导用户点击黑客链接,打开页面,利用用户其它页面已登录的状态,获取用户信息伪造请求从而达到攻击的目的。
一般主要有三种攻击方式:
- 自动发GET
- POST请求
- 诱导发送get请求
防御措施:
- 利用
Cookie的SameSite属性 - 利用
Origin和Referer - 利用
CSRF Token
本篇文章记录了学习XSS和CSRF攻击的原理和防御的方法,忘了可以来这看看,😋。
水平有限,难免有错误之处,欢迎指出。
这篇记录来源三元大佬的灵魂之问系列,推荐去阅读原文。