简述:

XSS,跨站脚本攻击(Cross Site Scripting)攻击通常指的是通过利用网页开发时留下的漏洞,通过巧妙的方法注入恶意指令代码到网页,使用户加载并执行攻击者恶意制造的网页程序。这些恶意网页程序通常是JavaScript,但实际上也可以包括Java,VBScript,ActiveX,Flash或者甚至是普通的HTML。攻击成功后,攻击者可能得到更高的权限(如执行一些操作)、私密网页内容、会话和cookie等各种内容。

分类:

  1. 储存型:

    持久型跨站脚本(Persistent Cross-Site Scripting)也等同于存储型跨站脚本(Stored Cross-Site Scripting)。
    此类 XSS 不需要用户单击特定 URL 就能执行跨站脚本,攻击者事先将恶意代码上传或储存到漏洞服务器中,只要受害者浏览包含此恶意代码的页面就会执行恶意代码。持久型 XSS 一般出现在网站留言、评论、博客日志等交互处,恶意脚本存储到客户端或者服务端的数据库中。

  2. 反射型:

    反射型跨站脚本(Reflected Cross-Site Scripting)是最常见,也是使用最广的一种,可将恶意脚本附加到 URL 地址的参数中。
    反射型 XSS 的利用一般是攻击者通过特定手法(如电子邮件),诱使用户去访问一个包含恶意代码的 URL,当受害者点击这些专门设计的链接的时候,恶意代码会直接在受害者主机上的浏览器执行。此类 XSS 通常出现在网站的搜索栏、用户登录口等地方,常用来窃取客户端 Cookies 或进行钓鱼欺骗。

  3. DOM:

    传统的 XSS 漏洞一般出现在服务器端代码中,而 DOM-Based XSS 是基于 DOM 文档对象模型的一种漏洞,所以,受客户端浏览器的脚本代码所影响。客户端 JavaScript 可以访问浏览器的 DOM 文本对象模型,因此能够决定用于加载当前页面的 URL。换句话说,客户端的脚本程序可以通过 DOM 动态地检查和修改页面内容,它不依赖于服务器端的数据,而从客户端获得 DOM 中的数据(如从 URL 中提取数据)并在本地执行。另一方面,浏览器用户可以操纵 DOM 中的一些对象,例如 URL、location 等。用户在客户端输入的数据如果包含了恶意 JavaScript 脚本,而这些脚本没有经过适当的过滤和消毒,那么应用程序就可能受到基于 DOM 的 XSS 攻击。

    • 下面简单介绍下DOM

      DOM ,Document Object Model(文档对象模型),是 W3C(万维网联盟)的标准。

      DOM 定义了访问 HTML 和 XML 文档的标准:

      “W3C 文档对象模型 (DOM) 是中立于平台和语言的接口,它允许程序和脚本动态地访问和更新文档的内容、结构和样式。”

      W3C DOM 标准被分为 3 个不同的部分:

      • 核心 DOM - 针对任何结构化文档的标准模型
      • XML DOM - 针对 XML 文档的标准模型
      • HTML DOM - 针对 HTML 文档的标准模型

      HTML DOM节点树实例

实验过程:

反射型xss(get)

直接在输入框中输入xss代码,发现返回数据为空,且输入长度被限制。

1
<script>alert(1)</script>  用以测试的xss代码,功能为弹出警告弹窗

在前端修改限制为100,再将代码输入提交,即可触发弹窗。

反射型xss(post)

根据提示内容,使用admin/123456登录。本题不存在前端输入长度限制,直接输入代码即可。

储存型xss

直接将代码输入提交即可。不同于反射型,在我们注入的代码存在的情况下,用户只要刷新一次网页,注入代码就会被执行一次。

DOM型xss

在源代码中查看题目关键代码:

1
2
3
4
5
6
7
8
9
10
11
<script>
function domxss(){
var str = document.getElementById("text").value;
document.getElementById("dom").innerHTML = "<a href='"+str+"'>what do you see?</a>";
}
//试试:'><img src="#" onmouseover="alert('xss')">
//试试:' onclick="alert('xss')">,闭合掉就行
</script>
<input id="text" name="text" type="text" value="">
<input id="button" type="button" value="click me!" onclick="domxss()">
//根据代码提示,闭合<a href='"+str+"'>即可

DOM型xss-x

本题关键代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<script>
function domxss(){
var str = window.location.search;
var txss = decodeURIComponent(str.split("text=")[1]);
var xss = txss.replace(/\+/g,' ');
// alert(xss);

document.getElementById("dom").innerHTML = "<a href='"+xss+"'>就让往事都随风,都随风吧</a>";
}
//试试:'><img src="#" onmouseover="alert('xss')">
//试试:' onclick="alert('xss')">,闭合掉就行
</script>
<form method="get">
<input id="text" name="text" type="text" value="">
<input id="submit" type="submit" value="请说出你的伤心往事">
</form>

和上题基本一样,只是增加了一个过滤

xss之盲打

根据提示,要求登录后台。

1
admin/123456

登录后台后才可以发现提交的信息。那么xss或许可以在管理员页面被触发。在初始页面提交代码后再次登录,弹窗被触发。

xss之过滤

尝试直接触发弹窗,发现可能过滤了本标签

****

使用img标签,成功触发

payload:

1
2
<img src=1 onclick=alert(1);>  这里的onclick代表事件需要鼠标单击才能触发
另,使用大写也可绕过该过滤