pikachu练习平台(XSS(跨站脚本))

 XSS(跨站脚本)概述

    Cross-Site Scripting 简称为“CSS”,为避免与前端叠成样式表的缩写"CSS"冲突,故又称XSS。一般XSS可以分为如下几种常见类型:

        1.反射性XSS;

        2.存储型XSS;

        3.DOM型XSS;

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

 

 

 

 

XSS漏洞的防范:

一般会采用对输入进行过滤输出进行转义的方式进行处理:

  输入过滤:对输入进行过滤,不允许可能导致XSS攻击的字符输入;

  比如:输入点要求输入手机号,则只允许输入手机号格式的数字

  输出转义:根据输出点的位置对输出到前端的内容进行适当转义;

  比如:输出到html中进行html实体转义,输入到js里面进行js转义

 

 

 

 

 

 

跨站脚本漏洞的测试流程:

1.在目标站点上找到输入点,比如查询接口,留言板等

2.输入一组“特殊字符(单引号,双引号,尖括号等)+唯一识别字符(字母数字组合)”,点击提交后,查看返回的源码,是否有对应的处理

3.通过搜索定位到唯一识别字符,结合唯一识别字符的前后语法确认是否可以构造执行js的条件(即构造闭合)

4.提交构造的脚本代码(以及各种绕过姿势),看是否成功执行,如果成功执行说明存在xss漏洞

注意点:1>一般查询接口容易出现反射性xss,留言板容易出现存储型xss

2>后台可能存在过滤措施,构造的script可能被过滤而无法生效  或者

浏览器环境限制了执行

3>通过变化不同的script,尝试绕过后台过滤机制

 

1. 反射型XSS(get)

 

 

 

 输入特殊字符’”<>6666,查看源代码可以发现没有任何过滤;

 

 

 

 

 

 

 只是限制了输入字符的长度,我们将他修改为2000;

 

 

 

 输入<script>alert("xss")</script>,弹窗成功;

 

 

 查看后台代码,发现并没有修改输入的东西,原封不动的输出;

 

 

 

 同时我们也可以看到这是一个get型的请求,我们将网址输入到浏览器中,弹框成功;

http://192.168.17.111/pikachu-master/pikachu-master/vul/xss/xss_reflected_get.php?message=%3Cscript%3Ealert%28%22xss%22%29%3C%2Fscript%3E&submit=submit

 

 

  

get与post的区别:get以url方式提交数据;post以表单方式在请求体里面提交

 

 

 

 

 

2. 存储型XSS

 

 

 

 提交留言后刷新,会一直显示留言,这就说明后台将数据存储起来;

 

 

 

 

 输入特殊字符 ‘”<>6666 发现没有被过滤,并查看前端代码;

 

 

 

 

 

 输入<script>alert(“xss”)</script>,会出现弹窗,刷新之后,还是显示这个窗;

 

 

 我们查看后台代码,即是把留言存储下来;

 

 

 

 

 

 

 

 

 

3. DOM型XSS(都是在前端操作的不涉及后端

DOM学习地址:https://www.w3school.com.cn/htmldom/index.asp

 

 

 

 

可以查看getElementById()这个方法:

 

 

 我们输入111,出来what do you see?

 

 

 

 查看页面源码,搜索what do you see 是什么;

 

 

 通过getElementById方法获取text,text就是我们要输入的内容,将text赋值给str,写到了href里面.通过最后一行输出。

 

 接下来我们构造闭合方式:

一 "<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)”>

 

输入四,出现>’what do you see? ,点击what do you see?  会出现弹窗111

 

 

 

 

 

 

 

 

 

 

 

4. DOM型XSS-X

输入111后;

 

 

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

 

 

 

 构造闭合方式:

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

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

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

四 #’ onclick=”alert(111)” >

 

 输入四,弹窗;

 

 

 

 

 

 

5. XSS-盲打

 

 

 我们输入数据后,提交;

 

 

 我们输入<script>alert(“xss”)</script>  提交后也没有其他内容输出;

 根据提示,我们登录后台,http://192.168.17.111/pikachu-master/pikachu-master/vul/xss/xssblind/admin.php

 

 

 

 

  

这种就是也是存储型的,将前端的数据存储到后台,后台如果没有进行过滤的话会使攻击者嵌入恶意代码进行登录获取到后台的信息。

 

 

 

6. XSS-过滤

Xss绕过-过滤-转换

前端绕过,我们直接可以抓包重放,或者修改html前端代码

大小写示例:<sCriPt>ALerT(222)</ScrIpt>

拼凑,示例:<scr<script>ipt>alert(222)</scri</script>pt>

使用注释进行干扰:<scri<!—test-->pt>alert(222)</sc<!—test-->ript>

 

Xss绕过-过滤-编码

后台过滤了特殊字符,比如<script>标签,但该标签可以被各种编码,后台不一定会过滤当浏览器对该编码进行识别时,会翻译成正常的标签,从而执行

编码也不能乱用,编码要在输出点被正常识别和翻译

 

输入<script>’666 查看输出结果;查看页面源码,发现script被过滤;

 

 

 

 

 

 

查看后端源码,只过滤了小写字母;

 

 

 

接下来我们使用大小写混合,输入<sCRiPT>alert(111)</ScriPT>  成功弹窗。

 

 

 

 

 

 

 

 

 

7. XSS-htmlspecialchars

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

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

 

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

&   转换为&

"   转换为"

'   转换为成为 '

<   转换为<

>   转换为>

 可用的引号类型:

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

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

ENT_NOQUOTES:不编码任何引号。

 

输入666'"<>&,查看显示结果和页面代码,我们可以看到’”<>都进行了编码;

 

 

 

 

 

使用单引号进行闭合q' onclick=alert'(111)'   弹窗成功;

 

 

 

可以看一眼,pikachu源码  使用函数,默认不对类型进行处理(没有指定类型)

 

 

 

 

 

 

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

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

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

 

 

 

 

8. XSS-herf输出

这里href里面如果做输出的话,应该怎么处理?

在输入时候只允许是http,https协议的才允许在这输出,否则的话就不允许输入。之后再进行htmlspecialchars函数过滤。

 

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

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

 

 

 

构造 javascript:alert(111)  成功弹窗;

 

 

 

 

 

 

 

 

 

 

9. XSS-js输出

这里讲输入动态的生成到了js中,形成xss

javascript里面是不会对tag和字符实体进行解释的,所以需要进行js转义

 

 

输入111查看网页源代码;

 

 

 

 

发现是把对应的输入放在了js里面,进行判断,在进行相应的输出

 

我们对这段代码进行构造闭合

 

<script>

    $ms='111';

    if($ms.length != 0){

        if($ms == 'tmac'){

            $('#fromjs').text('tmac确实厉害,看那小眼神..')

        }else {

//            alert($ms);

            $('#fromjs').text('无论如何不要放弃心中所爱..')

        }

 

    }

 

 

</script>

 

 

闭合:

<script>

    $ms='111</script><script>alert(xss)</script>';

    if($ms.length != 0){

        if($ms == 'tmac'){

            $('#fromjs').text('tmac确实厉害,看那小眼神..')

        }else {

//            alert($ms);

            $('#fromjs').text('无论如何不要放弃心中所爱..')

        }

 

    }

 

 

</script>

 

输入</script><script>alert(xss)</script>,成功弹窗;

 

 

 

这里如果进行html的实体编码,虽然可以解决XSS的问题,但是实体编码后的内容,在JS里面不会进行翻译,这样会导致前端的功能无法使用。

所以在JS的输出点应该使用(反斜杠)对特殊字符进行转义

 

原文地址:https://www.cnblogs.com/199904-04/p/12362590.html