前言
跨站点脚本(Cross Site Scripting,XSS)是指客户端代码注入攻击。攻击者在合法的网站或Web应用程序中执行恶意脚本。当Web应用程序在其生成的输出中使用未经验证或未编码的用户输入时,就会发生XSS。
XSS主要使用JS来执行恶意攻击,因为JS可以操控HTML、CSS、浏览器等,所有就给了攻击者可乘之机。
XSS漏洞原理
XSS通过构造JS代码,将其注入到网页中,然后浏览器执行这段JS代码,从而达到恶意攻击的效果。当用户访问这个页面的时候,这段代码就会注入给用户,在用户的浏览器上执行,从而攻击者就可以获取用户信息进行攻击。这个就是XSS漏洞的原理,我们可以将其绘制成一个示意图:
XSS漏洞利用
XSS攻击目标是客户端浏览器用户,由于浏览器的类别不同,攻击效果不同。
**注入位置:**搜索框、留言板、聊天室等收集用户输入的地方。
**POC:**可以用一段简单的代码来验证是否存在XSS漏洞。下面是一些检验语句,如果页面存在弹窗,那么说明存在XSS漏洞。
Js
<script>alert(/xss/);</script>
<script>confirm(/xss/);</script>
<script>confirm('xss');</script>
<script>prompt('xss');</script>
XSS漏洞危害
攻击者利用XSS攻击是通过编写恶意JS代码,注入到Web服务器中,用户访问Web界面,这段恶意代码会在用户的浏览器中执行,以达到攻击效果,这样就会产生很多的危害:
- 窃取用户的Cookie信息,进行Cookie欺骗
- 劫持用户会话执行任意操作
- 刷流量、执行弹窗广告进行网络攻击
- 传播蠕虫病毒
- 窃取用户私人账密信息
- 挂马
XSS攻击方式及利用
XSS攻击分为反射型XSS、存储型XSS、DOM型XSS。
反射型XSS
非持久、参数型 的跨站脚本。攻击者事先做好攻击链接,欺骗用户自己去点击链接来触发XSS代码,一般会出现在像搜索框这样的地方。
比较容易被发现 ,利用难度较高!
存储型XSS
持久型跨站脚本。它通常会被写进数据库或文件等可以被永久保存数据的介质中。通常会出现在像留言板的地方,攻击者将恶意代码写入数据库。如果没有过滤或者过滤不严的话,那么这些恶意代码就会存储在服务器数据库中,当用户访问的时候就会触发代码,形成攻击。
非常危险,很容易造成大面积破坏、窃取用户信息Cookie。
DOM型XSS
DOM(Document Object Model,文档对象模型)是一个与平台、编程语言无关的接口 ,它允许程序或脚本动态地访问或更新文本文档 ,处理后的结果会成为页面的一部分。DOM型XSS是一种XSS攻击方式。通过修改受害者浏览器页面的DOM树 来执行。这种攻击技法的特点在于攻击代码在浏览器本地修改DOM树来执行,不会将payload上传到服务器。
因为其特性,所有很难被检测到。
XSS攻防
固定会话攻击
原理
固定会话攻击是通过窃取Cookie来实现的。
Cookie相当于存储在浏览器里的身份证,拥有它也就拥有了用户的身份。XSS触发是需要浏览器客户端用户(受害者)参与的,攻击者并不清楚什么时候会触发漏洞,所以这个过程也被称为XSS盲打。
工具(XSS平台)
使用XSS平台
攻击演示
1.首先,我们先来在XSS平台上创建一个项目,项目名称就叫做XSS盲打
,接着下一步。
2.接着就是模块代码的选择,这里我们就选择超强默认模块
并选择keepsession
。
3.完成这些之后,我们的代码就生成出来了,我们会发现上面也有教我们如何使用的教程。
4.我们以cms网站作为一个XSS盲打网站,我们在留言板处进行XSS代码上传,我们将恶意代码上传上去,接着就是等待后台管理员审核了。
5.当后台管理员看到这条留言的时候,我们就成功了!我们回到我们的xss平台,打开项目内容
,发现我们获取到了cookie。
cookie : username=admin; userid=1; PHPSESSID=0g29gq5hupifd1tartkva7kjs7
6.有了Cookie,我们就可以来构造了。
cmd
document.cookie = "username=admin";
document.cookie = "userid=1";
document.cookie = "PHPSESSID=0g29gq5hupifd1tartkva7kjs7";
7.接着我们F12打开控制台,把cookie输入后我们直接访问admin页面,我们就可以直接跳过登录加入到管理员界面了。
XSS构造方法
通过何种方式可以触发XSS?
利用<>
可以使用<>来构造XSS代码用于注入。
html
<script>alert(/xss/)</script>
利用javascript伪协议
可以通过url载入资源标签来构造。
html
<a href= javascript:alert(/xss/)>click me!</a>
事件响应
"事件驱动"是一种比较典型的编程思想
事件类型 | 说明 |
---|---|
Window 事件 | 对Window 对象触发的事件 |
Form 事件 | HTML 表单内触发的事件 |
keyboard 事件 | 键盘事件 |
Mouse 事件 | 鼠标事件 |
Media 事件 | 由多媒体触发的事件 |
html
# 错误触发
<img src = # onerror = alert(/xss/)>
# 抬键
<input type='text' onkeyup = alert(/xss/)>
# 鼠标悬停
<input type='text' onmouseover = alert(/xss/)>
参考:HTML 事件参考手册 (w3school.com.cn)
XSS变形方式
大小写转换
浏览器对HTML标签大小写不敏感
html
<ScRipt>alert(/xss/)</ScRipt>
<img ONerror = 'alert(/xss/)' src = "#">
关键词双写
html
<scr<script>ipt>alert(/xss/)</script>
对伪协议进行转码
插入其他字符
可以将以下字符插入到任意位置
字符 | 编码 |
---|---|
Tab | 	 |
换行 | |
回车 | |
可以将以下字符插入到头部位置
字符 | 编码 |
---|---|
SOH |  |
STX |  |
引号的使用
HTML对引号的使用要求不严格。
- 没有引号
- 单引号
- 双引号
html
<Img sRc=# OnErRoR=alert(/xss/);>
<Img sRc = '#' OnErRoR='alert(/xss/)'>
<Img sRc = "#" OnErRoR="alert(/xss/)">
/ 代替空格
html
<Img/sRc='#'/OnErRoR='alert(/xss/)'>
拆分跨站
将一段JS代码拆成多段
html
<script>z='alert'</script>
<script>z+='(/xss/)'</script>
<script>eval(z)</script>
XSS的防御
通过过滤器以达到过滤用户提交的有害信息的效果来进行防御。
输入过滤
对用户输入进行过滤,进行有效性验证。
- 仅接收指定长度
- 仅包含合法字符
- 仅接收指定范围
- 特殊的格式
php
<?php
$keywords = $_GET['keywords'];
$keywords = strolower($keywords);
$keywords = str_replace("on","",$keywords);
$keywords = str_replace("<script>","",$keywords);
$keywords = str_replace("<","",$keywords);
$keywords = str_replace(">","",$keywords);
echo $keywords;
?>
输出编码
HTML 编码是HTML 实体编码
php
$keywords = htmlspecialchars($_GET['keywords']);
黑白名单策略
针对名单对用户提交的信息进行过滤。
黑名单:非允许的内容
白名单:允许的内容
测试代码
html
<sCr<ScRiPt>IPT>OonN'"\/(hrHRefEF)</sCr</ScRiPt>IPT>