第四天作业
XSS跨站脚本攻击
跨站脚本(Cross Site Scripting) ,为了不和层叠样式表(Cascading Style Sheets)的缩写CSS混合,所以改名为XSS;攻击者会向web页面(input表单、URL、留言版等位置)插入JavaScript代码,导致管理员/用户访问时触发,从而达到攻击者的目的。
1.三种XSS类型的特点及区别
1.反射型XSS
反射型XSS只是简单的把用户输入的数据从服务器反射给用户浏览器,要利用这个漏洞,攻击者必须以某种方式诱导用户访问一个精心设计的URL,才能实施攻击。
反射型xss(get)
1.观察到有输入框,尝试输入<script>alert(document.cookie)</script>
,若该处存在反射型xss漏洞,提交后js处理模块会处理构造好的payload,页面会有弹窗,且显示cookie信息。
2.在输入时发现输入框对输入内容有长度限制,在输入框处右键选择检查,修改页面输入框内容长度maxlength为50.
3.再次输入payload,发现提交成功,弹窗显示出了cookie信息。
反射型xss(post)
当页面存在反射型xss漏洞且方法为post时,通过burp suite抓包,将包转发到重发器中,在请求体中修改提交的message的值为<script>alert(document.cookie)</script>
,重发后可以在响应中看到成功将获取cookie值的代码插入到了页面中。
2.存储型XSS
存储型(或 HTML 注入型/持久型)XSS 攻击最常发生在由社区内容驱动的网站或 Web 邮件网站,不需要特制的链接来执行。仅仅需要提交 XSS 漏洞利用代码(反射型XSS通常只在url中)到一个网站上其他用户可能访问的地方。这些地区可能是评论区、留言板等,和其他的许多地方。一旦用户访问受感染的页,执行是自动的。
例如在pikachu靶场中,在页面中出现了留言板,通常留言板的内容会在提交后被保存到服务器端的数据库里方面其他用户在留言板中可以看见其他用户的留言。这时可以通过插入一段代码若存在存储型xss漏洞,则该代码将会被保存到数据库中,例如插入一段弹窗的js代码
<script>alert(document.cookie)</script>
当其他用户访问页面时就会从数据库中调取数据从而显示弹窗。
提交代码后,查看pikachu的数据库,可以看见成功将代码保存到了数据库中。
此时刷新留言板页面,可以发现访问该页面就会出现弹窗。
3.DOM型XSS
DOM全称Document Object Model,使用DOM可以使程序和脚本能够动态访问和更新文档的内容、结构及样式。DOM型XSS是非持久型XSS,且不与后台服务器产生数据交互,而是通过JS修改网页的DOM来执行恶意脚本进行攻击。注意,DOM型XSS与反射型和存储型最大的区别在于,DOM型XSS不经过服务端,全部的攻击过程都在客户端完成。
在pikachu上首先可以看到一个输入框,检查页面元素可以发现提示。
可见输入框中的内容就是标注的str,我们可以在这里构造一个闭合,实现弹窗。
输入' onclick="alert('xss')">
2.XSS的fuzz字典
fuzz字典地址:xss 常用标签及绕过姿势总结 - FreeBuf网络安全行业门户
fuzzDicts: Web Pentesting Fuzz 字典,一个就够了。 (gitee.com)
3.XSS靶场练习
靶场地址:https://xss.tesla-space.com/
3.1第一关
首先打开靶场第一关页面如下。
由于没有多余的信息,右键选择检查查看代码信息,根据提示可以发现,需要修改name的值,使其弹窗才能跳转到level2.php
于是在url中令参数name=<script>alert()</script>
。
3.2第二关
进入第二关观察页面有输入框,尝试输入<script>alert()</script>
,页面显示没有找到结果,并原样输出了我们的输入。
查看页面代码,可以发现我们输入的代码被当成字符了,需要先去闭合value的引号和input的尖括号。
于是尝试构造新的payload
"> <script>alert()</script> <"
3.3第三关
先在输入框中输入<script>alert()</script>
进行尝试。
发现输入的内容被原样输出,则查看页面源代码。发现input的value值部分该用了单引号,并且对尖括号进行了转义。
于是尝试换一种不带标签的代码,并闭合前后单引号。
尝试构造payload:' onmouseover=javascript:alert() '
输入后将鼠标移到回显处即可触发弹窗。
3.4第四关
尝试在输入框中直接输入,发现原样回显,于是查看源代码发现输入的尖括号被过滤掉。
于是尝试避免使用尖括号,并且闭合前后双引号。
使用类似第三关的payload:
“ onmouseover=javascript:alert() ”
3.5第五关
尝试在输入框中直接输入,发现原样回显,于是查看源代码发现输入的
于是尝试绕过并闭合双引号。
构造payload
"> <a href=javascript:alert()>xss</a> <"
点击xss即可触发弹窗。