这是我参与「第四届青训营 」笔记创作活动的的第3天
一、XSS
跨站脚本攻击(Cross Site Scripting,简称 xss)是最为常见攻击 Web 网站方法,攻击者通过注入非法的 html 标签或者 js 代码,来控制用户浏览器。
原理是攻击者往 Web 页面里插入可执行的网页脚本代码,当用户浏览该页之时,嵌入其中 Web 里面的脚本代码会被执行,从而盗取用户信息或侵犯用户安全隐私。
特点
- 通常难以从UI上感知(暗地执行脚本)
- 窃取用户信息(cookie/token),不经意间帮助攻击者发送恶意请求
- 绘制UI(例如alert),诱骗用户点击/填写表单,骗取用户个人信息
xss攻击分类
存储型xss
持久型 XSS 漏洞,一般存在于表单提交等交互功能,入侵者利用 XSS 漏洞,将内容经正常功能提交进入数据库持久保存,当前端页面通过接口获得数据库中的注入代码,将其渲染执行,从而危害用户安全。存储型xss为什么叫存储型,就是因为数据长期存在于数据库中,每次读取数据渲染后都会产生威胁,危害面广且危害最大,对全部用户可见。
graph LR
访问页面 --> 读取数据 --> 被攻击
这其中的漏洞有:
- post请求后没有转义直接入库
- 数据库取出数据给前端之前没有转义
- 前端拿到数据直接渲染,不做处理
反射型xss
一般是通过给别人发送带有参数的 URL, URL 地址被访问时,带有的参数被 HTML 解析、执行。反射型xss不涉及数据库攻击,从URL上进行攻击。
需要诱骗用户点击,反馈率低,较难发现和响应修复。
demo:URL :host/ path/?param=<script>alert('123')</ script>
public async render(ctx) {
ctx.status = 200;
ctx.body = `<div>${param}</div>`
}
Dom xss
该攻击很大原因是因为客户端脚本处理逻辑导致的安全问题。例如对传入的内容不做筛选,直接作为dom进行插入,而入侵者就可以在传入的内容做手脚。
DOM xss 不需要服务器的参与,恶意的发起加执行,全在浏览器完成。
相同的URL:host/ path/?param=<script>alert('123')</ script>
const content = new URL(location.href).searchParams.get("param");
const div = document.createElement("div");
//恶意脚本注入
div.innerHTML = conent;
document.body.append(div);
与反射型的XSS对比,反射型的脚本注入是从服务器注入,而DOM XSS是在浏览器就完成注入。
二、CSRF
CSRF(Cross Site Request Forgery),即跨站请求伪造,是一种常见的Web攻击,它利用用户已登录的身份,在用户毫不知情的情况下,以用户的名义,构造指定 HTTP 请求,完成非法操作,窃取或修改用户敏感信息。
受到 CSRF 攻击的要求为:
- 用户已经登录了站点 A,并在本地记录了
cookie - 在用户没有登出站点 A 的情况下(也就是
cookie生效的情况下),访问了恶意攻击者提供的引诱危险站点 B (B 站点要求访问站点A)。 - 站点 A 没有做任何 CSRF 防御
demo:
<a href="https://bank.com/transfer?to=hacker&amount= 100">点我抽奖</a>
<img style= ”display:none;" src= "https://bank. com/ transfer ?to=hacker&amount=100"/>
三、注入攻击
SQL注入
SQL注入攻击(SQL Injection),被广泛用于非法获取网站控制权,是发生在应用程序的数据库层上的安全漏洞。在设计程序,忽略了对输入字符串中夹带的SQL指令的检查,被数据库误认为是正常的SQL指令而运行,从而使数据库受到攻击,可能导致数据被窃取、更改、删除,以及进一步导致网站被嵌入恶意代码、被植入后门程序等危害。
demo:
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}
`)
crx.body = renderForm(result)
}
fetch("/api",{
method:"POST",
headers:{
"Content-Type": "application/json"
},
body: JSON.stringily({
username : "any;DROP TABLE table;",
})
})
被动删库跑路
其他注入
注入攻击不止SQL,还有:
- CLI
- OS command
- SSRF(Server-Side Request Forgery),服务端伪造请求,严格的讲,SSRF不是注入,但是原理类似