Fork me on GitHub

浅谈网络安全--xss、csrf、csp

浅谈网络安全–xss、csrf、csp

一、XSS

概念

跨网站指令码(英语:Cross-site scripting,通常简称为:XSS)是一种网站应用程式的安全漏洞攻击,是代码注入的一种。它允许恶意使用者将程式码注入到网页上,其他使用者在观看网页时就会受到影响。这类攻击通常包含了HTML以及使用者端脚本语言。

举例

我们知道留言板通常的任务就是把用户留言的内容展示出来。正常情况下,用户的留言都是正常的语言文字,留言板显示的内容也就没毛病。然而这个时候如果有人不按套路出牌,在留言内容中丢进去一行:

1
<script>alert("hey!you are attacked")</script>

那么留言板界面的网页代码就会变成形如以下:

1
2
3
4
5
6
7
8
9
10
<html>
<head>
<title>留言板</title>
</head>
<body>
<div id="board">
<script>alert("hey!you are attacked")</script>
</div>
</body>
</html>

那么别的用户加载到留言板的时候,就会出现这个弹出框;

其他可以干的事情

攻击者当然不会仅仅弹出一个alert框,既然可以插入脚本,那么也可以做一些其他的事情,例如:

1、窃取网页浏览中的cookie值,为接下来的CSRF做准备
2、劫持流量实现恶意跳转
3、注入脚本获得其他信息

如何绕过一般网站的过滤规则

实际应用中web程序往往会通过一些过滤规则来组织代有恶意代码的用户输入被显示,以下是一些常用的xss攻击绕过过滤的一些方法:

1、大小写绕过

1
http://192.168.1.102/xss/example2.php?name=<sCript>alert("hey!")</scRipt>

2、利用过滤后返回语句再次构成攻击语句来绕过

1
http://192.168.1.102/xss/example3.php?name=<sCri<script>pt>alert("hey!")</scRi</script>pt>

发现问题了吧,这个利用原理在于只过滤了一个script标签。
3、并不是只有script标签才可以插入代码

1
http://192.168.1.102/xss/example4.php?name=<img src='w.123' onerror='alert("hey!")'>

其他绕过方式可以参考知乎用户Snake专栏文章;

防范手段

1、既然是代码注入攻击,那我们可以对敏感字符做转义,如下:

1
2
3
4
5
6
7
8
9
10
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
}

2、CSP(接下来会谈到)

3、过滤诸如<script><img><a> 标签

3、为防止cookie盗用,我们还可以在Http响应头设置HttpOnly

二、CSP

上文提到了可以用CSP来防止XSS攻击,那CSP到底是什么呢?

概念

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

举例

前段时间王二想在知乎控制台下插入一段脚本,如下:

Alt text

则会提示报错,而在有些网站(百度,Google)不会报错;

这是因为在知乎遵循了CSP,在网站的http头部定义了 Content-Security-Policy

Alt text

CSP 本质上是建立白名单,规定了浏览器只能够执行特定来源的代码;那么即使发生了xss攻击,也不会加载来源不明的第三方脚本;

三、CSRF

概念

跨站请求伪造(英语:Cross-site request forgery),也被称为 one-click attack 或者 session riding,通常缩写为 CSRF 或者 XSRF, 是一种挟制用户在当前已登录的Web应用程序上执行非本意的操作的攻击方法。跟跨网站指令码(XSS)相比,XSS 利用的是用户对指定网站的信任,CSRF 利用的是网站对用户网页浏览器的信任。

举例

1、同一个浏览器下

假如一家银行用以执行转帐操作的URL地址如下:

1
http://www.examplebank.com/withdraw?account=AccoutName&amount=1000&for=PayeeName

那么,一个恶意攻击者可以在另一个网站上放置如下代码:

1
<img src="http://www.examplebank.com/withdraw?account=Alice&amount=1000&for=Badman">

如果有账户名为Alice的用户访问了恶意站点,而她之前刚访问过银行不久,登录信息尚未过期,那么她就会损失1000资金。

2、结合xss使用

上文说了xss可以结合csrf使用;

在通过xss获得目标用户的cookie后,打开目标网站的登录界面,调出Chrome控制台的Application面板,调至cookie选项卡:

Alt text

再把目标用户的cookie填进去,再把过期时间调长一些,

完成之后再次刷新页面,发现已经不是之前的登录界面了,而是登录后的界面。至此,一个从cookie窃取到利用的过程就已完成。

防范手段

对于上面说的第一个例子:

1、检查Referer字段:HTTP头中有一个Referer字段,这个字段用以标明请求来源于哪个地址。在处理敏感数据请求时,通常来说,Referer字段应和请求的地址位于同一域名下。
2、添加校验token

对于上面说的第二个例子,则做好防止xss攻击的相应措施。

参考文章:

知乎用户Snake专栏文章

wikiwand xss

wikiwand csrf

InterviewMap

‘Coocier’的开发小记

-------------本文结束感谢您的阅读-------------