Pikachu漏洞平台---XSS(Cross-Site Scripting) 跨站脚本

XSS(跨站脚本)概述
    Cross-Site Scripting 简称为“CSS”,为避免与前端叠成样式表的缩写"CSS"冲突,故又称XSS。一般XSS可以分为如下几种常见类型:
        1.反射性XSS;
        2.存储型XSS;
        3.DOM型XSS;

危害: 存储型>反射型>DOM型

1.反射型XSS(get)

随便输入,  输入   '  "  <>  特殊字符都可以原封不动得输出      可以发现没有任何过滤,

 

只是限制了输入字符的长度,F12修改一下即可  因为一般 前端中得输入框 会做一个长度得限制,  我们将他修改为20000

<script>  alert("你好,我是一个警告框!") ;</script>    //   弹窗得语法

                   

查看后台代码,发现 后台代码并没有对你输入得东西 做任何修改 只是原封不动得输出了

总结:  随便输入,可以发现没有任何过滤,只是限制了输入字符的长度,F12修改一下即可, 

           后台不会存储数据,  刷新后 不会弹窗!

输入kobe     会生成链接     http://192.168.50.100/pikachu/vul/xss/xss_reflected_get.php?message=kobe&submit=submit#

2.反射型XSS(post)

admin  123456  登陆成功后 显示 

输入 kobe  会以post方式提交请求  http://192.168.50.100/pikachu/vul/xss/xsspost/xss_reflected_post.php#

这种情况下 无法将恶意代码 发送到后端  

提前写好  html页面 发送给用户 和用户点击 就可以获取cookie值

让用户去点击这个页面  获取cookie值

 

3.存储型XSS

提交留言后刷新  会一直存储在留言板上  后台有数据  这就是 和反射型xss一个区别

' " <> ?   6666666   输入特殊字符 发现没有过滤  

查看前端代码

我们输入  <script>  alert("xss") </script>   会出现一个弹窗

  

我们查看后台代码

判断message是否存在 并且 message不为空

进行了转义 防止sql注入

插数据库的时候 做了对应的转义 防止数据库的注入  把massage 插入到表中  存下来 存到后台

将存储得留言 都显示出来

4.DOM型XSS

    DOM学习链接:   https://www.w3school.com.cn/htmldom/index.asp

 你可以理解为DOM为一个一个访问html的标准编程接口

输入1111

 

初步观察,点击 click me! 后会出现 what do you see? 的链接按钮,
其指向是 当前目录/you_input 审查元素时发现onclick后会执行函数 domxss() ,其作用是读取input的值并将其拼接到新创建的link节点中,

查看代码

有一段script的代码  他获取了id=text的值  输出了  通过字符串拼接方式 

 

 构造闭合方式

"<a href='  "+str+"  '>     what do you see?</a>";

"<a href='    '  >             what do you see?</a>"

"<a href=' #'   onclick="alert(111)">    '   what do you see?</a>"

                    #' onclick="alert(111)">

实际会出现<a href=' #'   闭合

剩下  >'what do you see?  显示到下方

点击  onclick="alert(111)"会出现弹窗    111

 

5.DOM型XSS-X

  输入后显示  

查看源代码,发现代码获取的是url的text  值

"<a href='  "+str+"  '>就让往事都随风,都随风吧</a>"

"<a href='    '  >          就让往事都随风,都随风吧</a>"

"<a href=' #'   onclick="alert(111)">    '  就让往事都随风,都随风吧</a>"

                    #' onclick="alert(111)">

   构造 #' onclick="alert(111)">

弹窗

 

6.XSS之盲打

 

 输入 :   <script>alert('xss')</script>    发现  也没有其他内容输出

 

根据提示 登录后台  :  http://192.168.50.100/pikachu/vul/xss/xssblind/admin_login.php

7.XSS之过滤

XSS过滤:

几种XSS绕过的姿势:

1.直接f12修改前端的限制,例如长度。

2.大小写混合:<SCRIpt>ALErt(11)<SCRipt>

3.拼凑:<scr<script>ipt>alert(11)</sc<script>ript>

4.注释符:<scr<!--text-->ipt>alert(11)</sc<!--text-->ript>

5.编码的方式,

但是在使用时要注意是否会被输出点识别和执行,不然绕过了也没有用。

输入<script>' "  特殊字符 看输出结果 字符被过滤 查看前端源码  输入结果不一致

查看后端源码 发现对script进行了 过滤 替换为空格 但是只是对小写进行了替换

 

利用大小写混合输入的方式  进行绕过处理  <sCrIpt>alert(1111)</sCriPt>  ,则会弹窗

 

8.xss之htmlspecialchars  

学习链接:  https://baijiahao.baidu.com/s?id=1621553793329253809&wfr=spider&for=pc

在php中,htmlspecialchars()函数是使用来把一些预定义的字符转换为HTML实体,返回转换后的新字符串,原字符串不变。

如果 string 包含无效的编码,则返回一个空的字符串,除非设置了 ENT_IGNORE 或者 ENT_SUBSTITUTE 标志;

被转换的预定义的字符有:

&  :  转换为&amp;

"  :  转换为&quot;

'  :  转换为成为 '

<  :  转换为&lt;

>  :  转换为&gt;

 可用的引号类型:

ENT_COMPAT:默认。仅编码双引号。

ENT_QUOTES:编码双引号和单引号。

ENT_NOQUOTES:不编码任何引号。

输入特殊字符 查看源码,  我们看到     '   "   <   >   都进行了编码

 所以使用单引号闭合:q' onclick='alert(111)'

XSS防范  总原则:  输入做过滤,输出做转义

过滤:  根据业务需求进行过滤,比如输入点要求输入手机号。则只允许输入手机号格式的数字

转义 : 输出到前端的数据根据输出点 进行转义    html做html转义 js页面做js转义

9.xss之href输出

查看源码,这次htmlspecialchars函数使用了ENT_QUOTES类,也加上了对单引号的转义,

但是在a标签的href属性里面,可以使用javascript协议来执行js

于是:javascript:alert(1111)

 所以在 href 的输出最安全的防范措施:  因为herf里面可以写超链接 只允许http,https,其次在进行htmlspecialchars处理

 

10xss之js输出

输入1111,观察源码

 只要闭合语句即可:</script>'<script>alert("111")</script> 

 
这里讲输入动态的生成到了js中,形成xss
javascript特点:不会对tag和字符实体进行解释的,    就是不对实体编码 进行转义  ,所以需要进行js转义


这里如果进行html的实体编码,虽然可以解决XSS的问题,但是实体编码后的内容,在JS里面不会进行翻译,这样会导致前端的功能无法使用。
所以正确的防范      在JS的输出点应该使用对特殊字符进行转义

原文地址:https://www.cnblogs.com/xingyuner/p/12299217.html