声明:
由于笔者能力有限,难免出现各种错误和漏洞。全文仅作为个人笔记,仅供参考。
笔记内容来源于各类网课。
环境:
XSS Challenges Stage #15:http://xss-quiz.int21h.jp/ ,FireFox
一、概述
十六进制绕过过滤触发XSS。
二、document.write
write() 方法可向文档写入 HTML 表达式或 JavaScript 代码。
可列出多个参数(exp1,exp2,exp3,...) ,它们将按顺序被追加到文档中。
document.write(exp1,exp2,exp3,....)
更多细节参考W3school。
我们在线测试一下write方法,测试地址。
我们修改内容为十六进制,查看输出。
我们依次输入的是不可打印字符(0x02),数字1(0x31),字母d(0x64)和符号<(0x3c),都可以正常输出。HelloWorld没有输出,由于<的作用将它识别为标签名。
当然直接输入数字1,字母d,符号<也是可以打印出来,这里是为了明确,write确实可以将对于字符的十六进制转为字符打印出来。
三、XSS探测
1. 正常的数据提交
提交123abc,数据出现在input的value中,script的write方法中,以及脚本write出的结果。
2. 代码审查
我们先尝试利用value属性进行XSS。
发现不仅过滤的双引号,还将左右尖括号进行的转义。这里对于value很难进行闭合利用。
我们利用write方法,将左右尖括号转为十六进制输入,那么输出来的脚本写在页面上便会执行。
\x3cscript\x3e alert(1); \x3c\x2fscript\x3e
发现write中的原来的\没有了,所以就全部当做字符串输出。
需要双写\\表示\。在输入的字符串中需要用\\x表示\x,这样在write中才能正确输出对于的字符。
\\x3cscript\\x3e alert(1); \\x3c\\x2fscript\\x3e
3. 构造Payload
\\x3cscript\\x3e alert(document.domain); \\x3c\\x2fscript\\x3e
JS成功执行。