Web 开发安全 | 青训营笔记

114 阅读5分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 九 天

攻击

跨站脚本攻击

跨站脚本攻击即 Cross-Site Scripting(XSS),即在开发维护的页面中攻击者通过一种方式把他的恶意脚本注入进来,当用户访问我们的页面时,这些恶意脚本会攻击用户的设备,导致用户的信息泄露和设备的瘫痪。如 <script>alert( "xss" );</script>
XSS 主要利用的是开发者对于用户所提交内容的盲目信任,以及前端工程师将用户提交的字符串直接转化为 DOM。
XSS 的执行是隐藏式的,难以从 UI 层面上感知,它会窃取用户的信息,并且拥有绘制 UI 的能力,可以诱骗用户填写表单。

存储型的 XSS 攻击

存储型的 XSS 攻击会被存到数据库中,当用户访问页面时,客户端会向服务端请求数据,在这一过程中,用户就会遭受来自数据库的 XSS 攻击。这种攻击的危害最大,对全体用户可见,所有访问的用户都会遭受攻击。

反射型 XSS 攻击

反射型 XSS 攻击不涉及到数据库,而是从 URL 上完成攻击,攻击者在 URL 上写入一些特殊字段,构建特殊的 script 标签,在用户访问页面时,便会受到攻击。

基于 DOM 的 XSS 攻击

基于 DOM 的 XSS 攻击,不需要服务器端的参与,恶意攻击的发起和执行,全在浏览器上完成。与反射型 XSS 攻击类似,都是从 URL 上完成攻击,但是完成注入脚本的地方不同。

基于 Mutation 的 XSS 攻击

基于 Mutation 的 XSS 攻击利用了浏览器渲染DOM的特性,不同浏览器由于渲染机制的不同,其攻击会有区别。

跨站伪造请求

跨站伪造请求即 Cross-site request forgery(cSRF) ,能够在用户不知情的前提下,利用用户权限(cookie),构造指定 HTTP 请求,窃取或修改用户敏感信息。

CSRF.png

注入

SQL 注入攻击

攻击者在 http 请求中携带 SQL 参数,发送到服务端,服务端通过解析参数构成 SQL 语句,并执行 SQL 代码,以实现攻击者在服务端进行对数据的操作。

系统命令

当我们设置了一个参数用于接收用户的数据,却没有对其进行过滤,那么攻击者可以通过修改这一参数所代表的字段,当我们接收到这个字段时,其携带命令将会被执行,完成攻击。

服务器伪造请求

Server-Side Request Forgery(SSRF) 即服务端伪造请求。严格而言,SSRF 不是injection,但是原理类似。

SSRF.png

Denial of Service(Dos)

通过某种方式(构造特定请求),导致服务器资源被显著消耗,来不及响应更多请求,导致请求挤压,进而雪崩效应。比如利用正则表达式的贪婪模式,构建特定的字符段,来增加正则表达式的匹配次数,消耗服务器资源。

Distributed DoS(DDoS)

DDoS 攻击通过在短时间内,让目标服务器受到来自大量僵尸设备的请求流量,服务器不能及时完成全部请求,导致请求堆积,进而雪崩效应,无法响应新请求。

防御

XSS 防御

要对 XSS 进行防御,首先要明确两点,即:永远不要信任用户提交的内容,永远不要将用户提交的内容直接转化为 DOM。我们在开发中使用的一些框架其实默认都提供了对 XSS 攻击的防御功能。当我们不得不允许用户提交一些危险的内容,则必须对其进行过滤或扫描。

内容安全策略

Content Security Policy(CSP) 即内容安全策略,CSP 能够让开发者去定义哪些源是安全的,来自安全源的脚本可以被执行,否则就会直接抛错,以及对一些 script 标签设置拒绝。

CSRF 防御

由于伪造请求的来源是异常来源,因此只要我们对请求来源进行限制,就能防范伪造请求的攻击。比如对请求的 Origin 和 Referer 进行校验,如果其代表的是本端的域名,则允许请求,否则拒绝。

iframe 攻击

iframe 通过绕过源限制,来进行攻击。比如以下例子,攻击者通过构造一个带有 button 标签的页面,button 标签的下面会盖着一个 iframe,即我们的合法页面,当用户点击 button 标签时,由于设置了 CSS 属性,导致点击穿越到了下面的 iframe 页面,iframe 受到点击后会发送一个 http 请求,而 iframe 中发出的请求不是跨域请求,是同源请求,因此攻击被成功执行。通过限制加载 iframe 的页面只能为同源页面,就能对这种攻击方式进行防御。

iframe.png

严格区分请求类型

我们可以设置对请求类型的严格匹配,防止对 GET + POST 这样的组合请求通过。

避免用户信息被携带

当我们将用户的信息限制在本页面使用,其他页面无法使用,此时其他页面都无法伪造我们的信息。