web安全梳理

352 阅读4分钟

XSS(跨网站指令码 Cross-site scription)

概述

利用网页开发时留下的漏洞,通过巧妙的方法注入恶意指令到网页,使用户加载并执行攻击装恶意制造的网页程序;攻击成功后,可能得到更高的权限、私密网页内容、会话和cookie等各种内容

攻击方式

  • 反射型:攻击者构成一个带有恶意代码的url链接诱导正常用户点击,服务器接收到这个url对应的请求读取出其中的参数然后没有做过滤就凭借到html页面发送给浏览器,浏览器解析。
  • 存储型:攻击者将带有恶意代码的内容发送给服务器,服务器没做任何过滤将数据存储到数据库中,下次再请求这个页面的时候服务器直接从数据库取出相关内容拼接到html上面,浏览器解析。
  • dom型:dom型xss工具是js获取到攻击者输入的内容并插入到html中。

分析

方式:通过注入恶意内容进行攻击 目的:获取用户隐私内容或者执行恶意操作

案例

一、通过url注入

http://test.com/static/shareLink/index.html?shareUserName=<script>alert(document.cookie)</script>
<html>
<head>
<script>
let $referer = document.querySelectorAll('.referer');
referer.innerHtml = shareUserName;
</script>
</head>
<body>
    <p>
        <span class='referer'></span>分享给你
    </p>
</body>
</html>

二、通过npm包注入 例如:《高达 800 万次下载量的 npm 包被黑客篡改了代码,你的设备或正成为挖矿机》;

event-stream,是一个用于处理 Node.js 流数据的 JavaScript npm 包, event-stream 突然被发现包含一个名为 flatmap-stream 的依赖项,而这个依赖项被植入了窃取比特币的后门,这意味着使用到该模块的开发者们,你们的设备或许早已在自己不知情的情况下变成了挖矿机。

三、通过表单注入 通过表单提交永久注入,在其他用户,在加载到该内容直接执行了恶意脚本

//Form
<input userName value="<script>alert(documemt.cookie)</sctipt>" />

//Html
<p>《安全防御》---作者:<script>alert(documemt.cookie)</sctipt></p>

四、SQL注入 当系统的用户登录校验是通过“SELECT * FROM accounts WHERE username='admin' and pasword='password' ”这类显式的sql进行校验;

//用户名
<input name="username" />

//密码
<input name="psw" type="password" />

当用户在以上 username 输入框输入 "admin' and 1=1 /*" , 系统的校验SQL 语句是这样的

SELECT * FROM accounts WHERE username='admin' and 1=1 /*' and password = ''

因为 /*后的语句直接被当成注释忽略,用户直接登录成功了

防御手段

一、特殊符号转义

const escapeHTML = (str)=>{
    return str.replace(/[&<>'"]/g,(tag)=>(
        {
            '&': '&amp;',
            '<': '&lt;',
            '>': '&gt;',
            "'": '&#39;',
            '"': '&quot;'
        }[tag] || tag
    ));
}

二、在引用第三方包之前,提前评估风险,尽量使用比较多人使用的npm包,npm包的版本加上lock

三、在設計應用程式時,完全使用參數化查詢(Parameterized Query)來設計資料存取功能

set @userName := xxx;
set @passowrd := xxx; 

UPDATE myTable SET c1 = @c1, c2 = @c2, c3 = @c3 WHERE c4 = @c4

SELECT * FROM accounts WHERE username=@userName and password = @passowrd

四、通过站点资源的http respone header 的 Content-Security-Policy控制指定页面加载指定资源

CSRF(跨站请求伪造)

概述

跨站请求伪造是一种冒充受信任用户,向服务器发送非预期请求的攻击方式。例如这些非预期请求可能是通过跳转链接后的url中加入恶意参数来完成。

攻击方式

  • 利用保存在cookie的用户凭证会在set-cookie的host发送请求的时候带上的特点,在用户不知情的情况下去发送恶意操作的请求。

案例

用户登录了论坛A站点,发布了帖子,接着用户访问了恶意攻击站点B,B站点有如下内容

<img src="http://www.a.com/delete?id=112312313" />

在用户访问后,B站点在用户不知情的情况下,删除了用户在A站点的某个帖子

防御手段

一、校验referer 浏览器发送请求时,request header 里面有一个referer的属性,标识请求源站点,后端可以校验该属性,辨别发请求的站点是否是可信任站点。

二、通过token校验身份 用户在登录后,由服务端返回一个token给到用户,后续的登录验证,通过token来验证,用户在提交请求的时候把token从requestData上带上,或者从requestHeader带上。

三、cookie设置 SameSite。

CSP(内容安全策略)

概述

内容安全策略是一个额外的安全层,用于检测并削弱某些特定类型的攻击,包括跨站脚本XSS和数据注入攻击等。

开启方式

一、通过response header 设置 ==Content-Security-Policy== 二、通过==<meta />== 指定

Content-Security-Policy

http响应头,允许站点管理者控制用户代理能够为指定的页面加载哪些资源,这可以防止XSS攻击。

设置方式

Content-Security-Policy:<policy-directive>(directive value); <policy-directive>(directive value);

关于directive描述,具体见MDN文档

案例

禁止不安全的内容,仅允许通过https加载资源

//header
Content-Security-Policy: defalut-src https:

//meta tag
<meta http-equiv="Content-Security-Policy" content="default-src https:">
相关QA

https站点通过iframe加载http站点,提示违反内容安全策略

参考链接

github.com/YvetteLau/S…