抱歉,您的浏览器无法访问本站

本页面需要浏览器支持(启用)JavaScript


了解详情 >

XSS(跨站脚本注入)

引入

在表单中嵌入非法HTML代码

如果一个网站有一个表单,类似这样:

1
<textarea></textarea>

然后用户往里面填写了这样的信息:

1
<script>alert(12412412);</script>

如果在展示页面,直接将用户输入的内容作为 innerHtml 渲染,那么用户打开这个页面就会弹出对话框。

a链接上的href

1
2
3
4
5
6
<template>
<a :href="href"></a>
</template>
<script setup>
let href = "javascript:alert('aaaabbbbcccc')"
</script>

后台返回内容中拼接HTML不过滤

1

类型

  1. 存储型XSS:恶意脚本被存入了数据库
  2. 反射性XSS:恶意脚本作为一个URL的部分发送给服务器,然后将URL中的信息直接通过innerHtml 等手段展示给了用户。
  3. DOM XSS:这和反射型XSS差不多,但区别是DOM XSS 完全是在客户端上执行的。
  4. 针对浏览器的XSS:利用浏览器渲染DOM的特性
1
<noscript><p title="</noscript><img src='' onerror=alert(1)>" /></noscript>

危害

  1. 恶意脚本能够窃取的信息,然后发送给第三方
  2. 能够让页面出现弹框等严重BUG
  3. 可以诱骗用户填写假内容

原理

  1. 直接使用用户的内容进行渲染 innerHtml=用户内容 或者 SSR(用户内容)

解决

  1. 对于一切传入的用户内容,应当对里面的HTML进行转义和过滤。
  2. 配置内容安全策略

CSRF(跨站请求伪造)

恶意网站在用户不知情的情况下,窃取用户的Cookie等身份凭证,伪造请求,从而窃取或修改用户信息。

伪造不同的请求

  1. 通过图片的 src 等方式,可以伪造GET请求
  2. 通过表单操作,可以伪造POST请求

解决

  1. Cookie添加Samesite、作用域、Secure 等属性,避免用户信息被第三方携带。
  2. 严格权限控制。
  3. CSRF Token

注入

引入

如果用户提供了一个这样的参数:

1
2
3
let query = {
id: '1;DROP TABLE user;'
}

后台直接拼接SQL字符串,不做处理:

1
let sql = `SELECT * from user where id=${query.id}`

那么合成后:

1
let sql = `SELECT * from user where id=1;DROP TABLE user;`

执行后,user这个表格就没有了。

除了SQL注入,还存在命令注入:

1
2
3
4
5
let query = {
file: "-rf /"
}
let command = `rm ${query.file}`
exec(command)

甚至还有服务端请求伪造:

1
2
3
4
let query = {
url: "xxxxx"
}
axios.get(url)

分类

  1. SQL注入
  2. 命令注入
  3. SSRF(服务端请求伪造)

解决

  1. 不要直接将用户输入的内容填充到SQL、命令等内容,应当做过滤处理
  2. 做好数据库、后天程序的执行权限管理

DOS和DDOS:拒绝服务攻击

通过一些特定的方式,短时间内制造大量请求,使得服务端资源被耗尽,来不及响应。

TCP SYN 泛洪

利用了TCP三次握手的原理,在第一次握手的时候,制造一个私有的IP地址来发送SYN请求。此时服务器会返回一个ACK-SYN的响应。但是这个IP是私有的,不可达,所以这个响应是无法收到的。这时候服务器也无法收到ACK消息,就会触发超时重传机制。

通过短时间制造大量这样的请求,使得服务器被这些攻击SYN请求占满。

ping 泛洪

短时间发送大量的ICMP消息。

HTTP 泛洪

短时间制造大量的HTTP请求。

解决

  1. 采用负载均衡、CDN等技术进行流量分发和过滤
  2. 快速扩容、非核心业务降级

中间人攻击

HTTP协议是明文传输,因此一旦被中间人劫持,中间人就可以窃取修改数据了;或者把正常请求劫持到攻击者的非法网站等。

解决

  1. 采用HTTPS
  2. 对敏感内容进行加密

评论