Web前端黑客技术②——挖掘XSS漏洞

来源:互联网 发布:淘宝宝贝分类在哪里 编辑:程序博客网 时间:2024/05/24 03:20

这篇文章只谈论反射型XSS和存储型XSS漏洞挖掘的方法。

XSS漏洞挖掘概述

一般情况下,我们利用反射型XSS漏洞的方式是基于URL的,而利用存储型XSS漏洞是基于表单提交的。

看起来两漏洞利用点大相径庭,但其实两漏洞利用方式大同小异。

反射型XSS

我们知道反射型XSS的输入点在URL上,所以首先要对URL有个基本的认识。

URL的一般形式如下:

这里写图片描述

显而易见,、我们是无法改变的(如果改变,那么就不是原始网站)。

那么对我们而言,能够控制的输入点只有、、。

此外,除了Web2.0的网站,一般不会出现在服务器端解析。

那么对我们而言,能够控制的输入点只有、。

此外,和的利用情况很类似。

在一般情况下,我们都是利用挖掘反射型XSS漏洞。

存储型XSS

与反射型XSS相比,存储型XSS漏洞挖掘的差别在于:存储型XSS一般都是基于表单的提交,然后进入服务端存储,最终在某个页面输出。

但是存储型XSS漏洞挖掘也有自己的特色,即与反射型XSS的输入输出都在一个页面相比,对于存储型XSS输出点,我们根本不是到在哪里。

一般情况下,存储型XSS表单提交之后的输出点有以下几种可能:

  • 表单提交后跳转到的页面可能是输出点。
  • 表单所在的页面可能是输出点。
  • 表单提交后不见了,整个网站的每个源文件都可能是输出点。

我们只讨论前面两种情况下的存储型XSS漏洞挖掘。

XSS漏洞挖掘步骤

无论是反射型XSS还是存储型XSS,我们都可以按照如下步骤或方法来利用挖掘XSS漏洞

步骤一 发起探子请求

在真正的payload攻击请求之前,我们发出一次无危害(不包含任何特殊符号)的探子请求,此请求不会被网站的过滤机制发现,就像一次正常的请求。

“探子”的目的有以下两个:

  • 探寻目标参数值是否会出现在响应上。如果不出现,就完全没有必要进行后续的payload请求和分析,因为这些payload请求与分析可能会进行很多次,浪费请求资源。
  • 探寻目标参数值出现在HTML的哪个部分。不同的HTML部分对待XSS的机制是不一样的,请求的payload当然也不一样。

一般情况下,我们够着的探子请求是一个8位左右的随机字符串,且不与响应的HTML中已经存在的字符串重复。

步骤二 查看源码

在我们输入了探子请求之后,我们就要思考一个问题:我们输入的探子请求输出在哪里?

这时候,我们唯一的办法就是查看网页的源代码,查找探子请求的位置。

这也是为啥我们之前构造探子请求的时候要保证其唯一性,就是为了便于我们的查找。

探子请求输出的位置可能有一下几种可能:

  • HTML标签之间。例如:<div id = "body">【输出】</ div>
  • HTML标签之内。例如:<input type = "text" value = "【输出】"></ input>
  • 成为javascript代码的值。例如:<script>a = "【输出】";</ script>
  • 成为CSS代码的值。例如:< style>body{font-size:【输出】px;}</ style>

步骤三 构造payload

这里我们假设浏览器没有任何的过滤机制。

针对步骤二的四种可能,我们可以分别构造不同的payload。

Part 1 HTML标签之间

情形一:

如果输出点位置出现在<div id = "body">【输出】</div>中,那么我们直接构造<script>alert(1)</script>提交,即能让浏览器实现弹窗。

情形二:

如果输入点出现在如下几个标签的位置:

这里写图片描述

那么,我们构造的<script>alert(1)</script>并不能让浏览器实现弹窗。

这个时候,我们构造payload的关键在于闭合标签(核心思想)

例如,我们可以构造如下的payload:</title><script>alert(1)</script>,这样,即能保证浏览器实现弹窗。

Part 2 HTML标签之内

对于输出点出现在HTML标签之内的情况:<input type = "text" value = "【输出】"></input>

我们有以下两种方法触发XSS:

  • 闭合属性。构造payload:” onmouseover=alert(1) x=”,使用on事件来触发脚本。
  • 闭合标签和属性。构造payload:"><script>alert(1)</script>,直接执行脚本。

Part 3 成为javascript代码的值

对于我们输入的请求成为javascript代码的值的情况:

<script>a = "【输出】";</script>

我们可以构造如下的payload:

</script><script>alert(1);//

其中,前面的</script>直接闭合了之前的<script>标签,后面的//是javascript的注释,保证了javascript语法的正确性。这样即能触发XSS。

Part 4 成为CSS代码的值

1 0