【网络安全】PHP session反序列化漏洞原理解析

XSS

跨⽹站指令码(英语:Cross-site scripting,通常简称为:XSS)是⼀种⽹站应⽤程 式的安全漏洞攻击,是代码注⼊的⼀种。它允许恶意使⽤者将程式码注⼊到⽹⻚上, 其他使⽤者在观看⽹⻚时就会受到影响。这类攻击通常包含了 HTML 以及使⽤者端 脚本语⾔。 XSS 分为三种:反射型,存储型和 DOM-based

如何攻击

XSS 通过修改 HTML 节点或者执⾏ JS 代码来攻击⽹站。例如通过 URL 获取某些参数

<<img src="http://www.domain.com?name=<script>alert(1)</script> --" style="margin: auto" />
<div>{{name}}</div> 

上述 URL 输⼊可能会将 HTML 改为<div><script>alert(1)</script></div> ,这样⻚ ⾯中就凭空多了⼀段可执⾏脚本。这种攻击类型是反射型攻击,也可以说是 DOM-based 攻 击。也有另⼀种场景,⽐如写了⼀篇包含攻击代码 的⽂章,那么 可能浏览⽂章的⽤户都会被攻击到。这种攻击类型是存储型攻击,也可以说是 DOM-based 攻击,并且这种攻击打击⾯更⼴。

如何防御

最普遍的做法是转义输⼊输出的内容,对于引号,尖括号,斜杠进⾏转义

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
} 

通过转义可以将攻击代码<script>alert(1)</script>变成

// -> &lt;script&gt;alert(1)&lt;&#x2F;script&gt;
escape('<script>alert(1)</script>') 

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

var xss = require("xss");
var 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); 

CSP

内容安全策略 (CSP) 是⼀个额外的安全层,⽤于检测并削弱某些特定类型的攻击,包括跨站脚本 (XSS) 和数据注⼊攻击等。⽆论是数据盗取、⽹站内容污染还是散发恶意软件,这些攻击都是主要的⼿段。

我们可以通过 CSP 来尽量减少 XSS 攻击。CSP 本质上也是建⽴⽩名单,规定了浏览器只能 够执⾏特定来源的代码。

通常可以通过 HTTP Header 中的 Content-Security-Policy 来开启 CSP

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

CSRF

跨站请求伪造(英语:Cross-site request forgery),也被称为 one-click attack 或 者 session riding,通常缩写为 CSRF 或者 XSRF, 是⼀种挟制⽤户在当前已登录 的Web应⽤程序上执⾏⾮本意的操作的攻击⽅法。[1] 跟跨網站指令碼(XSS)相 ⽐,XSS 利⽤的是⽤户对指定⽹站的信任,CSRF 利⽤的是⽹站对⽤户⽹⻚浏览器 的信任。

简单点说,CSRF 就是利⽤⽤户的登录态发起恶意请求。

如何攻击

假设⽹站中有⼀个通过 Get 请求提交⽤户评论的接⼝,那么攻击者就可以在钓⻥⽹站中加⼊ ⼀个图⽚,图⽚的地址就是评论接⼝

<img src="http://www.domain.com/xxx?comment='attack'"/>

如果接⼝是 Post 提交的,就相对麻烦点,需要⽤表单来提交接⼝

<form action="http://www.domain.com/xxx" id="CSRF" method="post">
 <input name="comment" value="attack" type="hidden">
</form> 

如何防御

防范 CSRF 可以遵循以下⼏种规则:

1.Get 请求不对数据进⾏修改
2.不让第三⽅⽹站访问到⽤户 Cookie
3.阻⽌第三⽅⽹站请求接⼝
4.请求时附带验证信息,⽐如验证码或者 token

SameSite

可以对 Cookie 设置 SameSite 属性。该属性设置 Cookie 不随着跨域请求发送,该属性可以 很⼤程度减少 CSRF 的攻击,但是该属性⽬前并不是所有浏览器都兼容。

验证 Referer

对于需要防范 CSRF 的请求,我们可以通过验证 Referer 来判断该请求是否为第三⽅⽹站发 起的。

Token

服务器下发⼀个随机 Token(算法不能复杂),每次发起请求时将 Token 携带上,服务器验 证 Token 是否有效。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值