![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=1739227900-QlAJacTZYF2HB3uA9n9Jon2khEa5rEi8-0-1fe2b8a1a7c6e64059dc277956b19118)
图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=1739227900-YZLp9yBvZkjwvq2U01BNixfVoWGALjHT-0-95f8f6e7663499bf65923caaa09b4754)
图1-58 onclick弹框
这里列出一些常用的事件对象,如表1-2所示。
表1-2 常用的事件对象
![](https://epubservercos.yuewen.com/2B7BD9/27167019607668606/epubprivate/OEBPS/Images/45_02.jpg?sign=1739227900-SVXFyNgbegUZuvMT9qU2zoED02nOjeBz-0-42ea5070204a6b7b2275226cbf8331a8)
闭合input标签,直接在页面里构造XSS Payload。这时候构造Payload的方法就很多了,部分代码如下。
![](https://epubservercos.yuewen.com/2B7BD9/27167019607668606/epubprivate/OEBPS/Images/46_01.jpg?sign=1739227900-S4Z1wBGVBN1hlOb5tz51MNtMILNySxjR-0-98ad4c7cb46a04572a835c75c0551bd5)
执行结果如图1-59所示。
![](https://epubservercos.yuewen.com/2B7BD9/27167019607668606/epubprivate/OEBPS/Images/46_02.jpg?sign=1739227900-9cwgIvmS0eCWr4gNHHol6Ap3jXRyfTtC-0-4e0026807de958d4bb654f404a98a17d)
图1-59 闭合标签
输出位置在<script>标签的情况还是比较常见的。举个例子,我们输入的name字段会被拼接到<script>标签内,并且被一个函数的"和{}包裹,代码如下。
![](https://epubservercos.yuewen.com/2B7BD9/27167019607668606/epubprivate/OEBPS/Images/46_03.jpg?sign=1739227900-Jbf40rgiFQuarvFAmxaWT0EpibLOFGST-0-df67aa64c05b5af6b333bbf63eaa81ee)
输入?name=1";}alert('xss');{"1,可以闭合"和{},执行结果如图1-60所示。
![](https://epubservercos.yuewen.com/2B7BD9/27167019607668606/epubprivate/OEBPS/Images/46_04.jpg?sign=1739227900-9aHPjHzpKCJaQBfbBxz9yJO4xhv2zWhG-0-fe95849abc99d754bc213e26c6ab7b7c)
图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=1739227900-4HyGm4yksev0zlwbT2NTCU05luzjbGtD-0-ccda2da4db504e4fcc8c9a620bb7c6ab)
图1-61 定位输出点
将input标签闭合,再写入prompt标签。输入"><script>prompt(1);</script>,执行结果如图1-62所示。
![](https://epubservercos.yuewen.com/2B7BD9/27167019607668606/epubprivate/OEBPS/Images/47_02.jpg?sign=1739227900-hi8HhHl4bebovt9sfTNm1eha3ouS2IL4-0-72aef084bd2b57cffb825e59edd4a906)
图1-62 执行成功
再来看一个例子,输出点位于article标签内,并且用正则表达式过滤了<内容>的标签格式,如图1-63所示。
![](https://epubservercos.yuewen.com/2B7BD9/27167019607668606/epubprivate/OEBPS/Images/48_01.jpg?sign=1739227900-w2Z7Bu64c3MHkQXNyt5PeZYor2voCGUC-0-fa0b00d473f5eb6cc05f5eab58a80e95)
图1-63 正则过滤
正则规则分析如图1-64所示。
![](https://epubservercos.yuewen.com/2B7BD9/27167019607668606/epubprivate/OEBPS/Images/48_02.jpg?sign=1739227900-gS6jvBYDMG2e6qWiQq35WsSnMJ3sg8jC-0-08721b5199be16e43d95f3ce4c8814fd)
图1-64 正则规则分析
我们直接利用<img src=x onerror="prompt(1)",不输入最后一个">",浏览器会自动往后寻找">"帮我们闭合img标签,如图1-65所示。
![](https://epubservercos.yuewen.com/2B7BD9/27167019607668606/epubprivate/OEBPS/Images/48_03.jpg?sign=1739227900-TrRVjvpk2HongVcsxod1SsKqfs5auC1h-0-b73c52eac1d91708d138007051962048)
图1-65 自动闭合标签
接着进行下一关,过滤了=(,输出位置没有任何干扰,直接输出在页面上,如图1-66所示。
![](https://epubservercos.yuewen.com/2B7BD9/27167019607668606/epubprivate/OEBPS/Images/49_01.jpg?sign=1739227900-uF2b40xep7HfGktDp3YDM0UBvcbPRCEW-0-2c30430a811178abddc2140ee970a6c0)
图1-66 过滤特殊符号
JavaScript里某些函数是支持用``代替()的,除了prompt()函数不支持。SVG标签会将XML实体解析后加入标签,我们可以利用其会解析编码的特性绕过一些符号的过滤,代码如下。
![](https://epubservercos.yuewen.com/2B7BD9/27167019607668606/epubprivate/OEBPS/Images/49_02.jpg?sign=1739227900-FlZZ58qEVO8CS9fqm0ct5Gv3XoveACTj-0-58e163acc9e392257a1a54c3af7526b2)
或者利用eval函数。在JavaScript里,eval函数能够接受十六进制的字符串。
![](https://epubservercos.yuewen.com/2B7BD9/27167019607668606/epubprivate/OEBPS/Images/49_03.jpg?sign=1739227900-wuFdtbCApIZV3lctfYo8Lq75WYM55dVq-0-86d507ab88bcc4642b0a5ad2a9200ef0)
执行结果如图1-67所示。
![](https://epubservercos.yuewen.com/2B7BD9/27167019607668606/epubprivate/OEBPS/Images/49_04.jpg?sign=1739227900-bLVYNXQ2tH7qWwBxVAEKhxjR36xl29wn-0-a9748dab28ecaa87c4fcd3a12704cdf7)
图1-67 成功绕过特殊符号