XSS Challenges stage#12-16 闯关详解
文章目录
0x01 Stage #12 利用 IE 浏览器特性绕过防护策略
实验环境:在 win7上 安装 install-ietester-v0.5.4.exe 使用 IE 10 做此实验
安装 ietester 双击即可
打开IE tester 然后访问链接地址
https://xss-quiz.int21h.jp/stage_no012.php?sid=1e3d64798c2c4a6e79394b50dff044d413daa8f1
我们输入payload 查看页面返回的信息
fengzilin"><script>alert(document.dodomainmain);</script>
我们可以看到所有的引号和尖括号都被过滤掉了,所以我们前面使用的方法对当前关卡是都没有作用的。我们使用 IE 浏览器的特性来进行 XSS 注入。
拓展:IE 浏览器特性
IE 中两个反引号 `` 可以闭合一个左边双引号
我们根据浏览器特性构造 payload
`` onmousemove=alert(document.domain)
打开 IE 10 进行测试
域名成功弹出
0x02 Stage #13 CSS 层叠样式表的 IE 特性伪协议注入
链接地址:
https://xss-quiz.int21h.jp/stage13_0.php?sid=35519ac7e298d65e648d1106643dbee7519b57f5
Hint: style attribute #提示:样式属性
页面中提示,让我们输入的信息是层叠样式表,所以我们使用层叠样式表的方式进行注入。输入的其它方式的文本信息不会被当做代码执行。
这里使用 IEtester 工具来进行测试。
新建 IE10
将payload 输入到浏览器中
background:url("javascript:alert(document.domain);");
将背景颜色替换为 url,然后使用伪协议进行注入 点击否
查看源码
查看源码
<input type="text" name="p1" size="60"
style="background:url("javascript:alert(document.domain);");" value="background:url("javascript:alert(document.domain);");">
层叠样式表成功调用了伪协议。
0x03 Stage #14 通过层叠样式表中的内联注释进行注入
链接地址:https://xss-quiz.int21h.jp/stage-_-14.php?sid=15a28e4ea20fb76f250fcd2b0aaa25aeb4b735d2
查看提示:发现过滤一些常用
s/(url|script|eval|expression)/xxx/ig;
解决办法,找到未过滤的,但能使用的发现,内联注释可以使用
1.CSS1 注释/*comment*/
语法:
/* 这里是注释内容
说明:用于注释
CSS 中的某些内容。
2.css expression(css 表达式)概述
css expression(css 表达式)又称 Dynamic properties(动态属性)是早期微软 DHTML 的产物,以其可以在 Css 中定义表达式(公式)来达到建立元素间属性之间的联系等作用,从 IE5 开始得到支持,后因标准、性能、安全性等问题,微软从 IE8 beta2 标准模式开始,取消对 css expression 的支持。
开始注入 XSS,通过内联注释进行绕过。
输入
fengzilin:expr/**/ession(alert(document.domain));
成功弹出消息,但是存在一个问题,在 CSS 中注入以后网站会不停的给我们弹框,所以我们需要修改一下 payload 使网站只弹一次。
先使用任务管理器,结束进程
重新打开地址
https://xss-quiz.int21h.jp/stage-_-14.php?sid=15a28e4ea20fb76f250fcd2b0aaa25aeb4b735d2
输入
fengzilin:expres/**/sion(if(!window.x){alert(document.domain);window.x=1;})
代码成功执行
0x04 使用 burpsuite 进行自动化测试 XSS 漏洞
环境准备
1.将xuegodxss.php放在到网站根目录下
是用phpstudy 将xuegod.php放在网站根目录下
2.使用burpsuite进行批量探测
将kali 中的 payload 字典拷贝出来
┌──(root💀fengzilin55)-[~/桌面]
└─# cp /usr/share/wordlists/wfuzz/Injections/XSS.txt /root/
将kali中字典拖入到和burpsuite一台电脑中,
开启burpsuite截取,使用火狐代理上网,并在浏览器中访问
http://127.0.0.1/xuegodxss.php/?payload=1
选择使用文档进行爆破
开始爆破
查看payload没有被过滤或者被替换,说明该payload可以使用,可以进行绕过处理
3.使用 burpsuite 扫描漏洞
3.1 关闭 burpsuite
这里使用 DVWA 来进进行漏洞扫描,关闭 burpsuite的截断,我们登陆DVWA
3.2 配置代理
使用火狐浏览器中的插件,设置使用burpsuite代理上网
调整 DVWA 级别
访问一下 XSS 漏洞页面方便后期扫描漏洞
我们进入burpsuite查看删除影响的页面
扫描这个网站
查看扫描进度
查看详细的扫描结果
扫描进行中
查看扫描了哪些页面
点击这个按照风险高低排序
查看提示信息
0x05 使用插件来筛选漏洞
运行 burpsuite 的插件 XSS Validator
安装插件
勾选这个可以关闭插件
运行插件
解压 phantomjs-2.1.1-windows.zip
进入/bin目录下
输入cmd.exe
输入该文件然后,回车
打开burpsuite 回到前面抓取 xuegodxss.php,前面的都一样,就在选择payload的时候不一样
选择插件
复制勾选的内容
清楚原来的东西
点击复制
点击开始
出现的结果会在 最右边的 复制字母的那个勾选
0x06 XSS 常用攻击编码
1.URL编码
一个百分号和该字符的ASCII编码所对应的2位十六进制数字,例如“/”的URL编码为%2F(一般大写,但不强求)
2.HTML实体编码
命名实体:以&开头,分号结尾的,例如“<”的编码是“<”
字符编码:十进制、十六进制ASCII码或unicode字符编码,样式为“&#数值;”,例如“<”可以编码为“<”和“<”
3.JS编码:js提供了四种字符编码的策略
1、三个八进制数字,如果不够个数,前面补0,例如“e”编码为“\145”
2、两个十六进制数字,如果不够个数,前面补0,例如“e”编码为“\x65”
3、四个十六进制数字,如果不够个数,前面补0,例如“e”编码为“\u0065”
4、对于一些控制字符,使用特殊的C类型的转义风格(例如\n和\r)
5、其他编码,例如JSFUCK
4.jsfuck编码
JSFuck 是一种基于 JavaScript 原子部分的深奥教育编程风格。它只使用六个不同的字符来编写和执行代码。
jsfuck 编码http://www.jsfuck.com/
jsfuck 编码由6个符号组成
5.解析过程
1.接收响应–>html decode–>url decode–>js decode(根据具体情况,可能是url解码在前,也可能是js解码在前)
0x07 使用编码绕过过滤-进行 XSS 注入
1.Stage #15 十六进制绕过
https://xss-quiz.int21h.jp/stage__15.php?sid=8352c169e4610c3383e28025a6ca1f8b7cefd670
分析页面,我们输入的字符会出现在输入框的下面的黑色方框中
我们构造 payload
"><script>alert(document.domain)</script>
发现我们输入的"<>这个特殊的符号被转换成实体字符了
我们使用十六进制编码绕过
十六进制的应用
此中hex带入具体 16 进制数
环境 | 格式 | 备注 |
---|---|---|
URL | %hex | |
XML,XHTML | &#xhex | |
HTML,CSS | #hex | 6位,用于表示颜色 |
Unicode | U+hex | 6位,表示字符编码 |
MIME | =hex | |
Modula-2 | #hex | |
Smalltalk.ALGOL 68 | 16rhex | |
Common Lisp | #xhex或#16rhex | |
IPv6 | 8个 hex用:分割 |
字符转换成数字进制编码的方式:
将字符转换为 ASCII码,添加 \x 比如:> 的 ASCII 码为 3e 那么它的十六进制为 \x3e
使用Python 将字符串转换为 ASCII
┌──(root??fengzilin55)-[~]
└─# python
>>> import binascii #加载 ASCII 编码转换模块
>>> print("\\x"+binascii.b2a_hex("<"))
\x3c
>>> print("\\x"+binascii.b2a_hex(">"))
\x3e
>>> exit()
使用编写的脚本
上传编写的脚本
使用方式-运行-输入需要的字符或字符串即可
┌──(root??fengzilin55)-[~]
└─# python3 decoder_hex.py
构造payload
\x3cscript\x3ealert(document.domain);\x3c/script\x3e
我们执行完发现 \ 被吃掉了,我们重新构造payload
\\x3cscript\\x3ealert(document.domain);\\x3c/script\\x3e
输入之后发现弹窗了
查看源码发现被解析了
2.Stage #16 使用 unicode 编码绕过关键词过滤-进行 XSS 攻击
将源码上传到kali中的 /var/www/html目录下
访问 http://192.168.37.132/stage16th.php
查看提示内容
Hint: document.write();" and "s/\\x/\\\\x/ig;
我们继续使用上面的payload
可以看到payload中的 \\x3c
和\\x3e
还是原本的字符串并没有被识别为<>尖括号,虽然最终浏览器在pre中识别了\x3e和\x3e 但代码还是没有执行
下面使用另外一种编码绕过 unicode
Unicode(统一码、万国码、单一码)是计算机科学领域里的一项业界标准,包括字符集、编码方案等。Unicode 是为了解决传统的字符编码方案的局限而产生的,它为每种语言中的每个字符设定了统一并且唯一的二进制编码,以满足跨语言、跨平台进行文本转换、处理的要求。1990 年开始研发,1994年正式公布
转码方式:
和十六进制转换一样我们需要将字符转换为 ASCII 码然后前面添加\u00,但是\表示转义我们还是需要使用\\
来进行转义。
┌──(root??fengzilin55)-[/var/www/html]
└─# python
>>> import binascii
>>> print("\\u00"+binascii.b2a_hex("<"))
\u003c
>>> print("\\u00"+binascii.b2a_hex(">"))
\u003e
>>> exit()
我们使用自己写的脚本
使用脚本
┌──(root??fengzilin55)-[/var/www/html]
└─# python3 decoder_unicode.py
将payload编码后
\\u003cscript\\u003ealert(document.domain);\\u003c/script\\u003e
使用payload
成功执行了
我们查看源码
返回了结果,并成功执行了
分析 unicode 编码解析过程
- 用户提交了数据,用户将数据提交了给浏览器
- 浏览器接受到数据之后,先解析HTML编码
- 然后在解析 URL 编码
- 然后在解析 unicode编码