一、使用docker搭建xss挑战之旅的运行环境
docker search XSS-challenge-tour查看镜像
docker pull下载镜像
docker images查看本地镜像库
docker run -d -p 96:80 镜像名,运行镜像;docker ps查看容器进程
浏览器访问页面
二、复现xss挑战之旅level1-level3。
第一关
(1)它是向服务器提交了一个 name 参数,值为 “test” ,从页面回显来看,将 neme 参数的值显示在了页面上,并且显示了 name 参数值的字符长度
第二关
(1)从 url 入手开始看,依然是 get 方式传递参数,应该还是反射型 xss,只不过这一关加入了 “ 输入框 ” 和 “ 搜索 ”,接下来查看网页源码
(2)从源码来看,它的功能就是通过点击“ 搜索 ” 按钮,将输入框内的内容以 get 方式提交给服务器上的level2.php,经过服务器的动态处理之后又会将参数keyword 的值插入到 <h2> </h2> 标签之中以及添加到<input> 标签中的 value 属性的值内。尝试使用上一关的恶意语句操作进行弹窗。
(3)但是报错了我们继续查看网页源码
(4)可以看到在<h2> </h2> 标签之中的恶意代码被编码了,其中< 和 > 都被编码成了 html 字符实体。猜测在服务器端用htmlspecialchars() 函数 对 keyword 参数的值进行了处理。
(5)接着往下看可以看到插入到value 参数值中的恶意代码并没有被编码而是直接原样返回 但是问题是这里的 js 代码在标签属性值中,浏览器是无法执行的。
(6)既然上面的恶意代码被编码了,那么只能从属性值中的恶意代码处进行突破了。要想浏览器执行这里的弹窗代码,只需要将属性的引号和标签先闭合就可以了。
(7)将keyword 的参数值重新赋值:"><script>alert('xss')</script>//
第三关
(1)这里输入第一关的参数进行测试
(2)出现报错,我们查看源代码
(3)可以发现转义了尖括号,这里可以用单引号闭合value但是没办法闭合input标签,但是可以注释掉标签然后用事件弹窗
(4)发现没有直接弹窗,这是因为onfocus事件的特殊性造成的最简单的实例就是网页上的一个输入框,当使用鼠标点击该输入框时输入框被选中可以输入内容的时候就是该输入框获得焦点的时候,此时输入框就会触发onfocus事件,因此点击当前页面的输入框就可以完成弹框了。