1.1 Stage 1 无过滤注入XSS
使用xss challenges闯关游戏进行验证。
1.1.1 页面分析
1.1.1.1 分析过程
- 页面提示需要做的是注入 alert(document.domain); 的JS脚本;
- 输入“1”看页面逻辑结构;
- 搜索框中进行搜索信息,在页面下方会显示出搜索内容;
- 页面显示出搜索结果;
- 源码中也可以看到输入的信息被加载到了页面中;
1.1.2 直接注入测试
1.1.2.1 构建payload
<script>alert(document.domain);</script>
1.1.2.2 执行payload
查看执行结果:
从源码中可以看出确实插入在b标签中,正常来说这样已经注入成功了。
1.1.3 闭合标签方式注入
使用闭合标签方式进行反射型XSS注入,和我们学习SQL注入时很像,可以使用对应的闭合方式进行插入代码。
b标签的结构是<b>“文本信息”</b>作用是加粗文本信息,我们搜索时使用</b>对b标签进行闭合。
1.1.3.1 构建payload
1 </b> <script> alert(document.domain); </script>
1.1.3.2 执行payload
可以看到b标签成功闭合,我们在b标签后面添加了新的JavaScript代码。
1.2 Stage 2 属性中注入XSS
http://xss-quiz.int21h.jp/stage2.php?sid=6421b575282f0c61fcb2e1f7b76aee00b3b34ccc
1.2.1 页面分析
1.2.1.1 分析过程
- 提示信息:关闭当前标签并添加script标签
- 分析源码看到leon的位置在input中的value属性当中,当我们注入JavaScript代码到value中时,页面加载并不会触发执行代码,因为我们输入的信息被当做文本信息存在value中,所以我们需要闭合value将JavaScript代码插入到属性外面。
1.2.2 进行注入测试
1.2.2.1 进行闭合标签测试
使用">闭合标签并插入JavaScript代码,在输入框中执行:
leon"> <script> alert(document.domain); </script>

从源码中可以看到多余的代码被当做普通文本信息打印出来了:
<input type="text" name="p1" size="50" value="leon"> <script> alert(document.domain); </script> ">
1.2.2.2 构建注入事件payload
在现代浏览器中都内置有大量的事件处理器,这些处理器会监视特定的条件或用户行为,例如鼠标单击或浏览器窗口中完成加载某个图像,通过使用客户端的JavaScript可以将某些特定的事件处理器作为属性添加给特定的标签,并可以在事件发生时执行一个或多个JavaScript 命令或函数。
" onmouseover=alert(document.domain)>
【payload解释】:
- onmouseover事件:当鼠标指针移至元素之上时运行脚本;
- 使用双引号闭合value属性;
- 添加onmouseover事件当鼠标移动到添加事件的元素中时执行JavaScript代码alert(document.domain)弹出域名;
1.2.2.3 执行payload
可以看到当鼠标移动到输入框会自动触发XSS,所以事件就需要用户手动触发才能够被执行:
1.3 Stage 3 选择列表中注入XSS
http://xss-quiz.int21h.jp/stage-3.php?sid=f33fdff32491620e9b498d7ff4b483553f1bd9a6
1.3.1 页面分析
1.3.1.1 分析过程
- 提示信息:文本框中的输入已经被正确转义;
- 代码中定了一个文本输入为p1,然后使用select元素创建一个下拉列表为p2;
1.3.1.2 尝试注入
尝试在搜索框中进行XSS注入,输入:<script> alert(document.domain); </script>
可以看到我们注入的信息被转义成文本信息显示出来了,并没有被执行:
1.3.2 对列表进行注入测试
因为我们在输入时下拉列表选项是不能进行修改的,但是我们可以使用burpsuite截取数据包对右侧选择列表进行注入。
1.3.2.1 使用burpsuite截取数据包
根据抓取到的内容我们可以看到提交了2个参数p1和p2, p1是我们输入的内容,那么p2就是下拉列表中的选项:
1.3.2.2 修改表单数据
将p2的值修改为:<script>alert(document.domain);</script>
注意:这个实验如果失败返回错误码302需要重新截取POST请求,否则后续所有请求一律302。
1.3.2.3 在浏览器中查看结果
1.3.2.4 验证注入成功
弹出domain表示成功,我们查看源代码,发现代码中成功出入在列表中:
1.4 Stage 4 在隐藏域中注入XSS
http://xss-quiz.int21h.jp/stage_4.php?sid=60c896b53a08c571e724243363f11c6d59fa7855
1.4.1 页面分析
1.4.1.1 分析过程
- 提示信息:不可见输入字段;
- 隐藏域是用来收集或发送不可见元素的信息,对于网页的访问者来说隐藏域是看不见的,当表单被提交时隐藏域就会将信息用你设置时定义的名称和值发送到服务器上
1.4.1.2 查看隐藏域
正常我们可以看到的提交的数据是:p1=1,p2=Japan,但实际上还提交了一个值:p3=hackme
查看源码页面中存在一个p3参数,type类型为hidden,闭合方式为双引号,所以p3为隐藏参数
PS.参数隐藏可以避免在URL中传递参数,传递的参数用户不可见。
1.4.2 对隐藏域注入测试
1.4.2.1 构建payload
这里必须使用">闭合,这样XSS代码才会被执行:
"><script>alert(document.domain)</script>
1.4.2.2 修改表单数据
修改p3得值为paylod:
1.4.2.3 查看执行结果
