一.XSS 跨站脚本攻击 (Cross Site Scripting)
- XSS(Cross Site Scripting)跨站脚本攻击,因为缩写与CSS重叠,所以只叫XSS。利用方式主要是借助网站本身设计不严谨,用户注入恶意js脚本,对网站自身造成危害。
- XSS分类
- 反射型(通过url参数直接注入)
- 存储型(在输入框,注入攻击脚本,页面回显时,运行这段脚本,就可以进行攻击)
- 总结:在网站本身没有做XSS防御的情况下,反射型和存储型,二者可以形成一种链式攻击。
- XSS危害
- 利用脚本窃取用户的cookie值,被害者在不知情的情况下,帮助攻击者发送恶意请求
- 显示伪造的文章或图片
- 利用xss篡改网页
- 总结:script能干啥,它就能改变啥。
- 防御
- X-XSS-Protection 是一个响应头,当检测到跨站脚本攻击 (XSS)时,浏览器将停止加载页面。
- CSP
- HttpOnly Cookie
二.CSRF 跨站请求伪造 (Cross Site Request Forgery)
- 跨站请求伪造(Cross Site Request Forgery),是一种常见的Web攻击,它利用用户已登陆的身份,在用户毫不知情的情况下,以用户的名义完成非法操作。
- 防御
- 验证HTTP Referer字段
- 在请求地址中添加token并验证
- 在HTTP头中自定义属性并验证
三.ClickJacking 点击劫持 (视觉欺骗)
- 点击劫持是一种视觉欺骗手段。攻击者将需要攻击的网站通过iframe嵌套的方式嵌入自己的网页中,并将iframe设置为透明,在用户透出一个按钮诱导用户点击。
- 防御
- 概念:X-Frame-Options是一个HTTP响应头,在现代浏览器有很好的支持,这个HTTP响应头就是为了防御用iframe嵌套的点击劫持攻击
- DENY:表示该页面不允许在 frame 中展示,即便是在相同域名的页面中嵌套也不允许。
- SAMEORIGIN:表示该页面可以在相同域名页面的 frame 中展示。
- ALLOW-FROM uri:表示该页面可以在指定来源的 frame 中展示
ctx.set('X-Frame-Options', 'DENY')
四.SQL注入
- SQL注入就是一种通过操作输入,来修改后台SQL语句达到代码执行进行攻击目的的技术。
- 例子
// 填入特殊密码 1'or'1'='1 // 拼接后的SQL SELECT * FROM test.user WHERE username = 'tiankai' AND password = '1'or'1'='1'// 错误写法 const sql = `SELECT * FROM test.user WHERE username = '${ctx.request.body.username}' AND password = '${ctx.request.body.password}' console.log('sql', sql) res = await query(sql)` // 正确写法 const sql = `SELECT * FROM test.user WHERE username = ? AND password = ?` console.log('sql', sql) res = await query(sql,[ctx.request.body.username,ctx.request.body.password]) - 防御
-
特殊字符转义:escape处理,一般会用到两个函数mysql_real_escape_string()和addslashes()(PHP语法)
-
mysql_real_escape_string()函数会转义:' " \r \n NULL Control-Z
-
addslashes()函数会转义:' " 反斜线和NULL
-
这种方式对付通过SQL注入绕过登录认证,即所谓的万能密码,特别有效。也可用来对付字符型注入,因为攻击者需要注入单引号来达到引号平衡。
-
五.OS命令注入
- OS命令注入攻击指通过Web应用,执行非法的操作系统命令达到攻击的目的。只要在能调用shell函数的地方就有存在被攻击的风险
const exec = require('mz/child_process').exec; let params = {/* 输入参数 */}; exec(`git clone ${params.repo} /some/path`) - 如果传入的参数
https://github.com/xx/xx.git && rm -rf /* && - 防御
- 在进入执行命令函数和方法前,对变量进行过滤,对敏感字符进行转义。
六.请求劫持 (DNS劫持 HTTP劫持)
- DNS劫持
- DNS服务器被篡改,修改了域名解析的结果,使得访问到的ip不是预期的ip。
- 防御
- 首先,选择较为权威的DNS解析服务商做域名解析,可以有效降低因为DNS解析服务商的漏洞导致域名解析记录被篡改的发生。
- 其次,结合使用DNS加速类的产品,可以持续不断的刷新DNS缓存,从而保障在DNS服务器缓存的数据得以实时更新,减少在解析请求过程中被劫持篡改的几率。
- 还有一些目前推出的DNS劫持监控功能,也能及时的发现各地DNS解析的情况,一旦发生问题可以针对性的进行解决,避免损失进一步加大。
- HTTP劫持
- 表现形式:打开的网页,下方角落会有一些小广告,有时候这些广告,不是访问站点为了盈利而投放的广告,而是第三方的运营商提供的,这就是HTTP劫持。
- 原理
- 在TCP连接中,找出应用层采用了HTTP协议的连接,进行标识。
- 篡改HTTP响应体,可以通过网关获取数据包进行内容的篡改。
- 抢先回包,将篡改后的数据包抢先正常站点返回的数据包先到达用户侧,这样后面正常的数据包在到达之后会被直接丢弃
- 防御
- 使用HTTPS
七.DDOS (distributed denial of service)
- 短时间内大量访问,把网络资源,CPU全部占满,导致网站无法正常响应,导致网站实质下线。
- 例子
- 我开了一家餐厅,正常情况下,最多可以容纳30个人同时进餐。你直接走进餐厅,找一张桌子坐下点餐,马上就可以吃到东西。很不幸,我得罪了一个流氓。他派出300个人同时涌进餐厅。这些人看上去跟正常的顾客一样,每个都说"赶快上餐"。但是,餐厅的容量只有30个人,根本不可能同时满足这么多的点餐需求,加上他们把门口都堵死了,里三层外三层,正常用餐的客人根本进不来,实际上就把餐厅瘫痪了。这就是 DDOS 攻击,它在短时间内发起大量请求,耗尽服务器的资源,无法响应正常的访问,造成网站实质下线。
- 防御
- 添加备份网站:不需要是全功能网站,只要是个静态页面就行,告诉用户网站出了问题,全力维修。
- HTTP请求的拦截:HTTP 请求的特征一般有两种:IP 地址和 User Agent 字段。比如,恶意请求都是从某个 IP 段发出的,那么把这个 IP 段封掉就行了。
- 带宽扩容,CDN