网络安全集中实习作业 8月29日
任务
- 总结反射型、存储型、DOM型XSS特点和区别
- 上网搜索一份XSS 的fuzz字典或字典生成工具(可选)
- 到XSS挑战靶场打靶,要求通过5关以上,通关越多,加分越多。(https://xss.tesla-space.com/)
- 总结浏览器解析机制,若不能理解,解释《漏洞利用之XSS注入》中15条中,至少5条执行成功或不成功的原因。(可选)2或4至少选一条完成
一、反射型、存储型、DOM型XSS特点和区别
什么是XSS?
概述
跨站脚本攻击(Cross-site scripting,XSS)是一种安全漏洞。攻击者可以利用这种漏洞在网站上注入恶意的客户端代码。当受害者运行这些恶意代码时,攻击者就可以突破网站的访问限制并冒充受害者。根据开放式 Web 应用安全项目(OWASP)的数据,XSS 是 2017 年第七名最常见的 Web 应用程序漏洞。
如果 Web 应用程序没有部署足够的安全验证,那么,这些攻击很容易成功。浏览器无法探测到这些恶意脚本是不可信的,所以,这些脚本可以任意读取 cookie、session token,或者其他敏感的网站信息,或者让恶意脚本重写 HTML 内容。
原理
基于网页开发时留下的漏洞,通过巧妙的方法将恶意指令代码注入到网页中,使用户在不知情的情况下加载并执行这些恶意脚本。这些恶意脚本通常是JavaScript,但也可以包括Java、VBScript、ActiveX、Flash或甚至是普通的HTML。
常见类型
反射型(非持久型)XSS、存储型(持久型)XSS、DOM型XSS、通用型XSS、突变型XSS。
危害
窃取敏感信息、盗取用户身份、篡改网页内容、欺骗用户和损害网站信誉
1.反射型XSS
反射型XSS只是简单的把用户输入的数据从服务器反射给用户浏览器,要利用这个漏洞,攻击者必须以某种方式诱导用户访问一个精心设计的URL(恶意链接),才能实施攻击。
漏洞成因
当用户的输入或者一些用户可控参数未经处理地输出到页面上,就容易产生XSS漏洞。主要场景有以下几种:
- 将不可信数据插入到HTML标签之间时;// 例如div, p, td;
- 将不可信数据插入到HTML属性里时;// 例如:
<div width=$INPUT></div>
- 将不可信数据插入到SCRIPT里时;// 例如:
<script>var message = ” $INPUT “;</script>
- 还有插入到Style属性里的情况,同样具有一定的危害性;// 例如
<span style=” property : $INPUT ”></span>
- 将不可信数据插入到HTML URL里时,// 例如:
<a href=”[http://www.abcd.com?param=](http://www.ccc.com/?param=) $INPUT ”></a>
- 使用富文本时,没有使用XSS规则引擎进行编码过滤。
对于以上的几个场景,若服务端或者前端没有做好防范措施,就会出现漏洞隐患。
攻击流程
特点
- 非持久型:攻击脚本不会保存在目标服务器上,而是作为URL请求的一部分被发送,并在服务器上反射回用户浏览器。
- 特定用户攻击:只有点击了含有恶意脚本的链接或提交了含有恶意脚本的表单的用户才会受到影响。
- 即时性:攻击效果立即显现,一旦链接被点击或表单被提交,攻击就会执行。
2.存储型XSS
存储型(或 HTML 注入型/持久型)XSS 攻击最常发生在由社区内容驱动的网站或 Web 邮件网站,不需要特制的链接来执行。黑客仅仅需要提交 XSS 漏洞利用代码(反射型XSS通常只在url中)到一个网站上其他用户可能访问的地方。这些地区可能是博客评论,用户评论,留言板,聊天室,HTML 电子邮件,wikis
,和其他的许多地方。一旦用户访问受感染的页,执行是自动的。
漏洞成因
存储型XSS漏洞的成因与反射型的根源类似,不同的是恶意代码会被保存在服务器中,导致其它用户(前端)和管理员(前后端)在访问资源时执行了恶意代码,用户访问服务器-跨站链接-返回跨站代码。
攻击流程
特点
- 持久型:攻击脚本被永久保存在目标服务器的数据库或文件中,任何访问该页面的用户都可能受到影响。
- 非特定用户攻击:攻击者将恶意脚本存储在服务器上后,无需再次干预,任何访问该页面的用户都会自动执行恶意脚本。
- 隐蔽性高:由于攻击脚本存储在服务器上,因此很难被直接发现。
3.DOM型XSS
通过修改页面的DOM节点形成的XSS,称之为DOM Based XSS。
漏洞成因
DOM型XSS是基于DOM文档对象模型的。对于浏览器来说,DOM文档就是一份XML文档,当有了这个标准的技术之后,通过JavaScript就可以轻松的访问DOM。当确认客户端代码中有DOM型XSS漏洞时,诱使(钓鱼)一名用户访问自己构造的URL,利用步骤和反射型很类似,但是唯一的区别就是,构造的URL参数不用发送到服务器端,可以达到绕过WAF、躲避服务端的检测效果。
特点
- 不依赖于服务器交互:DOM型XSS的攻击过程完全在客户端进行,不需要与服务器进行交互。
- 基于DOM文档对象模型:攻击者通过修改页面的DOM节点来注入恶意脚本。
- 灵活性高:由于攻击过程在客户端进行,因此攻击者可以灵活地利用JavaScript等客户端技术来构造攻击。
4.区别
类型 | 持久性 | 交互方式 | 攻击对象 |
---|---|---|---|
反射型XSS | 非持久 | 依赖于服务器反射 | 特定用户 |
存储型XSS | 持久 | 不依赖于服务器交互(但脚本存储在服务器上) | 非特定用户 |
DOM型XSS | 非持久(脚本不存储在服务器上) | 完全在客户端进行 | 访问页面的用户 |
二、上网搜索一份XSS 的fuzz字典或字典生成工具(可选)
什么是fuzz?
定义
模糊测试 (fuzz testing, fuzzing)是一种软件测试技术。其核心思想是自动或半自动的生成随机数据输入到一个程序中,并监视程序异常,如崩溃,断言(assertion)失败,以发现可能的程序错误,比如内存泄漏
模糊测试工具主要分为两类
变异测试(mutation-based),变异测试通过改变已有的数据样本去生成测试数据
生成测试(generation-based),生成测试则通过对程序输入的建模来生成新的测试数据
目前主要的三种模糊测试技术
黑盒随机模糊:对正确格式的输入数据进行随机变异,然后用这些变异的输入运行程序,看是否能够触发异常
基于语法的模糊:是模糊复杂格式输入的替代方法,需要指定输入格式的输入语法,还指定哪些输入部分要进行模糊化以及如何模糊化。基于语法的模糊生成器会生成许多新的输入,每个输入满足语法编码的约束。基于语法的fuzzing通过模糊生成器的用户的创造力和专业知识来指导fuzzing
白盒模糊处理:动态地执行测试下的程序,并从执行过程中遇到的条件分支收集输入约束。然后,系统地逐个否定所有这些约束,并使用约束求解器求解,其解被映射到执行不同程序执行路径的新输入。使用系统搜索技术重复这个过程,试图扫描程序的所有可行的执行路径。与黑盒随机模糊相比,白盒模糊通常更精确,可以运行更多的代码,从而发现更多的bug
Web渗透测试Fuzz字典分类
参数Fuzz字典
Xss Fuzz字典
用户名字典
密码字典
目录字典
sql-fuzz字典
ssrf-fuzz字典
XXE字典
参数Fuzz字典
https://github.com/TheKingOfDuck/fuzzDicts/blob/master/paramDict/parameter.txt
Xss Fuzz字典
https://github.com/TheKingOfDuck/easyXssPayload/blob/master/easyXssPayload.txt
密码字典
https://github.com/TheKingOfDuck/fuzzDicts/tree/master/passwordDict
目录字典
https://github.com/TheKingOfDuck/fuzzDicts/tree/master/directoryDicts
SQL Fuzz字典
https://github.com/TheKingOfDuck/fuzzDicts/blob/master/sqlDict/sql.txt
ssrf fuzz字典
https://github.com/TheKingOfDuck/fuzzDicts/blob/master/ssrfDicts
XXE字典
https://github.com/TheKingOfDuck/fuzzDicts/tree/master/XXEDicts
三、到XSS挑战靶场打靶,要求通过5关以上,通关越多,加分越多。
level 1
这里可以看到通过修改url中level1.php?name后面的字段,页面会改变,显示该字段的总长
查看页面源码,此处说明我们可以通过使页面弹窗的方式过关
将恶意代码<script>alert(111)</script>
直接插入url,可以看到弹窗并进入level2
level 2
来到level2,可以看到多了一个输入框,尝试输入上一关的恶意代码<script>alert(111)</script>
,可以看到并无特殊反应
查看页面源码,可以看到我们的恶意代码被""注释掉,无法起到应有的作用
修改代码,闭合前面的语句,以绕过限制<input name=keyword value=""><script>alert(111)</script>//">
,即输入"><script>alert(111)</script>//"
进行尝试,可以看到成功过关
level 3
来到第三关,我们仍旧先尝试第一关的恶意代码<script>alert(111)</script>
,情况和第二关相似
查看页面源码,发现我们输入的恶意代码被转译,尝试onfocus事件绕过
输入恶意代码a'> onclick='alert(1)
,再次点击搜索框
注:
onfocus 事件
定义和用法
onfocus 事件在对象获得焦点时发生。
Onfocus 通常用于 , , 和.
提示: onfocus 事件的相反事件为 onblur 事件。
语法
HTML 中:
<element onfocus="SomeJavaScriptCode">
JavaScript 中:
object.onfocus=function(){SomeJavaScriptCode}
JavaScript 中, 使用 addEventListener() 方法:
object.addEventListener("focus", myScript);
支持 onfocus 事件的 HTML 标签:
onfocus 属性通常用于所有 HTML 元素,除了:, ,
, , , , , ,
level 4
进入第四关,我们输入上一关代码进行尝试,并直接查看页面源代码,这里可以看到原理和level2相似,代码被注释掉了
这里尝试补全代码,来闭合前面的代码,并再次输入进行尝试" onfocus=javascript:alert() "
,将""注释掉
level 5
进入第五关,直接查看页面源码
这里可以看到,它把script标签过滤了。这里我们可以使用a链接+伪协议的方式来进行弹窗'"><a href='javascript:alert(123);'>点击我</a>
,运行后点击产生的标签
四、浏览器解析机制
浏览器的解析机制涉及多层次的解析过程,主要包括HTML解析、URL解析、JavaScript解析,以及解析流的管理。这些过程相互协作,最终决定页面内容如何呈现以及JavaScript代码是否执行。
浏览器的解析机制涉及多层次的解析过程,主要包括HTML解析、URL解析、JavaScript解析,以及解析流的管理。这些过程相互协作,最终决定页面内容如何呈现以及JavaScript代码是否执行。以下是对这些解析机制的总结:
HTML解析
- 状态机模型:HTML解析器作为一个状态机,从输入流中逐字符地获取数据并进行解析。解析器会根据不同字符的出现,转换到相应的状态。
- 标签和字符实体处理:当解析器遇到
<
符号时,会进入“标签开始状态”,继续解析标签名和属性。同时,HTML解析器会解码字符实体(如<
解码为<
),并将解码后的内容插入DOM中。 - RCDATA和原始文本元素:对于
<textarea>
和<title>
等RCDATA元素,解析器会解码字符实体,但不会创建新的标签,因此其中的脚本不会执行。类似地,<script>
和<style>
等原始文本元素的内容不会进行HTML解码。
URL解析
- ASCII限制:URL解析器要求协议类型必须是ASCII字符。如果协议部分被编码或非ASCII化,解析器将无法识别并进入“无类型”状态,导致协议失败。
- 多轮解码:在某些情况下,浏览器会对URL进行多轮解码。例如,当HTML解析器解析出
href
属性中的URL后,URL解析器会进一步解码其中的字符。如果URL协议为javascript:
,解析后的内容将传递给JavaScript引擎执行。
JavaScript解析
- Unicode和Hex转义序列:JavaScript解析器会解码字符串中的Unicode转义序列(如
\u0031
对应字符1
)以及标识符中的转义序列。如果这些序列出现在字符串或标识符中,它们将被解释为常规字符。 - 标识符和控制字符:转义序列在标识符名称中会被解码为标识符的一部分。但用于控制字符(如括号)的转义序列则不会被解析为有效的控制字符,导致执行失败。
解析流
- 解析顺序:浏览器按HTML、URL、JavaScript的顺序进行解码。例如,对于
<a href="javascript:...">
的内容,首先由HTML解析器解码字符实体,接着URL解析器解码URL内容,最后JavaScript解析器解析并执行代码。 - 多轮解析:在复杂的场景中(如在URL中嵌套JavaScript代码),解析器可能会执行超过三轮的解码,每一轮解码会影响最终的执行结果。例如,
<a href="javascript:window.open('UserInput')">
可能涉及四轮解码(HTML -> URL -> JavaScript -> URL)。
参考:
https://juejin.cn/post/6912030758404259854#heading-0
https://blog.csdn.net/liuhyusb/article/details/134325374
https://blog.csdn.net/m0_63069714/article/details/129383429
https://segmentfault.com/a/1190000019706953
https://juejin.cn/post/7022995756160122888