Web开发安全学习记录|青训营笔记

26 阅读2分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 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

具体流程如下:

  1. 发出带有 SQL 参数(恶意注入)的请求
  2. 当请求达到服务器端 Server ,读参数,构造 SQL 语句,运行 SQL 语句代码
  3. 运行 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 );
}

上述,接口可以进行一下攻击:

  1. 读取请求字段
  2. 直接以字符串的形式拼接 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 导致的后果有:
  1. 流量转发到真实第三方
  2. 第三方扛不住新增流量
  3. 第三方服务器挂掉 这样的攻击是通过流量大的网站,转发流量到小网站上,如果该网站没有做好流量防护的准备的话,那么就会导致服务器崩溃,这是一种很巧妙的攻击方式。

防御篇

XSS

  • 永远不信任用户的提交内容
  • 不要将用户提交内容直接转换成 DOM

总结

通过本次学习,学习了Web安全的攻击的各种各样的攻击手段,比如,跨站脚本攻击(Cross-Site Scripting)、跨站请求伪造漏洞(CSRF)等等。
还学习了部分了Web安全的防御手段,比如,针对跨站请求伪造漏洞的进攻手段进行维护等等。

引用