# 其它常见web攻击

# 一、点击劫持 - clickjacking

点击劫持是一种视觉欺骗的攻击手段。攻击者将需要攻击的网站通过 iframe 嵌套的方式嵌入自己的网页中,并将 iframe 设置为透明,在页面中透出一个按钮诱导用户点击。

# 防御手段

  • X-FRAME-OPTIONS

X-FRAME-OPTIONS 是一个 HTTP 响应头,在现代浏览器有一个很好的支持。这个 HTTP 响应头 就是为了防御用 iframe 嵌套的点击劫持攻击。

该响应头有三个值可选,分别是:

DENY,表示页面不允许通过 iframe 的方式展示
SAMEORIGIN,表示页面可以在相同域名下通过 iframe 的方式展示
ALLOW-FROM,表示页面可以在指定来源的 iframe 中展示
1
2
3
ctx.set('X-FRAME-OPTIONS', 'DENY')
1
  • JS方式

通过判断top和self是否相等来判断页面是否在iframe里面。

<head>
<style id="click-jack">
html {
    display: none !important;
}
</style>
</head>
<body>
<script>
if (self == top) {
    var style = document.getElementById('click-jack')
    document.body.removeChild(style)
} else {
    top.location = self.location
}
</script>
</body>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17

以上代码的作用就是当通过 iframe 的方式加载页面时,攻击者的网页直接不显示所有内容了。

# 二、SQL注入

// 填入特殊密码
1'or'1'='1
// 拼接后的SQL
SELECT *
FROM test.user
WHERE username = 'laowang'
AND password = '1'or'1'='1'
1
2
3
4
5
6
7

# 防御手段

  • 所有的查询语句建议使用数据库提供的参数化查询接口**,参数化的语句使用参数而不是将用户输入变量嵌入到 SQL 语句中,即不要直接拼接 SQL 语句。例如 Node.js 中的 mysqljs 库的 query 方法中的 ? 占位参数。
// 错误写法
const sql = `
SELECT *
FROM test.user
WHERE username = '${ctx.request.body.username}'
AND password = '${ctx.request.body.password}'
`
console.log('sql', sql)
res = await query(sql)
// 正确的写法
const sql = `
SELECT *
FROM test.user
WHERE username = ?
AND password = ?
`
console.log('sql', sql, )
res = await query(sql,[ctx.request.body.username, ctx.request.body.password])
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
  • 严格限制Web应用的数据库的操作权限**,给此用户提供仅仅能够满足其工作的最低权限,从而最大限度的减少注入攻击对数据库的危害
  • 后端代码检查输入的数据是否符合预期**,严格限制变量的类型,例如使用正则表达式进行一些匹配处理。
  • 对进入数据库的特殊字符(',",\,<,>,&,*,;等)进行转义处理,或编码转换**。基本上所有的后端语言都有对字符串进行转义处理的方法,比如 lodash 的lodash._escapehtmlchar 库。

# 三、OS命令注入

OS命令注入和SQL注入差不多,只不过SQL注入是针对数据库的,而OS命令注入是针对操作系统的。OS命令注入攻击指通过Web应用,执行非法的操作系统命令达到攻击的目的。只要在能调用Shell函数的地方就有存在被攻击的风险。倘若调用Shell时存在疏漏,就可以执行插入的非法命令。

// 以 Node.js 为例,假如在接口中需要从 github 下载用户指定的 repo
const exec = require('mz/child_process').exec;
let params = {/* 用户输入的参数 */};
exec(`git clone ${params.repo} /some/path`);
1
2
3
4

如果传入的参数是会怎样 https://github.com/xx/xx.git && rm -rf /* &&

# 四、请求劫持

  • DNS劫持

顾名思义,DNS服务器(DNS解析各个步骤)被篡改,修改了域名解析的结果,使得访问到的不是预期的ip

  • HTTP劫持

运营商劫持,此时大概只能升级HTTPS了

# 五、DDOS

参考

distributed denial of service DDOS 不是一种攻击,而是一大类攻击的总称。它有几十种类型,新的攻击方法还在不断发明出来。网站运行的各 个环节,都可以是攻击目标。只要把一个环节攻破,使得整个流程跑不起来,就达到了瘫痪服务的目的。

# 常见攻击方式

  • SYN Flood

此攻击通过向目标发送具有欺骗性源IP地址的大量TCP“初始连接请求”SYN数据包来利用TCP握手。目标机器响应每个连接请求,然后等待握手中的最后一步,这一步从未发生过,耗尽了进程中的目标资源。

  • HTTP Flood

此攻击类似于同时在多个不同计算机上反复按Web浏览器中的刷新 - 大量HTTP请求泛滥服务器,导致拒绝服务。

# 防御手段

  • 备份网站 备份网站不一定是全功能的,如果能做到全静态浏览,就能满足需求。最低限度应该可以显示公告,告诉用户,网 站出了问题,正在全力抢修。
  • HTTP 请求的拦截 高防IP -靠谱的运营商 多个 Docker 硬件 服务器 防火墙
  • 带宽扩容 + CDN 提高犯罪成本
Last Updated: 2/12/2020, 3:12:47 PM