xss跨站脚本攻击


跨站脚本攻击

先来几个payload,我们要发现是否存在xss,首先就要输入payload,看浏览器是否执行了我们写入的js代码。一般都会有过滤,我们就需要做一些绕过姿势。

Click me

漏洞原理

  xss是跨站脚本攻击,攻击者在web页面或者服务器中插入恶意的脚本代码,当其他用户访问该页面时,服务器就会将含有恶意代码的页面响应给用户,用户在浏览器中触发恶意的脚本代码,造成攻击。

漏洞利用

  1. 盗取用户cookie,攻击者可以利用用户的cookie进行登录。

  2. 获取用户浏览器中密码管理器中的密码

  3. 执行弹窗广告。

  4. xss和csrf组合拳:

  当我们直接利用csrf做修改用户信息等操作时,网站会用一个csrf值来防御csrf,我们可以利用xss与csrf的组合拳,进行利用,首先在可以执行xss的位置,执行xss的代码,获取他的csrf值,之后再绕过csrf的防御进行攻击。

  5. 执行用户可以执行的任何操作。

  6. 读取用户可以访问的任何数据。

XSS分类

  反射性:

  通常攻击是一次性的,攻击者构造一个恶意链接,发送给用户,用户点击该链接,就被攻击了。如果是get请求的,直接可以将payload构造到url中。post请求的,我们需要将payload放到vps中,这个payload会获取用户的cookie,并返回给攻击者。攻击者将这个恶意链接发送给用户,用户点击之后,让用户访问我们的vps,从而造成攻击,这个和远程xxe差不多。

  存储型:

  我们构造的payload直接存储到了后台服务器,攻击者只需要等其他用户访问该页面,访问该页面的所有用户都会被攻击,危害范围广。

  DOM型:

  利用js脚本对文档对象进行编辑,修改页面dom树。

漏洞测试方法

  1. 基本标签和属性没有被过滤

  2. 大部分标签和属性被过滤

  当大部分标签和属性被过滤后,我们就要通过爆破来确定哪些标签和属性没有被过滤,确定没有被过滤的标签和属性后,进行利用。

  爆破时用xss备忘单做为爆破字典:https://portswigger.net/web-security/cross-site-scripting/cheat-sheet

  爆破过程可以参考我写的另一个笔记:https://www.cnblogs.com/syroot/p/15884986.html

  3. 过滤除自定义标签之外的所有HTML标签

  此注入会创建一个带有 ID 的自定义标签x,其中包含一个onfocus触发该alert函数的事件处理程序。URL 末尾的哈希会在页面加载后立即解析此元素,从而alert调用有效负载。

直接在测试点输入:
#x'

  4. 过滤了常用标签和属性,但是没有过滤SVG标签和属性。

  我们可以爆破一下,看是否过滤了svg标签及其属性,如果没有过滤,我们就可以利用。

1)>

绕过方法

  1. 输出内容在标签内,能够闭合

  需要确定我们输入的内容到底在哪里,最简单的方法就是用burp抓包,发送到Repeater模块,重放攻击,查看输入字符存在位置。

  我们可以尝试闭合,再构造我们的payload。

">

  2. 输出内容在标签内,不能闭合  

  最常见的就是将尖括号<>进行了过滤或者编码,导致不能闭合,如果可以闭合前面的属性值,就尝试引入新的属性,来执行我们的代码。

如果是在input标签内:
可以利用onmouseover属性:"onmouseover="alert(1)
'Search the blog...' name=search value=""onmouseover="alert(1)">

  利用伪协议:如果不能闭合原有的属性值,那就尝试利用伪协议。

"javascript:alert(document.domain)">

   3. 输出在script标签内,并且转义了单引号,阻止我们闭合

  输出在script标签内,可以先闭合原有的script标签,再构造新的script标签,如果不闭合的话,我们构造的script标签执行不了。

   4.输出在script标签内,并且对尖括号进行了html实体编码

  (1). 直接闭合原来的值,输入我们构造的代码,

'alert(1)'

   如果同时又对单引号进行了转义,那我们就构造exp时多加入一个反斜杠

\'alert(3)\'

 防御方法

   1. 输出编码:

  在html标签中,需要将特殊字符进行html实体编码

  在javascript中,需要将特殊字符进行unicode转义

  2. 输入验证:

  验证是否是http或者https等安全协议,最好用白名单来验证,

  3. 配置httponly ,限制攻击者窃取用户cookie 。

防御DOM型xss

1.避免客户端文档重写、重定向或其他敏感操作,同时避免使用客户端数据,这些操作尽量在服务端使用动态页面来实现。

2. 分析和强化客户端js代码,尤其是一些收到用户影响的DOM对象。