1. 总结反射型、存储型、DOM型XSS特点和区别
1.反射型XSS的特点
1.触发方式:恶意的攻击脚本包含在 URL 中,只有当用户访问了包含恶意脚本的 URL,才会触发。
2.存储方式:反射型XSS的攻击脚本不会写入网站的数据库,是一次性的攻击。
2.存储型XSS的特点
1.触发方式:不需要用户主动点击链接,只要其他用户访问含有恶意脚本的页面,就会受到影响。
2.存储方式:存储型 XSS 会把攻击脚本提交到网站后台数据库(服务器端)。
3.DOM型XSS的特点
1.触发方式:攻击者通过操控网页中的DOM元素注入恶意脚本,攻击代码在用户的浏览器中执行,而不是通过服务器端处理。
2.存储方式:恶意脚本不会保存在数据库中和服务器中,而是注入在客户端的DOM元素中。
4.三种XSS的区别
反射型XSS | 存储型XSS | DOM型XSS | |
触发方式 | 访问包含恶意脚本的 URL | 访问含有恶意脚本的页面 | 访问DOM元素注入恶意脚本的URL |
存储方式 | 不会写入网站的数据库,是一次性的攻击 | 提交到网站后台数据库(服务器端) | 注入在客户端的DOM元素中 |
存储时间 | 既有即用 | 持久性 | 既有即用 |
输入点 | 搜索框 | 留言 | DOM位置 |
2. 上网搜索一份XSS 的fuzz字典或字典生成工具(可选)
1.XSS的fuzz字典
fuzz字典下载地址(作者不定期更新中)
https://github.com/TheKingOfDuck/fuzzDicts
2.XSS的字典生成工具
XSStrike工具介绍
XSStrike是一款检测Cross Site Scripting的高级检测工具。它集成了payload生成器、爬虫和模糊引擎功能。XSStrike不是像其他工具那样注入有效负载并检查其工作,而是通过多个解析器分析响应,然后通过与模糊引擎集成的上下文分析来保证有效负载。除此之外,XSStrike还具有爬行,模糊测试,参数发现,WAF检测功能。它还会扫描DOM XSS漏洞。
项目地址:https://github.com/s0md3v/XSStrike
XSStrike工具安装
由于XSStrike只可以运行在python 3.6 以上版本,所以必须使用python3.6版本。
sudo apt-get install python3-pip
git clone https://github.com/s0md3v/XSStrike.git
pip3 install -r requirements.txt
chmod +x xsstrike.py
XSStrike帮助信息
在终端中输入 ./xsstrike.py -h 或 ./xsstrike.py --help
3. 到XSS挑战靶场打靶,要求通过5关以上,通关越多,加分越多。(https://xss.tesla-space.com/)
第一关
发现是反射型XSS(get),直接尝试输入一个payload<script>alert(1)</script>。
第二关
发现有一个表单提交框,再次尝试输入<script>alert(1)</script>,发现无法通过。
右键点击检查,查看前端代码。
针对搜索框检查代码,发现传输的恶意代码被当作字符串了,可以尝试闭合input标签,输入
"><script>alert(1)</script>。
成功通过
第三关
先输入123456,然后查看网站源码,这里是单引号闭合,试一下'> <script>alert()</script> <'。
继续检查前端代码,发现符号被html实体化了,我们还可以利用其他方法进行xss注入,这里我们可以利用onfocus事件绕过。
所以我们可以利用这个事件来绕过<>号的过滤已达到执行js的目的,构造payload
' οnfοcus=javascript:alert() '。
成功通过
第四关
查看一下网站源码,
这里是双引号闭合,<input>标签,所以我们还能继续利用onfocus事件,构建payload
" οnfοcus=javascript:alert() "
成功通过
第五关
查看一下网站源码
没发现什么异常,先试试" οnfοcus=javascript:alert() "。这里on被替换成了o_n。
过滤了js的标签还有onfocus事件,只能新找一个方法进行xss注入,这里我们用a href标签法,
添加一个标签得闭合前面的标签,构建payload"> <a href=javascript:alert()>xxx</a> <"。
之后点击xxx,触发a标签href属性即可。
4. 总结浏览器解析机制,若不能理解,解释《漏洞利用之XSS注入》中15条中,至少5条执行成功或不成功的原因。(可选)
1.HTML解析
- ⼀个HTML解析器作为⼀个状态机,它从输⼊流中获取字符并按照转换规则转换到另⼀种状态。在 解析过程中,任何时候它只要遇到⼀个'<'符号(后⾯没有跟'/'符号)就会进⼊“标签开始状态 (Tag open state)”。然后转变到“标签名状态(Tag name state)”,“前属性名状态(before attribute name state)”......最后进⼊“数据状态(Data state)”并释放当前标签的token。
- 这⾥有三种情况可以容纳字符实体,“数据状态中的字符引⽤”,“RCDATA状态中的字符引 ⽤”和“属性值状态中的字符引⽤”。
- 字符实体(character entities) 字符实体是⼀个转义序列,它定义了⼀般⽆法在⽂本内容中输⼊的单个字符或符号。⼀个字符实体 以⼀个&符号开始,后⾯跟着⼀个预定义的实体的名称,或是⼀个#符号以及字符的⼗进制数字。
- HTML字符实体(HTML character entities)需要注意的是,某些字符没有实体名称,但可以有实体编号。⼀个HTML字符实体描述如下:
字符显示 | 描述 | 实体名称 | 实体编号 |
< | 小于号 | <; | < |
- 字符引⽤(character references)字符引⽤包括“字符值引⽤”和“字符实体引⽤”。'<'对应的字符值引⽤为'<',对应的字符实体引⽤为‘<’。字符实体引⽤也被叫做“实体引⽤”或“实体”。
- 如果我们回头看HTML解析器的规则,其中有⼀种可以容纳字符引⽤的情况是“RCDATA状态中的 字符引⽤”。这意味着在“<textarea>”和“<title>”标签中的字符引⽤会被HTML解析器解码。这⾥要再 提醒⼀次,在解析这些字符引⽤的过程中不会进⼊“标签开始状态”。所以在“<textarea>”和“<title>”的内容中不会创建标签,就不会有脚本能够执行。
2.URL解析
3.JavaScript 解析
- 字符串中:当Unicode转义序列存在于字符串中时,它只会被解释为正规字符,⽽不是单引号,双 引号或者换⾏符这些能够打破字符串上下⽂的字符。这项内容清楚地写在ECMAScript中。因此, Unicode转义序列将永远不会破环字符串上下⽂,因为它们只能被解释成字符串常量。
- 标识符名称中:当Unicode转义序列出现在标识符名称中时,它会被解码并解释为标识符名称的⼀ 部分,例如函数名,属性名等等。
- 控制字符中:当⽤Unicode转义序列来表示⼀个控制字符时,例如单引号、双引号、圆括号等等,它 们将不会被解释成控制字符,⽽仅仅被解码并解析为标识符名称或者字符串常量。如果你去看 ECMAScript的语法,就会发现没有⼀处会⽤Unicode转义序列来当作控制字符。例如,如果解析 器正在解析⼀个函数调⽤语句,圆括号部分必须为“(”和“)”,⽽不能是\u0028和\u0029。