![CTF实战:技术、解题与进阶](https://wfqqreader-1252317822.image.myqcloud.com/cover/482/47755482/b_47755482.jpg)
1.2.2 XSS Bypass技巧
1.判断输出点及其上下文
尝试插入正常的字符串如“xsstest”“111111”,确定字符串输出的位置。
当输出位置在标签的属性里时,可以看到输出位置位于input标签的value属性处,输出内容被引号包围,如图1-57所示。
![](https://epubservercos.yuewen.com/2B7BD9/27167019607668606/epubprivate/OEBPS/Images/44_03.jpg?sign=1739366712-W3fFry6GvIzpVS6cFXr2gczdnVJJwW9V-0-7dab30285b8576f6534e16fa5c987529)
图1-57 输出内容被引号包围
闭合value属性,写入一个新的属性并构造XSS Payload,比如我们可以通过HTML的事件对象来构造。一般在<、>被过滤时使用这种方法。
利用事件对象onclick语法执行JavaScript语句,当用户点击对象时调用其事件句柄。在浏览器中输入Payload:?name="onclick="alert(xss);,执行结果如图1-58所示。
![](https://epubservercos.yuewen.com/2B7BD9/27167019607668606/epubprivate/OEBPS/Images/45_01.jpg?sign=1739366712-YqsQFPpCXSTShOaDq7cGH9cL2vIb6BAJ-0-fb0c99179f038fb09b1abdcc8219900a)
图1-58 onclick弹框
这里列出一些常用的事件对象,如表1-2所示。
表1-2 常用的事件对象
![](https://epubservercos.yuewen.com/2B7BD9/27167019607668606/epubprivate/OEBPS/Images/45_02.jpg?sign=1739366712-z6GSu8nP4ACsZ3uzYKItyfNhtXOthCuD-0-8047cdc111b503dde462adb676331ecb)
闭合input标签,直接在页面里构造XSS Payload。这时候构造Payload的方法就很多了,部分代码如下。
![](https://epubservercos.yuewen.com/2B7BD9/27167019607668606/epubprivate/OEBPS/Images/46_01.jpg?sign=1739366712-pUJwO7rXRk1LgEf7t7p6PSmh6yjDTA2B-0-2b2c0a1c9fcac2bb898b52dff6c47498)
执行结果如图1-59所示。
![](https://epubservercos.yuewen.com/2B7BD9/27167019607668606/epubprivate/OEBPS/Images/46_02.jpg?sign=1739366712-MKn70HrJmAND5aqDrSRBT4XR8LxlSfEa-0-9d6986f3b4a45e1ae8b58c0933376e15)
图1-59 闭合标签
输出位置在<script>标签的情况还是比较常见的。举个例子,我们输入的name字段会被拼接到<script>标签内,并且被一个函数的"和{}包裹,代码如下。
![](https://epubservercos.yuewen.com/2B7BD9/27167019607668606/epubprivate/OEBPS/Images/46_03.jpg?sign=1739366712-uhyQ72NLSEZZ79sPewySje13U8TNui3U-0-206dab942ca693d6f722e8ddbf9fd85f)
输入?name=1";}alert('xss');{"1,可以闭合"和{},执行结果如图1-60所示。
![](https://epubservercos.yuewen.com/2B7BD9/27167019607668606/epubprivate/OEBPS/Images/46_04.jpg?sign=1739366712-CvSMU8DREQU5zIZmPAhEeqWjxmiRvB27-0-fd277ceb7a4c2cb165ed611dd4498ba7)
图1-60 绕过<script>标签
因为输出位置已经被script标签包裹,所以我们的输入会被当成JavaScript代码执行,开发者在做XSS防护的时候很容易忽略这一点。
将用户输入的内容直接输出在页面上,这种没有上下文的情况也比较常见,因为没有上下文干扰,所以我们可以直接写Payload。
2.构造Payload
下面介绍XSS靶场Prompt(1) to win中3个简单的关卡。Prompt(1) to win的最终目标是在页面上执行Prompt(1)。输出点位于input标签的value属性中,两边被"符号包裹,如图1-61所示。
![](https://epubservercos.yuewen.com/2B7BD9/27167019607668606/epubprivate/OEBPS/Images/47_01.jpg?sign=1739366712-aRcSFU8QzCMGEvaYYch7TedYHlpLFaYm-0-6a47eb7fda5bc3521f0510d2cf9278c5)
图1-61 定位输出点
将input标签闭合,再写入prompt标签。输入"><script>prompt(1);</script>,执行结果如图1-62所示。
![](https://epubservercos.yuewen.com/2B7BD9/27167019607668606/epubprivate/OEBPS/Images/47_02.jpg?sign=1739366712-uE7dNmJc0nDLGYrRSEdDoD7ee83ctuz4-0-3fe8cabedcecd8ac07c49a345dedbc63)
图1-62 执行成功
再来看一个例子,输出点位于article标签内,并且用正则表达式过滤了<内容>的标签格式,如图1-63所示。
![](https://epubservercos.yuewen.com/2B7BD9/27167019607668606/epubprivate/OEBPS/Images/48_01.jpg?sign=1739366712-uBSYWrKCNLe0EWq6NQY5aosxAs24hJvC-0-1cad8544461ad679b070ffb326161fea)
图1-63 正则过滤
正则规则分析如图1-64所示。
![](https://epubservercos.yuewen.com/2B7BD9/27167019607668606/epubprivate/OEBPS/Images/48_02.jpg?sign=1739366712-0F4Xphjxy3pkfScXWRkY18CAo8Jwnu5W-0-065f441beae9e38e907bf7b4267b9348)
图1-64 正则规则分析
我们直接利用<img src=x onerror="prompt(1)",不输入最后一个">",浏览器会自动往后寻找">"帮我们闭合img标签,如图1-65所示。
![](https://epubservercos.yuewen.com/2B7BD9/27167019607668606/epubprivate/OEBPS/Images/48_03.jpg?sign=1739366712-m7tBUfz23Dt7rRp2OUgYt0fd0s7T6brK-0-50c3f9982cc64a5bddd8e40d1dfe5cc4)
图1-65 自动闭合标签
接着进行下一关,过滤了=(,输出位置没有任何干扰,直接输出在页面上,如图1-66所示。
![](https://epubservercos.yuewen.com/2B7BD9/27167019607668606/epubprivate/OEBPS/Images/49_01.jpg?sign=1739366712-V030mqC0VpHvKnrAqFGgsMwO9IkamGRY-0-658418df3934bd60a4df8c2e780719b2)
图1-66 过滤特殊符号
JavaScript里某些函数是支持用``代替()的,除了prompt()函数不支持。SVG标签会将XML实体解析后加入标签,我们可以利用其会解析编码的特性绕过一些符号的过滤,代码如下。
![](https://epubservercos.yuewen.com/2B7BD9/27167019607668606/epubprivate/OEBPS/Images/49_02.jpg?sign=1739366712-HffybBbzjlSyEqFM2xpnxB8ZG9Pk6BKO-0-740b9ed7ba14f81e4c51bea352cba3c7)
或者利用eval函数。在JavaScript里,eval函数能够接受十六进制的字符串。
![](https://epubservercos.yuewen.com/2B7BD9/27167019607668606/epubprivate/OEBPS/Images/49_03.jpg?sign=1739366712-5DAzErMdX09Sti9N1cxmHWRkr7RsPm1t-0-3807d706e2c7a45b0d0c0fde5c409c2b)
执行结果如图1-67所示。
![](https://epubservercos.yuewen.com/2B7BD9/27167019607668606/epubprivate/OEBPS/Images/49_04.jpg?sign=1739366712-n0mZKL3Y0wHLPUM9AInSxCAr6S2A2pMu-0-379e89098cf2b76cb7186dab29998cce)
图1-67 成功绕过特殊符号