XSS 攻击
分类
XSS攻击大致可以分为三类
存储型XSS
:存储型XSS
,持久化,代码是存储在服务器中的,如在个人信息或发表文章等地方,插入代码,如果没有过滤或过滤不严,那么这些代码将储存到服务器中,用户访问该页面的时候触发代码执行。这种XSS
比较危险,容易造成蠕虫,盗窃Cookie
反射型XSS
:非持久化,需要欺骗用户自己去点击链接才能触发XSS
代码(服务器中没有这样的页面和内容),一般容易出现在搜索页面。反射型XSS大多数是用来盗取用户的Cookie
信息。
DOM型XSS
:不经过后端,DOM-XSS
漏洞是基于文档对象模型(Document Objeet Model,DOM)
的一种漏洞,DOM-XSS
是通过url
传入参数去控制触发的,其实也属于反射型XSS
相关知识
一般攻击者构造的EXP
是JS
代码,因此攻击者的JS
代码水平也一定程度上决定了其攻击的效果
同时网上也存在一些免费的XSS
平台来构造代码实施攻击
反射型
反射型XSS
数据的流向是:前端 -> 后端 -> 前端
一般出现在对用户的输入没有进行严格的过滤,如我们有如下代码:
1 |
|
当网站未对用户输入的名字进行过滤时,我们尝试输入<script>alert("Hacker")</script>
那么被网站进行解析时,便会弹出提示框Hacker
常见出现场景
将不可信数据插入到HTML标签之间时;// 例如<div>
, <p>
;
将不可信数据插入到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
产生原因相似,不同的是反射型攻击生效仅有一次,不会保留在服务器中,而存储型XSS
,可以保留在服务器中,导致其他用户和管理员访问对应资源时执行了恶意代码
存储型XSS的数据流向是:前端 -> 后端 -> 数据库 -> 后端 -> 前端
我们可以将其理解为我们在某一个页面插入了我们的XSS
攻击脚本,数据库会将其保存到服务器中,然后在网站其他地方调用这个数据时,网页会解析我们的攻击脚本,从而再次执行
DOM型
DOM
型XSS
是基于DOM
文档对象模型的。对于浏览器来说,DOM
文档就是一份XML
文档,当有了这个标准的技术之后,通过JavaScript
就可以轻松的访问DOM
。当确认客户端代码中有DOM
型XSS
漏洞时,诱使(钓鱼)一名用户访问自己构造的URL
,利用步骤和反射型很类似,但是唯一的区别就是,构造的URL
参数不用发送到服务器端,可以达到绕过WAF
、躲避服务端的检测效果。
DOM
数据流向是: 前端 -> 浏览器
相关利用
XSS相关攻击载荷
以下所有标签的 > 都可以用 // 代替, 例如:<script>alert(1)</script//
<script>
标签:<script>
标签是最直接的XSS
有效载荷,脚本标记可以引用外部的JavaScript
代码,也可以将代码插入脚本标记中
1 |
|
svg 标签
1 |
|
img 标签
1 |
|
body 标签
1 |
|
video 标签
1 |
|
style 标签
1 |
|
a 标签
当我们存在一个<a>
标签,我们输入的任何东西都会被添加到<a>
标签中的href
时,我们可以直接输入Javascript
语句进入攻击
1 |
|
相关绕过
绕过一
插入语句被写做为了值时,我们可以手动添加">
使前面的标签进行闭合
1 |
|
绕过二
htmlspecialchars()
函数把预定义的字符转换为 HTML
实体如:
1 |
|
htmlspecialchars
函数只针对<>
大于小于号进行html
实体化,我们还可以利用其他方法进行xss
注入,这里我们可以利用onfocus
事件绕过
onfocus
事件在对象获得焦点时发生,常用于<input>
、<select>
、<a>
标签
我们可以使用鼠标属性,添加一个鼠标点击
1 |
|
绕过三
当页面纯在有htmlspecialchars
过滤以及onclick
过滤时,我们可以将input
标签进行提前闭合,然后插入另一个<a></a>
标签
1 |
|
或者也可以使用<iframe>
标签完成
1 |
|
绕过四
当我们的一些标签被过滤时,可以尝试更改大小写来尝试绕过
1 |
|
绕过五
当我们的一些关键字直接被删除的方式进行过滤时,我们可以尝试使用双写,再原先标签中再插入一个标签,这种方式方式一般用于没有对我们输入语句循环检测时
1 |
|
绕过六
当我们的JavaScript
被过滤时,我们可以尝试将我们的输入进行编码,将其转换为HTML
的实体字符
1 |
|
绕过七
当我们的输入是通过Get
的方式进行传参时,网站也过滤了大量的标签,我们可以尝试更换一种传参方式来进行构造
1 |
|
绕过八
当我们的输入是通过Post
方式进行传参时,我们可以使用BurpSuit
对网页进行抓包,观察网页能够提交的内容,修改对应的报文进行发送
绕过九
当文件中出现ng-include
时,其可以用于包含外部的HTML
文件,默认情况下我们所包含的文件需要在同一个域名下
ng-include指令就是文件包涵的意思,用来包涵外部的html文件,如果包涵的内容是地址,需要加引号
对此我们可以使用如下代码进行包含:
1 |
|
XXX
为我们所需要包含的文件,如果XXX
存在某种XSS
漏洞的话,我们可以利用其存在的问题来操控我们可以包含文件的网页,因此我们有如下payload
1 |
|
绕过十
当我们的空格输入被过滤时,我们可以输入URL
编码下的%0A
或%0D
来进行绕过
绕过十一
当我们遇到<embed>
标签时,我们可以使用onclick
或onmouseover
绕过,因为这两个变量是互相拼接起来的,所以在输入arg02
时在b
之后加一个空格,当浏览器解析到b
的时候就停止判断,然后将onclick
或onmouseover
看作另外一个属性
1 |
|
一些Payload
理论上来说XSS漏洞是可以彻底解决的
1 |
|