这是我参与「第五届青训营 」伴学笔记创作活动的第 11 天
Web开发安全学习记录
攻击篇
跨站脚本攻击(Cross-Site Scripting)
<script>
alert("xss");
</script>
XSS主要利用了两点:
- 盲目信任用户的提交内容
- string转化成DOM
- document.write
- element.innerHTML = anyString
- SSR(user_data)//伪代码
XSS的一些特点:
- 通常难以从UI上感知(暗地执行脚本)
- 窃取用户信息(cookie/token)
- 绘制 UI (例如弹窗),诱骗用户点击/填写表单
假设一些demo接口为:
//写数据
public async submit(ctx){
const{ content, id } = ctx.request.body;
await db.save({
content,
id
});
}
//读数据
public async render(ctx){
const { content } = await db.query({
id: ctx.query.id
});
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 上攻击
Mutation-based XSS
- 利用了浏览器渲染 DOM 的特性 ( 独特优化 )
- 不同浏览器,会有区别 ( 按浏览器进行攻击 )
跨站请求伪造漏洞(CSRF)
只要伪造 POST请求 就可以完成CSRF攻击,成本非常低。
CSRF的特点
- 在用户不知情的前提下
- 利用用户权限(cookie)
- 构造指定 HTTP 请求,窃取或修改用户敏感信息
GET请求攻击
<a href="https://xxx.xxx.xxx">点我抽奖</a>
通过构建a
标签,点击一次,就完成一次攻击
<img style="display:none;" src="https://xxx.xxx.xxx"/>
只要图片已加载,就完成了一次攻击
Injection
SQL Injection
具体流程如下:
- 发出带有 SQL 参数(恶意注入)的请求
- 当请求达到服务器端 Server ,读参数,构造 SQL 语句,运行 SQL 语句代码
- 运行 SQL 代码,可能会有获取其他数据、修改数据、删除数据等等操作 假如 Demo1 的接口如下:
public async renderForm(ctx){
const { username, form_id} = ctx.query;
const result = await sql.query{
SELECT a,b,c FROM table
WHERE username = ${username}
AND form_id = ${form_id}
};
ctx.body = renderForm( result );
}
上述,接口可以进行一下攻击:
- 读取请求字段
- 直接以字符串的形式拼接 SQL 语句
假如 Demo2 的接口如下:
public async convertVideo(ctx){
const { video, options } = ctx.request.body;
exec('convert-cli ${ video } -o ${ options }');
ctx.body = "ok";
}
在上述 Demo2 中,接收用户传进来的options
参数(没有对此过滤),可以完成一个系统命令,那么可以对该系统进行攻击,比如删除如下:
fetch("/api",{
method:"POST",
body: JSON.stringly({
options:' && rm -rf xxx'
})
});
执行该命令的时候,就会把服务器端的若干文件进行删除,那么服务器端就会下线。
除了删除,读取和修改是也是有巨大的威胁的,如果读取了重要文件比如:
/etc/passwd
etc/shadow
~/.ssh
/etc/apache2/httpd.conf
/etc/nginx/nginx.conf
导致的后果有:
- 流量转发到真实第三方
- 第三方扛不住新增流量
- 第三方服务器挂掉 这样的攻击是通过流量大的网站,转发流量到小网站上,如果该网站没有做好流量防护的准备的话,那么就会导致服务器崩溃,这是一种很巧妙的攻击方式。
防御篇
XSS
- 永远不信任用户的提交内容
- 不要将用户提交内容直接转换成 DOM
总结
通过本次学习,学习了Web安全的攻击的各种各样的攻击手段,比如,跨站脚本攻击(Cross-Site Scripting)、跨站请求伪造漏洞(CSRF)等等。
还学习了部分了Web安全的防御手段,比如,针对跨站请求伪造漏洞的进攻手段进行维护等等。