一、总结反射型XSS、存储型XSS和DOM型XSS的特点与区别
1. 反射型XSS特点:
攻击载体: 攻击者通过将恶意脚本嵌入到一个URL中,用户点击这个URL时,脚本被发送到服务器并立即反射到响应页面中。
时机: 攻击脚本在用户请求的响应中被“反射”回用户浏览器。通常发生在用户点击一个恶意链接后。
攻击表现: 恶意代码被立即执行,通常用来窃取用户数据或进行会话劫持。
2. 存储型XSS特点:
攻击载体: 攻击者将恶意脚本存储在目标网站的数据库、论坛、评论区等地方。之后,当其他用户访问这些存储的内容时,脚本会被执行。
时机: 恶意脚本在存储时并不立即执行,而是在用户访问存储的内容时被执行。
攻击表现: 恶意代码被存储在服务器端的数据库中,所有访问这个内容的用户都会受到影响。存储型XSS通常具有更持久的影响。
3. DOM型XSS特点:
攻击载体: 恶意代码通过直接修改浏览器的DOM(文档对象模型)来执行,不需要经过服务器的处理。
时机: 攻击脚本通过用户的输入或者其他客户端数据来动态修改网页的DOM结构,导致恶意脚本在客户端执行。
攻击表现: 攻击脚本的执行完全依赖于客户端的代码,而不是服务器端响应。
4、区别总结:
反射型XSS:攻击脚本通过URL或表单数据被服务器即时反射到响应中执行,攻击依赖于用户点击恶意链接。
存储型XSS:攻击脚本存储在服务器端的数据中,当其他用户访问这些存储的内容时脚本被执行,具有持久性。
DOM型XSS:攻击脚本通过操控客户端的DOM实现,脚本的执行完全依赖于客户端,通常不需要服务器端的直接参与。
二、XSS的fuzz字典
一位GitHub作者整理的Web Pentesting Fuzz 字典,内容包括:参数Fuzz字典 Xss Fuzz字典 用户名字典 密码字典 目录字典 sql-fuzz字典 ssrf-fuzz字典 XXE字典 ctf字典 Api字典 路由器后台字典 文件后缀Fuzz js文件字典 子域名字典。
下载地址:GitHub - TheKingOfDuck/fuzzDicts: Web Pentesting Fuzz 字典,一个就够了。
其中的XSS fuzz字典部分展示如下:
三、在XSS靶场进行打靶挑战
靶场网址: https://xss.tesla-space.com/
参考博客:xss-labs 靶场详细攻略(附常用payload) - FreeBuf网络安全行业门户
1、第一关
将网址后面的name值修改后,会发现页面的“欢迎回来”后面的值会随之改变,因此在此处尝试注入恶意代码<script>alert('1')</script>,然后成功过关。
2、第二关
2.1、第二关页面有个显眼的搜索框,尝试在该框中注入恶意代码,结果无效。
2.2、在页面单击右键,点击“检查”进入查看页面源码, 发现输入的数据被写入了value里,即<script>alert('1')</script>被写作值了,因此无效。
2.3、在 <script>alert('1')</script>前加上">将value闭合即可过关。
3、 第三关
3.1、在输入框中输入同样的代码,结果无效,并且发现原输入的值不一样。
3.2、原因是htmlspecialchars函数把预定义的字符&、”、 ’、<、>转换为HTML实体,防止浏览器将其作为HTML元素 ,所以无效。但htmlspecialchars函数无法转义单引号。
3.3、输入'οnclick='alert(1)为网页的表单输入框添加 onclick属性,点击一下输入框即可过关。
4、第四关
4.1、在框中输入<script>alert('1')</script>,发现尖括号被过滤了。
4.2、采用第三关思路构造onclick,并且使用双引号来闭合标签,在输入框中尝试输入 " οnclick="alert(1),然后点击输入框成功过关。
5、第五关
5.1、在输入框中尝试输入<script>alert('1')</script>,发现script被过滤。
5.2、尝试使用其它payload,比如JavaScript,在输入框中输入"><a href="javascript:alert(1)">后,点击">过关。
6、第六关
6.1、输入<script>alert('1')</script>出现和第五关相同的情况,再输入和第五关相同的payload,然而失败。
6.2、考虑到有更多的东西被过滤了,于是用大小写来绕过,输入"><a HrEf="javascript:alert(1)">成功过关。