实训作业day04
一、反射型、存储型、DOM型XSS特点和区别)
-
反射型XSS
攻击者构造一个参数包含恶意js代码的URL,诱骗用户点击,用户访问后向服务器发送请求,服务器响应包含恶意代码的页面,并在客户端执行。例如服务器后端存在PHP代码
echo ‘
Hello ’ .$_GET[ ‘name’ ] .’';
参数name传入js代码后,则会在服务器生成恶意页面,然后返回给客户端执行。
-
存储型XSS
攻击者通过网页的留言、评论等交互处将恶意代码注入到服务器数据库中,用户请求后响应包含恶意代码的页面。存储型XSS漏洞跟反射型形成的原因一样,不同的是存储型XSS下攻击者可以将脚本注入到后台存储起来,构成更加持久的危害,因此存储型XSS也称“永久型”XSS。
-
DOM型XSS
攻击者构造一个参数包含恶意js代码的URL,诱骗用户点击,用户访问后向服务器发送请求,服务器的响应并不包含恶意代码,而是URL中的代码直接在本地浏览器由js执行。DOM型XSS是一种前端js渲染造成的反射性XSS,不需要与服务器交互,难以被抓包检测。DOM型XSS和别的XSS最大的区别就是它不经过服务器,仅仅是通过网页本身的JavaScript进行渲染触发。例如下面的html代码,当URL的参数a传入js恶意代码后,会直接被html内嵌的js代码写入到html中,并不需要经过服务器的处理。
<html> <head> <title>DOM-XSS test</title> </head> <body> <script> var a=document.URL; document.write(a.substring(a.indexOf("a=")+2,a.length)); </script> </body> </html>
对比来看反射型:经过后端,不经过数据库。存储型:经过后端,经过数据库。DOM:不经过后端,DOM型XSS漏洞是基于文档对象模型)的一种漏洞,通过url传入参数去控制触发的。
二、XSS 的fuzz字典
在https://github.com/HackAllSec/FuzzDict或者https://github.com/oldboot/FuzzDicts下载fuzz字典。
三、XSS挑战靶场打靶(https://xss.tesla-space.com/)
第一关
- 在url中把“name=test”中的test改为
< script>alert(‘1’)< /script> //需要删去空格
第二关
- 先输入keyword为弹窗命令“< script>alert(‘1’)< /script>”,按F12后发现其在input标签里,只要在前面加上“>即可闭合input。
第三关
-
输入后检查源码发现和第二关很像,输入的内容都被放进了Input标签里,尝试用"<闭合input,但双引号和尖括号都被编码。
-
将双引号改为单引号发现能闭合标签,但是后边的内容也被编码。
-
使用html表单的onblur事件,输入:'οnblur=’alert(1)’”(元素失去焦点时弹窗)。
-
点击搜索后移开鼠标,出现弹窗。
第四关
- 尝试第二关闭合标签(‘>< script>alert(‘1’)< /script>),通关成功。
第五关
-
尝试输入‘>< script>alert(‘1’)</ script>,发现单引号和尖括号都没有被过滤,而script变成“scr_ipt“。可以通过javascript伪协议来解决。
-
输入”>< a href=“javascript:alert(‘1’)”>1< /a>,点击产生的超链接“1“弹窗成功。
第六关
-
输入第五关的答案,查看源码发现input标签已闭合但“href”变成了“hr_ef”。
-
尝试将“href”变成了“hRef”绕过检查,点击超链接,弹窗成功。
第七关
-
输入第五关的答案,发现href和script被去掉了。
-
将href和scipt嵌入语句,输入”>< a hrhrefef=“javascrcriptipt:alert(‘1’)”>1< /a>,点击产生的超链接“1“弹窗成功。
第八关
-
输入第5关答案,发现双引号被编码,替换成单引号也一样。
-
将javascript:alert(‘1’)改成html编码输入(在burpsuite使用html编码工具),弹窗成功。
四、总结浏览器解析机制(或分析《XSS注入》执行成功/不成功的原因)
-
一个HTML解析器作为一个状态机,它从输入流中获取字符并按照转换规则转换到另一种状>态。在解析过程中,任何时候它只要遇到一个’<‘符号(后面没有跟’/'符号)就会进入“标签开始状态”。然后转变到“标签名状态”,“前属性名状态(”…最后进入“数据状态(Data state)”并释放当前标签的token。>当解析器处于“数据状态(Data state)”时,它会继续解析,每当发现一个完整的标签,就会释放出一个token。
-
url解析:URL资源类型必须是ASCII字母(U+0041-U+005A || U+0061-U+007A),不然就会进入“无类型”状态。在URL解析器的时候不能被URL编码,不能对协议类型进行任何的编码操作,不然URL解析器会认为它无类型。
javascript解析:“script”块有个有趣的属性:在块中的字符引用并不会被解析和解码。unicode不可以对特殊符号进行编码,例如:’ " \n。
-
解析流: 在网页中有很多地方需要多个解析器来协同工作。浏览器从网络堆栈中获得一段内容后,触发HTML解析器来对这篇文档进行词法解析。由于URL位置不同,URL解析器可能会在JavaScript解析器之前或之后进行解析。如果解析器正在解析一个函数调用语句,圆括号部分必须为“(”和“)”,而不能是\u0028和\u0029。