xssing.org跨站的艺术

2018/12/13 15:54 下午 posted in  xss跨站脚本

这个网站太棒了,强烈推荐阅读
xssing.org跨站的艺术若不能直接访问请使用科学上网工具。

什么是XSS?

概述

XSS全称跨站脚本(Cross Site Scripting),为不和层叠样式表(Cascading Style Sheets, CSS)的缩写混淆,故缩写为XSS,比较合适的方式应该叫做跨站脚本攻击。跨站点脚本(XSS)攻击是一种注射型攻击,攻击者在可信的网页中嵌入恶意代码,用户访问可信网页时触发XSS而被攻击.

攻击者通过Web应用程序发送恶意代码,一般以浏览器脚本的形式发送给不同的终端用户。当一个Web程序的用户输入点没有进行校验和编码,将很容易的导致XSS。

攻击者可以使用XSS发送恶意脚本给没有任何防备的用户。终端用户浏览器无法知道不应该信任叫嗯,而是执行了该脚本。因为它认为脚本来自可信的源,恶意脚本可以访问任何Cookies,会话令牌,或其浏览器和网站保留使用的他敏感信息。这些脚本甚至可以重写HTML页面的内容。更多的内容可以阅读本站其他内容。

详细介绍

跨站脚本攻击在以下情况出现:

  1. Web应用程序通过不可信的来源进行数据输入,最常见是的Web请求(输入,比如如GET访问某Web应用的url,通过参数提交数据,比如提交input= 标签中发生. 其他标签也可以做同样事,比如:

    <body onload=alert('test1')>
    或其他属性,如:onmouseover,onerror.onmouseover

    <b onmouseover=alert('Wufff!')>click me!</b>
    onerror

    <img src="http://url.to.file.which/not.exist" onerror=alert(document.cookie);>

    利用XSS脚本通过编码的URI方案
    如果我们需要绕过Web应用过滤器,我们可以尝试编码字符串,比如:a=A (UTF-8),在img标签中使用:

    <IMG SRC=jAvascript:alert('test2')>
    有许多不同的UTF-8编码符号可以给我们更多的可能性。

    XSS利用代码的编码
    在META标签,我们可以对我们的脚本进行base64编码,这样就不用输入alert()字符。这个方法的更多信息参考RFC 2397

    <META HTTP-EQUIV="refresh"
    CONTENT="0;url=data:text/html;base64,PHNjcmlwdD5hbGVydCgndGVzdDMnKTwvc2NyaXB0Pg">

    这些以及其他的例子可以在OWASP XSS Filter Evasion Cheat Sheet查看。这是一个真正的备用XSS攻击代码的百科

    例子

    跨站点脚本攻击可能发生在任何地方,可能是恶意用户被允许发送非规范内容到一个可信的网站给其他合法用户。最常见的例子发生在网站公告板,提供基于Web的邮件列表的功能

    例子 1

    The following JSP code segment reads an employee ID, eid, from an HTTP request and displays it to the user. 下面的JSP代码块从一个HTTP请求读取employee ID, eid,并展示给用户。

        <% String eid = request.getParameter("eid"); %> 
        ... 
        Employee ID: <%= eid %>
    

    如果eid仅包含标准字母数字文本,则此示例中的代码可正常运行。如果eid具有包含元字符或源代码的值,则代码将在Web浏览器显示HTTP响应时执行。

    最初,这似乎不是一个漏洞。毕竟,为什么有人会输入导致恶意代码在自己的计算机上运行的URL?真正的危险是攻击者会创建恶意URL,然后使用电子邮件或社交工程技巧诱使受害者访问URL的链接。当受害者点击该链接时,他们会无意中通过易受攻击的Web应用程序将恶意内容反映回自己的计算机。这种利用易受攻击的Web应用程序的机制称为反射型XSS。

    例子 2

    The following JSP code segment queries a database for an employee with a given ID and prints the corresponding employee's name.

        <%...
         Statement stmt = conn.createStatement(); 
         ResultSet rs = stmt.executeQuery("select * from emp where id="+eid); 
         if (rs != null) { 
          rs.next(); 
          String name = rs.getString("name"); 
        %> 
        Employee Name: <%= name %>
    ```
    
    以上,是首页的部分内容,首页还有很多的参考链接,这些链接都非常有价值,可是不好copy,所以请读者自行前往原网站欣赏。