`

漏洞科普:对于XSS和CSRF你究竟了解多少

阅读更多

随着Web2.0、社交网络、微博等等一系列新型的互联网产品的诞生,基于Web环境的互联网应用越来越广泛,企业信息化的过程中各种应用都架设在Web平台上,Web业务的迅速发展也引起黑客们的强烈关注,接踵而至的就是Web安全威胁的凸显。

黑客利用网站操作系统的漏洞和Web服务程序的SQL注入漏洞等得到Web服务器的控制权限,轻则篡改网页内容,重则窃取重要内部数据,更为严重的则是在网页中植入恶意代码,使得网站访问者受到侵害。

如今,Web安全成为焦点,但网站的漏洞还是频频出现,在白帽子们进行网站测试时,恐怕对于SQL注入、XSS跨站、CSRF接触最多,但对于网站的开发者们来说,对这些熟知多少?本文从开发者的角度,对于XSS和CSRF进行简要概述。

PART1  XSS跨站脚本(Cross-site scripting)

XSS成因概括 :

    XSS其实就是Html的注入问题,攻击者的输入没有经过严格的控制进入了数据库,最终显示给来访的用户,导致可以在来访用户的浏览器里以浏览用户的身份 执行Html代码,数据流程如下:攻击者的Html输入—>web程序—>进入数据库—>web程序—>用户浏览器。

检测方法:

//通常有一些方式可以测试网站是否有正确处理特殊字符:

  1. ><script>alert(document.cookie)</script>
  2. ='><script>alert(document.cookie)</script>
  3. "><script>alert(document.cookie)</script>
  4. <script>alert(document.cookie)</script>
  5. <script>alert(vulnerable)</script>
  6. %3Cscript%3Ealert('XSS')%3C/script%3E
  7. <script>alert('XSS')</script>
  8. <img src="javascript:alert('XSS')">
  9. <img src="http://xxx.com/yyy.png" onerror="alert('XSS')">
  10. <div style="height:expression(alert('XSS'),1)" />(这个仅限 IE 有效)

攻击手段和目的:

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

a. 盗用 cookie ,获取敏感信息。

b.利用植入 Flash ,通过 crossdomain 权限设置进一步获取更高权限;或者利用Java等得到类似的操作。

c.利用 iframe、frame、XMLHttpRequest或上述Flash等方式,以(被攻击)用户的身份执行一些管理动作,或执行一些一般的如发微博、加好友、发私信等操作。

d.利用可被攻击的域受到其他域信任的特点,以受信任来源的身份请求一些平时不允许的操作,如进行不当的投票活动。

e.在访问量极大的一些页面上的XSS可以攻击一些小型网站,实现DDoS攻击的效果。

漏洞的防御和利用:

避免XSS的方法之一主要是将用户所提供的内容进行过滤,许多语言都有提供对HTML的过滤:

  1. PHPhtmlentities()或是htmlspecialchars()。
  2. Pythoncgi.escape()。
  3. ASPServer.HTMLEncode()。
  4. ASP.NETServer.HtmlEncode()或功能更强的MicrosoftAnti-CrossSiteScriptingLibrary
  5. Javaxssprotect(OpenSourceLibrary)。
  6. Node.jsnode-validator

使用HTTP头指定类型:

很多时候可以使用HTTP头指定内容的类型,使得输出的内容避免被作为HTML解析。如在PHP语言中使用以下代码:

  1. header('Content-Type: text/javascript; charset=utf-8');

即可强行指定输出内容为文本/JavaScript脚本(顺便指定了内容编码),而非可以引发攻击的HTML。

PART2 CSRF:冒充用户之手

示意图:

    XSS 是实现 CSRF 的诸多途径中的一条,但绝对不是唯一的一条。一般习惯上把通过 XSS 来实现的 CSRF 称为 XSRF。

    CSRF 顾名思义,是伪造请求,冒充用户在站内的正常操作。我们知道,绝大多数网站是通过 cookie 等方式辨识用户身份(包括使用服务器端 Session 的网站,因为 Session ID 也是大多保存在 cookie 里面的),再予以授权的。所以要伪造用户的正常操作,最好的方法是通过 XSS 或链接欺骗等途径,让用户在本机(即拥有身份 cookie 的浏览器端)发起用户所不知道的请求。

    要完成一次CSRF攻击,受害者必须依次完成两个步骤:

1.登录受信任网站A,并在本地生成Cookie。
2.在不登出A的情况下,访问危险网站B。

    看到这里,你也许会说:“如果我不满足以上两个条件中的一个,我就不会受到CSRF的攻击”。是的,确实如此,但你不能保证以下情况不会发生:
1.你不能保证你登录了一个网站后,不再打开一个tab页面并访问另外的网站。
2.你不能保证你关闭浏览器了后,你本地的Cookie立刻过期,你上次的会话已经结束。(事实上,关闭浏览器不能结束一个会话,但大多数人都会错误的认为关闭浏览器就等于退出登录/结束会话了……)
3.上图中所谓的攻击网站,可能是一个存在其他漏洞的可信任的经常被人访问的网站。
    上面大概地讲了一下CSRF攻击的思想,下面我将用几个例子详细说说具体的CSRF攻击,这里我以一个银行转账的操作作为例子(仅仅是例子,真实的银行网站没这么傻:>)

示例1:
银行网站A,它以GET请求来完成银行转账的操作,如:

  1. http://www.mybank.com/Transfer.php?toBankId=11&money=1000

危险网站B,它里面有一段HTML的代码如下:

  1. <imgsrc=http://www.mybank.com/Transfer.php?toBankId=11&money=1000>

    首先,你登录了银行网站A,然后访问危险网站B,噢,这时你会发现你的银行账户少了1000块……
    为什么会这样呢?原因是银行网站A违反了HTTP规范,使用GET请求更新资源。在访问危险网站B的之前,你已经登录了银行网站A,而B中 的<img>以GET的方式请求第三方资源(这里的第三方就是指银行网站了,原本这是一个合法的请求,但这里被不法分子利用了),所以你的浏 览器会带上你的银行网站A的Cookie发出Get请求,去获取资源“http://www.mybank.com /Transfer.php?toBankId=11&money=1000”,结果银行网站服务器收到请求后,认为这是一个更新资源操作(转账 操作),所以就立刻进行转账操作……

示例2:
为了杜绝上面的问题,银行决定改用POST请求完成转账操作。
银行网站A的WEB表单如下:

  1. <formaction="Transfer.php"method="POST">
  2.     <p>ToBankId: <inputtype="text"name="toBankId"/></p>
  3.     <p>Money: <inputtype="text"name="money"/></p>
  4.     <p><inputtype="submit"value="Transfer"/></p>
  5. </form>

后台处理页面Transfer.php如下:

  1. <?php
  2.   session_start();
  3. if(isset($_REQUEST[&#039;toBankId&#039;]&& isset($_REQUEST[&#039;money&#039;]))
  4. {
  5.    buy_stocks($_REQUEST[&#039;toBankId&#039;], $_REQUEST[&#039;money&#039;]);
  6. }
  7. >

危险网站B,仍然只是包含那句HTML代码:

  1. <imgsrc=http://www.mybank.com/Transfer.php?toBankId=11&money=1000>

    和示例1中的操作一样,你首先登录了银行网站A,然后访问危险网站B,结果…..和示例1一样,你再次没了1000块~T_T,这次事故的原因是:银行后 台使用了$_REQUEST去获取请求的数据,而$_REQUEST既可以获取GET请求的数据,也可以获取POST请求的数据,这就造成了在后台处理程 序无法区分这到底是GET请求的数据还是POST请求的数据。在PHP中,可以使用$_GET和$_POST分别获取GET请求和POST请求的数据。在 JAVA中,用于获取请求数据request一样存在不能区分GET请求数据和POST数据的问题。

示例3:
    经过前面2个惨痛的教训,银行决定把获取请求数据的方法也改了,改用$_POST,只获取POST请求的数据,后台处理页面Transfer.php代码如下:

  1. <?php
  2.  session_start();
  3.  if(isset($_POST['toBankId']&& isset($_POST['money']))
  4.  {
  5.     buy_stocks($_POST['toBankId'], $_POST['money']);
  6.  }
  7. ?>

然而,危险网站B与时俱进,它改了一下代码:

  1. <html>
  2.   <head>
  3.     <scripttype="text/javascript">
  4.       function steal()
  5.       {
  6.      iframe = document.frames["steal"];
  7.       iframe.document.Submit("transfer");
  8.       }
  9.     </script>
  10.   </head>
  11.   <bodyonload="steal()">
  12.     <iframename="steal"display="none">
  13.       <formmethod="POST"name="transfer" action="http://www.myBank.com/Transfer.php">
  14.         <inputtype="hidden"name="toBankId"value="11">
  15.         <inputtype="hidden"name="money"value="1000">
  16.       </form>
  17.     </iframe>
  18.   </body>
  19. </html>

    如果用户仍是继续上面的操作,很不幸,结果将会是再次不见1000块……因为这里危险网站B暗地里发送了POST请求到银行!

    总结一下上面3个例子,CSRF主要的攻击模式基本上是以上的3种,其中以第1,2种最为严重,因为触发条件很简单,一个<img>就可以 了,而第3种比较麻烦,需要使用JavaScript,所以使用的机会会比前面的少很多,但无论是哪种情况,只要触发了CSRF攻击,后果都有可能很严 重。
    理解上面的3种攻击模式,其实可以看出,CSRF攻击是源于WEB的隐式身份验证机制!WEB的身份验证机制虽然可以保证一个请求是来自于某个用户的浏览器,但却无法保证该请求是用户批准发送的!

如何防御?
请求令牌(一种简单有效的防御方法):
首先服务器端要以某种策略生成随机字符串,作为令牌(token),保存在 Session 里。然后在发出请求的页面,把该令牌以隐藏域一类的形式,与其他信息一并发出。在接收请求的页面,把接收到的信息中的令牌与 Session 中的令牌比较,只有一致的时候才处理请求,处理完成后清理session中的值,否则返回 HTTP 403 拒绝请求或者要求用户重新登陆验证身份
令牌来防止 CSRF 有以下几点要注意:
 a.虽然请求令牌原理和验证码有相似之处,但不应该像验证码一样,全局使用一个 Session Key。因为请求令牌的方法在理论上是可破解的,破解方式是解析来源页面的文本,获取令牌内容。如果全局使用一个 Session Key,那么危险系数会上升。原则上来说,每个页面的请求令牌都应该放在独立的 Session Key 中。我们在设计服务器端的时候,可以稍加封装,编写一个令牌工具包,将页面的标识作为 Session 中保存令牌的键。

b.在 ajax 技术应用较多的场合,因为很有请求是 JavaScript 发起的,使用静态的模版输出令牌值或多或少有些不方便。但无论如何,请不要提供直接获取令牌值的 API。这么做无疑是锁上了大门,却又把钥匙放在门口,让我们的请求令牌退化为同步令牌。

c.第一点说了请求令牌理论上是可破解的,所以非常重要的场合,应该考虑使用验证码(令牌的一种升级,目前来看破解难度极大),或者要求用户再次输入密码(亚马逊、淘宝的做法)。但这两种方式用户体验都不好,所以需要产品开发者权衡。

d.无论是普通的请求令牌还是验证码,服务器端验证过一定记得销毁。忘记销毁用过的令牌是个很低级但是杀伤力很大的错误。我们学校的选课系统就有这个问 题,验证码用完并未销毁,故只要获取一次验证码图片,其中的验证码可以在多次请求中使用(只要不再次刷新验证码图片),一直用到。

如下也列出一些据说能有效防范 CSRF,其实效果甚微或甚至无效的做法:
a.通过 referer 判定来源页面:referer 是在 HTTP Request Head 里面的,也就是由请求的发送者决定的。如果我喜欢,可以给 referer 任何值。当然这个做法并不是毫无作用,起码可以防小白。但我觉得性价比不如令牌。

b.过滤所有用户发布的链接:这个是最无效的做法,因为首先攻击者不一定要从站内发起请求(上面提到过了),而且就算从站内发起请求,途径也远远不知链接 一条。比如 <img src="./create_post.php" /> 就是个不错的选择,还不需要用户去点击,只要用户的浏览器会自动加载图片,就会自动发起请求。

c.在请求发起页面用 alert 弹窗提醒用户:这个方法看上去能干扰站外通过 iframe 发起的 CSRF,但攻击者也可以考虑用 window.alert = function(){}; 把 alert 弄哑,或者干脆脱离 iframe,使用 Flash 来达到目的。

总体来说,目前防御 CSRF 的诸多方法还没几个能彻底无解的。 作为开发者,我们能做的就是尽量提高破解难度。当破解难度达到一定程度,网站就逼近于绝对安全的位置了。

 

更多请支持:http://www.webyang.net/Html/web/article_206.html

1
0
分享到:
评论

相关推荐

    router_xss_csrf:具有XSS和CSRF的安全路由器

    具有XSS和CSRF的安全路由器 下载文件“ .htaccess”,并将其放置在应用程序的根目录下。 通常,这是一个名为“ htdocs”或“ www”的文件夹。 下载文件“ router.php”,并将其放置在应用程序的根目录下。 通常,...

    xss+csrf+html练习源码.rar_XSS_csrf_csrf源码_xss源码_xss练习源码

    这个“xss+csrf+html练习源码.rar”文件提供了针对这些漏洞的实战练习,帮助安全研究人员或开发者加深对这些威胁的理解和防御能力。 XSS攻击主要分为反射型、存储型和DOM型三种类型。反射型XSS发生在用户点击链接...

    使用Filter针对Xss攻击,sql注入,服务器访问白名单,以及csrf进行安全校验

    主要使用Filter针对Xss攻击,sql注入,服务器访问白名单,以及csrf进行安全校验 1,主要实现的是三大块功能:Xss攻击,sql注入,服务器白名单,以及csrf 2,此Filter为真实项目部署,在XssHttpServletRequestWrapper...

    跨站攻击(XSS+CSRF).docx

    2. 了解Impossible等级的XSS攻击机制和防御方法。 3. 从攻击者和受害者角度理解CSRF攻击,实施Low、Medium、High等级的CSRF攻击。 4. 学习并实践CSRF的修复措施,如使用CSRF Token等。 5. 撰写实验报告,注重规范性...

    XSS漏洞挖掘与安全防护.pdf

    XSS(Cross Site Scripting,跨站脚本攻击)是一种常见...在本议题中,XSS漏洞的深入浅出介绍将围绕形成机制、攻击手段和防御策略等方面展开,强调开发过程中如何避免和减少XSS漏洞的风险,保障Web应用的安全稳定运行。

    hucart-含有CSRF漏洞的源码.zip

    CSRF(Cross-Site Request ...总之,理解和掌握CSRF漏洞对于任何Web开发者来说都至关重要,因为这直接影响到用户数据的安全和应用的可靠性。在日常开发中,应时刻保持警惕,遵循最佳安全实践,以防止此类攻击的发生。

    XSS跨站脚本攻击漏洞修复方法

    **XSS跨站脚本攻击漏洞修复方法** XSS(Cross-Site Scripting)跨站脚本攻击是一种常见的网络安全威胁,它允许攻击者在用户的浏览器上执行恶意代码,从而窃取用户敏感信息、操纵用户行为或者对网站进行破坏。本文将...

    SQL+XSS漏洞修复方案

    SQL注入和跨站脚本(XSS)是两种常见的网络安全漏洞,它们对网站的数据安全性和用户隐私构成严重威胁。在本文中,我们将深入探讨这两种漏洞的原理、危害以及如何通过核心代码修复这些问题。 首先,SQL注入是攻击者...

    自动化检测XSS漏洞插件

    自动化检测XSS漏洞插件,希望对大家使用有帮助,一起进步,一起分享

    XSS漏洞扫描 XSS漏洞扫描

    XSS漏洞分为三种类型:反射型XSS、存储型XSS和DOM型XSS,每种都有其独特的攻击方式和防范策略。 1. 反射型XSS(Non-Persistent XSS): 这是最常见的XSS类型,通常发生在URL参数中。攻击者通过构造带有恶意脚本的...

    Web高级知识-跨域&XSS;&CSRF;解决方案

    【HTTP协议与TCP/IP协议的关系】HTTP协议是...同时,掌握跨域、XSS和CSRF的防范策略,是保障Web应用程序安全的基础。在实际开发中,应根据应用场景选择合适的连接方式,并严格实施安全措施,保护用户数据和系统安全。

    xss漏洞讲解.pdf

    了解这些基础知识对于理解XSS攻击原理和实施防护措施很有帮助。 9. 法律责任:文件最后提到了违反网络安全法的相关法律后果,强调了个人信息保护的重要性。这提醒安全人员在进行安全测试和防护时,必须在法律框架内...

    Java Web应用安全防护:抵御CSRF与XSS攻击的策略

    跨站请求伪造(CSRF)和跨站脚本(XSS)是两种常见的网络攻击方式,它们可以对用户的安全和隐私造成严重威胁。本文将详细探讨CSRF和XSS攻击的原理、特点以及在Java Web应用中的防护策略。 CSRF和XSS攻击是Web应用...

    Web应用安全:简单XSS测试脚本(实验).docx

    本实验旨在帮助你了解XSS的基本知识、操作方法以及攻击原理。 ### 一、XSS攻击基础知识 1. **类型**: - 反射型XSS:攻击者的恶意脚本通过URL参数传递,当用户点击链接或者提交包含恶意脚本的表单时,脚本被执行...

    XSS漏洞攻击与防护源代码

    XSS(Cross-site scripting)是一种常见的网络安全漏洞,它允许攻击者在受害者的浏览器上执行恶意脚本。这种攻击通常发生在Web应用中,攻击者通过注入恶意脚本到网页上,当用户浏览这些被篡改的页面时,恶意脚本会在...

    预防XSS攻击和SQL注入XssFilter

    (10)结合其他漏洞,如CSRF漏洞,实施进一步作恶; (11)提升用户权限,包括进一步渗透网站; (12)传播跨站脚本蠕虫等; 三、过滤器配置 web.xml配置 XssFilter com.xxx.Filter.XssFilter XssFilter...

Global site tag (gtag.js) - Google Analytics