一、pikachu(XSS)
1.1反射型XSS
1.1.1 反射型XSS(Get)
直接注入:
<script>alert('1')</script>
发现前端对输入的长度有限制,需要修改,解决方法如下:
修改前端网页代码
看到对应的input标签maxlength是20:
修改为200后, 可以输入完整的长度:
弹窗成功:
抓包查看(成功查看到弹窗)
1.1.2 反射型XSS(Post)
首先网站为了更好理解利用xss盗取用户的cookie, 模拟了一个用户登录的过程:
登录成功后, 就和Get型一样的界面了:
虽然界面是一样的, 但是请求方式不一样, 用户先经过POST请求登录, 然后再在当前界面用GET来提交信息:
所以可以直接注入:
弹窗成功:
抓包查看(成功查看到弹窗)
1.1.3 分析
有的人会问, 这两关有什么区别吗?
当然有区别, 在xss GET方式中, 攻击者可以直接伪造一个已经构造好的攻击网址,
来诱使用户点击, 盗取用户的cookie
有的人还问, 这么明显的攻击网址, 没人会点。
是的, 的确看到的人都不会点, 但是攻击者会去缩短、包装攻击这个网址。
那么, 在POST方式的xss中, 与GET不同的是:
-
GET方式中, 攻击代码是直接暴露在URL中的
-
POST方式参数内容不会出现在URL中
因为在POST方式中, 就算将构造好(含攻击代码)的URL给用户点击了, 也不会直接触发拿到cookie, 反而会直接弹出用户登录提示。
这时候我们就得用一个服务器(攻击者的), 伪造POST请求去登录, 并且盗取用户登录成功后的cookie
1.2 存储型XSS
发现它是一个留言板
所以可以直接注入:<script>alert("交出你的cookie");alert(document.cookie)</script>
提交之后首先弹出下图,对应payload中的 alert(“交出你的cookie”)
点 确定 之后又弹出下图,对应payload中的 alert(document.cookie)
点 确定 之后就变成下图这样了,虽然留言内容显示不出来,但是对比一开始进来的时候可以看到多了个“删除”,说明确实多了一条留言
下面就是见识存储型XSS威力的时候了:
在另外一个浏览器中来到本关页面,也出现了同样的弹框。说明存储型XSS能危害所有访问受影响页面的用户。
1.3 特点与区别
反射型、存储型和DOM型XSS(跨站脚本攻击)是三种不同类型的XSS攻击。它们的主要特点和区别如下:
1.3.1 反射型XSS(Reflected XSS)
- 特点:
- 攻击者将恶意脚本嵌入到请求中(如URL参数),并通过诱使用户点击链接来触发这一请求。
- 脚本通常是在HTTP响应中即时返回的,并不在服务器上持久存储。
- 攻击目标通常是单次会话,脚本在请求周期结束后不再有效。
1.3.2 存储型XSS(Stored XSS)
- 特点:
- 攻击者将恶意脚本存储在服务器的数据库、论坛帖子、评论中等持久存储的位置。
- 当其他用户访问这些存储的数据时,脚本会被提取并执行。
- 这种攻击方式对受害者的影响长期存在,可能影响多个用户。
1.3.3 DOM型XSS(DOM-based XSS)
- 特点:
- 攻击发生在客户端,主要利用JavaScript的功能。
- 攻击者通过操控DOM(文档对象模型)来执行恶意代码,而不依赖于服务器的响应。
- 常见于客户端应用程序,恶意脚本的执行依赖于现代浏览器和JavaScript的执行上下文。
1.3.4 区别总结:
-
存储位置:
- 反射型XSS:不持久存储,恶意代码在请求即刻执行。
- 存储型XSS:持久存储在服务器上,影响多次用户访问。
- DOM型XSS:发生在客户端,通过对DOM的操作实现攻击。
-
攻击手段:
- 反射型XSS:依赖用户点击恶意链接。
- 存储型XSS:恶意内容存储在服务器上由后续请求触发。
- DOM型XSS:通过客户端代码直接操控DOM对象。
二、XSS 的fuzz字典
Fuzz 字典:
https://github.com/TheKingOfDuck/fuzzDicts
参考文章:fuzz字典参考
三、XSS挑战靶场打靶
3.1 level 1
首先,点击图片开始第一关
我们可以看到当前页面没有用户输入点
查看代码(友情提示:F12/鼠标右键)
发现可以在地址栏中更改用户的名字
输入<script>alert(/xss/)</script>
3.2 level 2
点击确定进入第二关
发现多了一个文本框和按钮,查看代码
尝试修改文本框内容,发现
三处同时变化
利用input标签的value值
采用<script>
标签绕过
注意:需要构造闭合
"><script>alert(/xss/)</script><input name="
3.3 level 3
来到第三关
第三关和第二关一样有一个文本框和一个按钮
查看代码
按照第二关的第一种方法尝试,发现无法解析<>和””
那就要换种绕过方法:
构造事件onmouseout,并且把" "改为’ ':' onmouseover='alert(/xss/)
发现是可执行的
3.4 level 4
来到第四关
按例查看代码,尝试"> <script>alert(/xss/)</script><input="
<>仍被实体化
onmouseout可以
" οnmοuseοut="alert(/xss/)
3.5 level 5
来到第五关啦
首先,我们还是尝试使用<script></script>
出错了
查看源代码发现: scr和ipt中间有了个下划线,对script进行了过滤
采用上一关的方法" οnclick="alert(/xss/)
发现 on也被过滤了
使用一种新方法
<a>
标签:超链接
"><a href="javascript:alert(/xss/)">
3.6 level 6
使用上一关的方法调用<a>
没有出现超链接
我们查看源代码一下
hr和ef中间出现下划线,尝试切换大小写绕过
"><a Href="javascript:alert(/xss/)">6<"
出现超链接了,点击成功
3.7 level7
进行<script></script>
尝试,被过滤掉了
onclick尝试,on无法显示
怎么办呢?
尝试一下复写:" oonnclick="alert(/xss/)
发现成功
3.8 level 8
发现比之前的关卡多了一个链接
查看代码看看
试试<script></script>
标签,果然一如既往的不行。
输入javascript:alert(/xss/)发现
r和i之间有了个空格,但其实那是个制表符
有两个方法
方法:在url里面javascript字母中加入url编码的制表符:%09
成功啦!
3.9 level 9
尝试上一关的方法
javascript:alert(/xss/)
没有问题但是依旧无法跳转
查看源码中具有该代码:strpos($str7,'http://'))
,意味着会检查我们的内容中是否有http://,所以我们可以借助/**/去绕过http://的检测,只需要在我们的恶意代码之后用注释包裹http://即可。同时因为题目把script过滤了,所以需要对script进行ASCII HEX编码。
javascript:alert(/xss/)/*http://*/
3.10 level 10
通过F12我们可以发现该页面具有隐藏的input属性:
所以可以通过url来传参的方式看看我们能否给这些隐藏的属性赋值:
发现t_sort是可以赋值的,所以我们可以控制t_sort的value:
但是我们现在无法把触发这个onmouseover事件函数,因为input标签被hidden属性隐藏了,所以我们需要 重新设置type,在原来的语句上加上"type=“text”:http://localhost/xsschallenge/level10.php?t_sort="onmouseover="alert(/xss/)"type="text"
搞定!
四、总结浏览器解析机制
浏览器解析机制主要包括以下几个核心步骤:
-
获取资源:浏览器通过HTTP/HTTPS协议从服务器获取HTML文档和其他资源(如CSS、JavaScript、图片等)。
-
构建DOM树:浏览器解析HTML文档,创建一个称为文档对象模型(DOM)的树形结构。每个HTML标签都会对应一个DOM节点。
-
构建CSSOM树:浏览器解析CSS样式,创建一个CSS对象模型(CSSOM)树。这个过程涉及到对CSS规则的解析和层叠计算。
-
渲染树构建:结合DOM树和CSSOM树,浏览器构建渲染树。渲染树只包含可见的节点,并计算出每个节点的布局信息。
-
布局:对渲染树中的元素进行布局计算,确定每个元素在屏幕上的位置和尺寸。
-
绘制:浏览器根据布局信息,将渲染树中的内容绘制到屏幕上。这一步骤涉及到将像素信息绘制到位图中。
-
合成:在复杂的页面中,浏览器可能会将不同的层合成到一起,以提高性能,最终展示给用户。
整个解析过程是实时进行的,浏览器会根据用户的交互和动态内容的变化不断更新DOM和渲染结果。