常见web攻击及其防御手段

目录

一、XSS

XSS攻击分类

XSS攻击的危害

防范手段

二、CSRF 

CSRF攻击的危害

防御

三、点击劫持-clickjacking

防御

四、SQL注入

防御

OS命令注入

请求劫持


一、XSS

Cross Site Scripting 跨站脚本攻击
XSS (Cross-Site Scripting),跨站脚本攻击,因为缩写和 CSS重叠,所以只能叫 XSS。跨站脚本攻击是指通过存在安全漏洞的Web网站注册用户的浏览器内运行非法的非本站点HTML标签或JavaScript进行的一种攻击。
跨站脚本攻击有可能造成以下影响:
1、利用虚假输入表单骗取用户个人信息。
2、利用脚本窃取用户的Cookie值,被害者在不知情的情况下,帮助攻击者发送恶意请求。
3、显示伪造的文章或图片。

XSS攻击分类

1、反射型-url参数直接注入

// 正常
http://localhost:8080/?from=lcy

// alert
http://localhost:8080/?from=<script>alert("What are you doing?")</script>

// 非法获取cookie
http://localhost:8080/?from=<script src="http://localhost:8081/hack.js></script>

// 伪造cookie入侵
document.cookie = cookie

2、存储型-存储到DB后读取时注入

<script src="http://localhost:8081/hack.js>

XSS攻击的危害

1、获取页面数据

2、获取Cookies

3、劫持前端逻辑

4、发送请求

5、偷取用户资料

6、欺骗用户

7、偷取网站数据

8、偷取用户登录态和未公开数据

9、欺骗用户

防范手段

ejs转义

<% code %>用于执行其中javascript代码;
<%= code %>会对code进行html转义;
<%- code %>将不会进行转义;

1、HEAD 

ctx.set('X-XSS-Protection', 0) // 禁止XSS过滤

0 禁止XSS过滤。
1 启用XSS过滤(通常浏览器是默认的)。 如果检测到跨站脚本攻击,浏览器将清除页面(删除不安全的部分)。
1;mode=block 启用XSS过滤。 如果检测到攻击,浏览器将不会清除页面,而是阻止页面加载。
1; report= (Chromium only)
启用XSS过滤。 如果检测到跨站脚本攻击,浏览器将清除页面并使用CSP report-uri 指令的功能发送违规报告。

 2、CSP

内容安全策略 (CSP, Content Security Policy) 是一个附加的安全层,用于帮助检测和缓解某
些类型的攻击,包括跨站脚本 (XSS) 和数据注入等攻击。 这些攻击可用于实现从数据窃取到
网站破坏或作为恶意软件分发版本等用途。

CSP 本质上就是建立白名单,开发者明确告诉浏览器哪些外部资源可以加载和执行。我们只
需要配置规则,如何拦截是由浏览器自己实现的。我们可以通过这种方式来尽量减少 XSS 攻
击。

// 只允许加载本站资源
Content-Security-Policy: default-src 'self'
// 只允许加载 HTTPS 协议图片
Content-Security-Policy: img-src https://*
// 不允许加载任何来源框架
Content-Security-Policy: child-src 'none'

3、转义字符

function escape(str) {
    str = str.replace(/&/g, '&amp;')
    str = str.replace(/</g, '&lt;')
    str = str.replace(/>/g, '&gt;')
    str = str.replace(/"/g, '&quto;')
    str = str.replace(/'/g, '&#39;')
    str = str.replace(/`/g, '&#96;')
    str = str.replace(/\//g, '&#x2F;')
    return str
}

富文本来说,显然不能通过上面的办法来转义所有字符,因为这样会把需要的格式也过滤掉。对于这种情况,通常采用白名单过滤的办法,当然也可以通过黑名单过滤,但是考虑到需要过滤的标签和标签属性实在太多,更加推荐使用白名单的方式。

4、黑名单,白名单

const xss = require('xss')
let html = xss('<h1 id="title">XSS Demo</h1><script>alert("xss");</script>')
// -> <h1>XSS Demo</h1>&lt;script&gt;alert("xss");&lt;/script&gt;
console.log(html)

5、HttpOnly Cookie

这是预防XSS攻击窃取用户cookie最有效的防御手段。Web应 用程序在设置cookie时,将其
属性设为HttpOnly,就可以避免该网页的cookie被客户端恶意JavaScript窃取,保护用户cookie信息。

二、CSRF 

CSRF(Cross Site Request Forgery),即跨站请求伪造,是一种常见的Web攻击,它利用用户已登录的身份,在用户毫不知情的情况下,以用户的名义完成非法操作。 

i、用户已经登录了站点 A,并在本地记录了 cookie
ii、在用户没有登出站点 A 的情况下(也就是 cookie 生效的情况下),访问了恶意攻击者提供的引诱危险站点 B (B 站点要求访问站点A)。
iii、站点 A 没有做任何 CSRF 防御 

CSRF攻击的危害

1、利用用户登录态

2、用户不知情

3、完成业务请求

4、盗取用户账户金额

5、冒充用户发送不良消息

6、损害网站声誉

防御

1、禁止第三方网站带cookie-有兼容性问题

2、Referer Check - Https不发送referer

app.use(async (ctx, next) => {
    await next()
    const referer = ctx.request.header.referer
    console.log('Referer:', referer)
})

3、验证码

三、点击劫持-clickjacking

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

防御

1、X-FRAME-OPTIONS

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

该响应头有三个值可选,分别是:
        a:DENY,表示页面不允许通过 iframe 的方式展示
        b:SAMEORIGIN,表示页面可以在相同域名下通过 iframe 的方式展示
        c:ALLOW-FROM,表示页面可以在指定来源的 iframe 中展示

ctx.set('X-FRAME-OPTIONS', 'DENY')

2、JS方式

// 比较早期的一种防御手段
// 通过判断你是否是顶层的窗口,决定是否显示页面内容
// 如果是非顶层窗口,则表示页面被其他网页使用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>

四、SQL注入

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

防御

所有的查询语句建议使用数据库提供的参数化查询接口**,参数化的语句使用参数而不是将用户输入变量嵌入到 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、严格限制Web应用的数据库的操作权限**,给此用户提供仅仅能够满足其工作的最低权限,从而最大限度的减少注入攻击对数据库的危害
2、后端代码检查输入的数据是否符合预期**,严格限制变量的类型,例如使用正则表达式进行一些匹配处理。
3、对进入数据库的特殊字符(',",\,<,>,&,*,; 等)进行转义处理,或编码转换**。基本上
所有的后端语言都有对字符串进行转义处理的方法,比如 lodash 的 lodash._escapehtmlchar
库。 

五、OS命令注入

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

六、请求劫持

1、DNS劫持

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

2、HTTP劫持

运营商劫持,好像只能将HTTP升级为HTTPS,暂时没有找到其他的解决办法

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值