目录
Web开发的安全之旅之攻击篇
Cross-Site Scripting(XSS)
- Cross-Site Scripting(XSS) 跨站脚本攻击是最常见的一种攻击方式
- 攻击者会在我们开发维护页面中,通过一种方式把其恶意脚本注入进来
后果:
- 用户隐私泄漏
- 用户机器成为一台挖矿的机器
XSS主要利用
- 开发者盲目信任用户的提交内容 + 直接将字符串转换成为DOM
XSS的特点
- 通常难以从UI上感知(暗地执行脚本)
- 窃取用户信息(cookie/token)
- 绘制UI(例如弹窗),诱变用户点击/填写表单
XXS的分类
- XSS按照它的性质可以分为Stored XSS、Reflected XSS、DOM-based XSS 和Mutation-based XSS 四类
Stored XSS
- 恶意脚本被存放在数据库中
- 访问页面 -> 读取数据 == 被攻击
- 这种危害最大, 对全部用户可见
Reflected XSS
- 不涉及数据库
- 从URL上攻击
例如下面带码,通过给URL携带恶意参数,当用户访问界面时,就会受到攻击
DOM-based XSS
- 不需要服务器的参与
- 恶意攻击的发起 + 执行,全在浏览器完成
例如下面例子,相同URL,但是更换执行环境,攻击者通过浏览器中相应的API,读取浏览器的参数,然后将参数对应的值写到页面的body中也就完成了一次XSS攻击
Mutation-based XSS
- 利用了浏览器渲染DOM的特性(独特优化)
- 不同浏览器,会有区别(按浏览器进行攻击)
- 最难防范的一种XSS攻击手段
例如下面例子中通过一段看似合法的tilte字符串属性,实际上将这一段代码拿到浏览器中渲染,比如Chrome中就会得到一段带有onerror的回调,回调触发则完成一次XSS攻击
Cross-site request forgery(CSRF)
Cross-site request forgery(CSRF),跨站请求伪造
- 用户不知情的前提下
- 利用用户权限(cookie)
- 构造指定HTTP请求,窃取或修改用户敏感信息
例如下面例子中用户收到一封未知名的邮箱,并且打开了恶意页面,然后攻击者在这个恶意页面中构造了一个HTTP请求,向银行发起了转账,银行收到这个请求,发现有用户的cookie 并且还验证成功了,就认为该请求时合法用户的合法的请求,于是就发起转账
GET是跨站最常见的HTTP请求,例如下面代码
a标签中请求
img标签中的请求
通过表单方式构造POST跨站请求:
Injection(注入)
- SQL Injection是最常见的注入攻击
- 在请求中携带(恶意注入的)SQL参数,然后服务器运行这段代码时,攻击者就可以获取其他数据、修改数据等
Injection demo1
- 读取请求字段直接以字符串的形式拼接SQL语句
这样就恭喜完成被动删库跑路成就
Injection 不局限于SQL语句
- CLI injecion:命令行界面注入
- OS command injection :OS 命令注入(也称为shell 注入)
- Server-Side Request Forgery(SSRF),服务端伪造请求(严格而言,SSRF不是injection,但是原理类似)
Injection demo2
这里接收到用户的options参数没有进行任何过滤,服务器执行这段代码,就有可能会得到下面的结果
Injection demo3
- 攻击者通过读取修改重要文件,把本站的流量转发到真实第三方网站
- 第三方服务器因扛不住新增流量而挂掉
- 第三方服务下线
SSRF demo
攻击者通过用户自定义的callback URL发起请求
服务器接收这个请求的时候访问这个 callback就有可能暴露内外信息
Denial of Service(DoS)
DoS是Denial of Service的简称,即拒绝服务
- 攻击者通过某种方式(构造特定请求),导致服务器资源被显著消耗,来不及响应更多请求,导致请求挤压,进而雪崩效应。
ReDos:基于正则表达式的DOS
正则表达式----贪婪模式
重复匹配是 ? vs no?:满足“一个即可”vs“尽量多”
const nonGreedyRegExp = /a+?/; //有一个就行
const greedyRegExp = /a+/ //又多少个匹配多少
const str = 'aaaaaaa';
console.log(str.match(nonGreedyRegExp)[0]); //a
console.log(str.match(greedyRegExp)[0]); // aaaaaaa
贪婪:n次不行?n-1次再试试?——回溯
攻击者传入一个可以回溯的字符串,这样导致的效果就是服务器端响应的时间大大的延长,导致接口吞吐量明显降低,响应用户的次数大大下降
Distributed Dos (DDoS)
- 段时间内,来自大量的僵尸设备的请求流量,服务器不能及时完成全部请求,导致请求堆积,进而雪崩效应,无法响应新的请求
不搞复杂的,量大就完事了
攻击特点
- 直接访问IP
- 任意API
- 消耗大量带宽(耗尽)
DDoS demo
SYN Flood 洪水攻击
TCP有三次握手,攻击者会构建大量的TCP请求,发送大量的SYN给服务器,服务器会按照规范返回ACK+SYN进入等待状态,但是攻击者此时不会返回第三次ACK,就导致第三次握手没有完成,服务器连接次数不能被释放,当服务器达到最大连接数,新的请求就通通不能响应,这样就完成了一次洪水攻击
中间人攻击
- 攻击者在浏览器和服务器之间插入,让浏览器认为自己在和服务器之间通信,服务器认为自己在给浏览器传输数据,实际上它们都是和中间人进行交流沟通,中间人就可以在中间窃取信息,修改请求等
- 中间人可以由很多角色扮演,例如一个恶意的浏览器,路由器等
中间人攻击成功的原因
- 明文传输
- 信息篡改不可知
- 对方身份未验证