Web开发的安全之旅 | 青训营笔记
这是我参与【第四届青训营】笔记创作活动的第5天
一、攻击篇
Cross-Site Scripting(XSS)
Cross-site scripting(XSS)是一种安全漏洞,攻击者可以利用这种漏洞在网站上注入恶意的客户端代码。若受害者运行这些恶意代码,攻击者就可以突破网站的访问限制并冒充受害者
特点:
- 通常难以从UI上感知
- 窃取用户信息
- 绘制UI,诱骗用户点击/填写表单
demo:
public async submit(ctx){
const {content,id} = ctx.request.body;
//没有对content过滤
await db.save({
content,
id
});
}
public async render(ctx) {
const {content} = await db.query({
id: ctx.query.id
});
//没有对content过滤
ctx.body = `<div${content}</div>`
}
可以直接提交恶意脚本
//提交
fetch("/submit",{
body: JSON.stringify({
id: "1",
content: `<script>alert("xss");</script>`
});
});
ctx.body = `
<div>
<script>alert("xss");</script>
</div>`;
Stored XSS
- 恶意脚本被存在数据库中
- 访问页面——读数据——被攻击
- 危害最大,全部用户可见
Reflected XSS
- 不涉及数据库
- 从URL上攻击
demo:
host/path/?param=<script>alert('123')</script>
public async render(ctx) {
const {param} = ctx.query;
ctx.status = 200;
ctx.body = `<div>${param}</div>;`
}
DOM-based XSS
- 不需要服务器的参与
- 恶意攻击的发起 + 执行,全在浏览器完成
demo:
host/path/?param=<script>alert('123')</script>
Browser:
const content = new URL(location.herf).searchParams.get("param");
const div = document.createElement("div");
//恶意脚本注入
div.innerHTML = content;
document.body.append(div);
Reflected和DOM-based XSS的区别
Mutation-based XSS
- 利用了浏览器渲染DOM的特性(独特优化)
- 不同浏览器,会有区别
Cross-site request forgery(CSRF)
- 在用户不知情的前提下
- 利用用户权限
- 构造指定HTTP请求,窃取或修改用户敏感信息
CSRF——GET
<a href="https://bank.com/transfer?to=hacker&amount=100">点我抽奖</a>
<img style="display:none;" src="https://bank.com/transfer?to=hacker&amount=100">
CSRF——beyond GET
<form action="https://bank/transfer_tons_of_money" method="POST">
<input name="amount" value="10000000000000" type="hidden"></input>
<input name="to" value="hacker" type="hidden"></input>
</form>
Injection
SQL Injection
- 读取请求字段
- 直接以字符串的形式拼接SQL语句
SSRF
- 请求用户自定义的callback URL
- web server通常有内网访问权限
public async webhook(ctx) {
//callback 可能是内网URL
ctx.body = await fetch(ctx.query.callback);
//访问callback===暴露内网信息
}
Denial of Service(DoS)
以某种特定请求方式消耗服务器资源,导致请求挤压服务崩溃
ReDos:基于正则表达式的DoS
Logical DoS
- 耗时的同步操作
- 数据库写入
- SQL join
- 文件备份
- 循环执行逻辑
Distributed DoS(DDoS)
短时大量僵尸设备请求,服务器不能及时处理,导致请求堆积,服务器崩溃,无法响应新请求
攻击特点:
- 直接访问IP
- 任意API
- 消耗大量带宽
中间人攻击
- 明文传输
- 信息篡改不可知
- 对方身份未验证
二、防御篇
XSS
- 永远不信任用户提交的内容
- 不要将用户提交的内容直接转换成DOM
防御工具
前端:
- 主流框架默认防御XSS
- google-closure-library
服务器端(Node)
- DOMPurity
❌❌
- string -> DOM
- 上传svg
- blod动态生成script
- 自定义跳转链接
- 自定义样式
防御策略:
Same-origin Policy
Content Security Policy(CSP)
- 确定源是否安全
- 来自安全源的脚本执行,否之抛错
- 禁止eval + inline script
CSRF
Injection
- 找到项目中查询SQL的地方
- 使用prepared statement
PREPARE q FROM 'SELECT user FROM users WHERE gender = ?';
SET @gender = 'female';
EXECUTE q USING @gender;
DEALLOCATE PREPARE q;
Injection beyond SQL
-
最小权限原则
- ❌sudo || root
-
建立允许名单过滤
- ❌rm
-
对URL类型参数进行协议、域名、ip等限制
- ❌访问内网
DoS
Regex DoS
- Code Review
- 代码扫描,正则性能测试
- ❌用户提供的正则
Logical DoS
- 分析代码中的性能瓶颈
- 限流
DDoS
-
流量治理
- 负载均衡
- API网关
- CDN
-
快速自动扩容
-
非核心服务降级
中间人
使用HTTPS协议
- 可靠性:加密
- 完整性:MAC验证
- 不可抵赖性:数字签名
\