这是我参与「第四届青训营 」笔记创作活动的的第9天
攻击篇
XSS(Cross-Site Scripting)
在开发维护页面,攻击者通过一种方式把恶意脚本注入。当访问页面时,恶意脚本就会执行,造成攻击。
xss主要利用了开发者盲目信任用户的提交内容和把用户提交的字符串转化成了dom。
特点:
- 通常难以从UI上感知(暗地执行脚本)
- 窃取用户信息(cookie/token)
- 绘制UI(例如弹窗),诱骗用户点击/填写表单
存储型XSS
- 恶意脚本被存在数据库中
- 访问页面的人-->读数据,都会被攻击,隐私被泄露
- 危害最大,对全部用户可见
攻击流程:
反射型XSS
- 不涉及数据库
- 从URL上攻击
攻击流程:
host/path/?param=<script>alert('123')</script>
public asyna render(ctx){
const {param} =ctx.query;
ctx.status = 200;
ctx.body =`<div>${param}</div>`;
攻击者把它构造成恶意的script标签,当用户访问页面时,就会命中这种XSS攻击
DOM型XSS
- 不需要服务器的参与
- 恶意攻击的发起、执行,全在浏览器完成
host/path/?param=<script>alert('123')</script>
const content =new URL(location.href).searchParams.get("param");
const div=document.createElement("div");
//恶意脚本注入
div.innerHTML=content;
document.body.append(div);
反射型xss与DOM型xss区别在于完成注入脚本的地方不同,反射型xss是在服务端,而DOM型xss是由浏览器这一端。
突变性XSS
- 利用了浏览器渲染DOM的特性
- 不同浏览器,会有区别
<noscript><p title="</noscript><imp src=x onerror=alert(1)>">
渲染可得到
<div>
<noscript><p title="</noscript>
<imp src="x" onerror="alert(1)">
"">"
</div>
p标签到title属性那里会被当作noscript标签的内容,而title属性对应的字符串会被当作一个正式的HTML渲染,会触发 onerror事件,而onerror事件一回调就完成xss攻击。
CSRF
特点
- 在用户不知情的前提下
- 利用用户权限(cookie)
- 构造指定HTTP请求,窃取或修改用户敏感信息
get传参的csrf
所谓get传参的csrf就是服务器接收数据是用get的方式
<a href="https://bank.com/transfer?to=hacker&amount=100">点我抽奖</a>
写一个a标签,用户一点击就会被攻击
<img style="display:none;" src="https://bank.com/transfer?to=hacker&amount=100"/>
img标签,用户一访问页面,图片一被加载就完成一次CSRF的攻击
SQL 注入
Sql 注入攻击是通过将恶意的 Sql 查询或添加语句插入到应用的输入参数中,再在后台 Sql 服务器上解析执行进行的攻击,它目前黑客对数据库进行攻击的最常用手段之一。
SSRF
这是一种由攻击者构造形成由服务端发起请求的一个安全漏洞。 一般情况下,SSRF攻击的目标是从外网无法访问的内部系统。
public async webhook(ctx){
//callback 可能是内网url
ctx.body=await fetch(ctx.query.callback);
}
请求用户自定义的callback url,web server通常有内网访问权限,访问callback就相当于暴露内网信息
DoS
通过某种方式(构造特定请求),导致服务器资源被显著消耗,来不及响应更多请求,导致请求挤压,进而雪崩效应。
ReDoS基于正则表达式的DoS
DDoS
短时间内,来自大量僵尸设备的请求流量,服务器不能及时完成全部请求,导致请求堆积,进而雪崩效应,无法响应新请求。
攻击特点:
- 直接访问IP
- 任意API
- 消耗大量带宽(耗尽)
中间人攻击
中间人攻击发生在第三方不知道合法参与者的情况下拦截数字对话时。此对话可以发生在两个人类用户、一个人类用户和一个计算机系统或两个计算机系统之间。
在任何这些情况下,攻击者都可能只是简单地窃听对话以获取信息(考虑登录凭据、私人账户信息等)。或者他们可能会模拟其他用户来操纵对话。在后一种情况下,攻击者可能会发送错误信息或共享恶意链接,这可能会导致系统崩溃,或为其他网络攻击打开大门。通常情况下,合法用户不会意识到他们实际上正在与非法第三方通信,直到发生损害以后才意识到。
防御篇
XSS
- 永远不信任用户的提交内容
- 不要将用户提交内容直接转换成DOM
现成工具
前端:主流框架默认防御XSS,谷歌的google-closure-library也提供了非常完善的防御各种XSS的函数
服务端:DOMPurify
方法
- 要把string直接生成DOM时,需要对string进行转译
- 允许用户上传svg文件,要对svg进行扫描
- 尽量不要自定义跳转链接,如果要的话要先过滤
- 允许用户自定义样式的话,要对设置背景图片、url的地方额外留意
CSRF
防御iframe攻击
X-Frame-Options:DENY/SAMEORIGIN
SameSite cookie避免用户信息被携带
依赖cookie的第三方服务需加上
Set-Cookie:SameSite=None;Secure;
SQL注入
- 找到项目中查询SQL的地方
- 使用prepared statement
其他的注入
DoS
Regex DoS
- 完善代码review,避免写出贪婪匹配的模式
- 代码扫描工具,扫描存在的正则表达式,进行规整,对正则进行性能的测试
- 最好拒绝使用用户提供的正则
DDoS
参考文章:t.csdn.cn/cRtG5