zoukankan      html  css  js  c++  java
  • pikachu靶场-XSS

    一、概述

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


    XSS漏洞一直被评估为web漏洞中危害较大的漏洞,在OWASP TOP10的排名中一直属于前三的江湖地位。
    XSS是一种发生在前端浏览器端的漏洞,所以其危害的对象也是前端用户。
    形成XSS漏洞的主要原因是程序对输入和输出没有做合适的处理,导致“精心构造”的字符输出在前端时被浏览器当作有效代码解析执行从而产生危害。
    因此在XSS漏洞的防范上,一般会采用“对输入进行过滤”和“输出进行转义”的方式进行处理:
        1.输入过滤:对输入进行过滤,不允许可能导致XSS攻击的字符输入;
        2.输出转义:根据输出点的位置对输出到前端的内容进行适当转义;

    二、反射型XSS(get)

     ①在前端html修改可输入长度,方便注入语句的使用。

     ②输入<script>alert('xss')</script>

    get形式的XSS会生成相应的url是比较好利用的一种漏洞。

    三、反射型XSS(post)

    ①首先登陆 admin-123456

    ② 输入<script>alert('XSS')</script>

     

     并且我们观察浏览器发现post的漏洞并不会在url中显示出来。

    四、存储型XSS

     ①输入<script>alert("xss")</script>

     这类漏洞危害大,注入语句会写入数据库中,每次进入都会执行。

    五、DOM型XSS

    ①什么是DOM?

    DOM 是 W3C(万维网联盟)的标准。

    DOM 定义了访问 HTML 和 XML 文档的标准:

    “W3C 文档对象模型 (DOM) 是中立于平台和语言的接口,它允许程序和脚本动态地访问和更新文档的内容、结构和样式。”

    W3C DOM 标准被分为 3 个不同的部分:

    • 核心 DOM - 针对任何结构化文档的标准模型
    • XML DOM - 针对 XML 文档的标准模型
    • HTML DOM - 针对 HTML 文档的标准模型

    编者注:DOM 是 Document Object Model(文档对象模型)的缩写。

    ②漏洞利用

    DOM可以理解为访问HTML的标准接口,DOM里面会把我们的HTML分成一个DOM树

    我们可以以这棵树为入口,通过DOM的某些方法对树进行操作,比如对标签的添加、改变和删除等等。

    DOM相当于在前端提供了一个 通过JS去对HTML进行操作 的接口

    ③观察源码

    function domxss(){
    var str = document.getElementById("text").value;
    document.getElementById("dom").innerHTML = "<a href='"+str+"'>what do you see?</a>";
    }
    //试试:'><img src="#" onmouseover="alert('xss')">
    //试试:' onclick="alert('xss')">,闭合掉就行 
    

      

     在此的js代码,通过getElementById获取到了标签ID为text的内容赋值给str,然后把str的内容通过字符串拼接的方式写到了a标签的href属性中,a标签会写到id为dom的div标签中

     

    从上面可以看出来,通过value方式将text的值赋值为str,也就是框里面的值,然后通过innerHTML将标签内的值取出来,比如<label id="lb1">this is a label</label>,取出来的值就是this is a label。所以结合前面的'做一个闭合,像<script>这种有前后标签闭合的就不太方便用了,用提示里面的onclick来构造,' onclick=alert('xss')>就可以了。

    ④构造闭合语句

    ' onclick=alert('xss')>

    六、DOM型XSS-X

     ①观察源码

    function domxss(){
    var str = window.location.search;
    var txss = decodeURIComponent(str.split("text=")[1]);
    var xss = txss.replace(/+/g,' ');
    // alert(xss);
    document.getElementById("dom").innerHTML = "<a href='"+xss+"'>就让往事都随风,都随风吧</a>";
    }
    //试试:'><img src="#" onmouseover="alert('xss')">
    //试试:' onclick="alert('xss')">,闭合掉就行
    

    window.location.search该属性获取页面 URL 地址,window.location 对象所包含的属性如下: 

     ②构造语句' onclick=alert('xss')>

     这一关和上一关的区别在于,这里的值是从URL中获取到的,就像反射型XSS一样。

    七、XSS之盲打

     盲打并不是一种攻击类型,而是一种场景,输入的东西并不会在前端显示,而是提交到了后台。

     登录后台发现受到了攻击

    八、XSS之过滤

    ①输入一些符号进行测试。

    输入 "'<>/

    结果发现符号似乎都没有被过滤掉。

    ②输入<script>alert('xss')</script>

    但是发现script似乎被过滤掉了

    ③大小写试试

    输入 <sCRipt>alert('xss')</sCRipt>

    直接成功了

     ④观察源码

    $html = '';
    if(isset($_GET['submit']) && $_GET['message'] != null){
        //这里会使用正则对<script进行替换为空,也就是过滤掉
        $message=preg_replace('/<(.*)s(.*)c(.*)r(.*)i(.*)p(.*)t/', '', $_GET['message']);
        if($message == 'yes'){
            $html.="<p>那就去人民广场一个人坐一会儿吧!</p>";
        }else{
            $html.="<p>别说这些'{$message}'的话,不要怕,就是干!</p>";
        }
    }
    
    

      我们发现这里是对script进行了过滤,双写也就不能绕过了,没有区分大小写所以可以绕过。

    九、XSS之htmlspecialchars

     ①了解一下htmlspecialchars(),函数把一些预定义的字符转换为HTML实体,下列都是预定义字符。

    • & (和号) 成为 &amp;
    • " (双引号) 成为 &quot;
    • ' (单引号) 成为 &#039;
    • < (小于) 成为 &lt;
    • > (大于) 成为 &gt;

    这里我们需要注意,默认情况的编码是不会对’(单引号)进行编码的,尝试利用它来构造

    首先我们试试onclick=alert(‘xss’)

    这里发现后面多出了一个’ 干脆在alert前面再加一个’单引号 'onclick='alert('xss')

    发现还是不太行,最后直接用双引号替换掉xss的单引号

    ' onclick='alert("xss")'

     输入: ’ onclick=‘alert(“xss”)

     成功闭合,并且弹窗,不过这里双引号居然也没有被转义,查了后台php,确实是默认的编码风格,有点奇怪,当然如果被转义这里也可以弹整形类的嘛,影响不大,经过了大量测试,应该是被当作字符串处理了,所以就没有被当作标签进行转义。

    十、XSS之href输出

    查看源码,这次htmlspecialchars函数使用了ENT_QUOTES类,也加上了对单引号的转义,但是在a标签的href属性里面,可以使用javascript协议来执行js 

    javascript:alert(123)

     源码

    $html='';
    if(isset($_GET['submit'])){
        if(empty($_GET['message'])){
            $html.="<p class='notice'>叫你输入个url,你咋不听?</p>";
        }
        if($_GET['message'] == 'www.baidu.com'){
            $html.="<p class='notice'>我靠,我真想不到你是这样的一个人</p>";
        }else {
            //输出在a标签的href属性里面,可以使用javascript协议来执行js
            //防御:只允许http,https,其次在进行htmlspecialchars处理
            $message=htmlspecialchars($_GET['message'],ENT_QUOTES);
            $html.="<a href='{$message}'> 阁下自己输入的url还请自己点一下吧</a>";
        }
    }
    
    

      

    十一、XSS之js输出

     ①查看源码

    <script>
        $ms='1';
        if($ms.length != 0){
            if($ms == 'tmac'){
                $('#fromjs').text('tmac确实厉害,看那小眼神..')
            }else {
    //            alert($ms);
                $('#fromjs').text('无论如何不要放弃心中所爱..')
            }
    
        }
    </script>
    

      输入tmac,诶呦不错呦。

     ②这里使用的时候应该是先把之前的<script>给闭合,然后就可以执行自己的JS了。</script><script>alert('xss')</script>,直接成功弹框。

    这里讲输入动态的生成到了js中形成xss,javascript里面是不会对tag和字符实体进行解释的,所以需要进行js转义
    //讲这个例子主要是为了让你明白,输出点在js中的xss问题,应该怎么修?
    //这里如果进行html的实体编码,虽然可以解决XSS的问题,但是实体编码后的内容,在JS里面不会进行翻译,这样会导致前端的功能无法使用。
    //所以在JS的输出点应该使用对特殊字符进行转义

  • 相关阅读:
    php 解析xml
    php
    php 设置自动加载某个页面
    Mac
    mysql
    Git
    C#
    C# 正则表达式
    C# ASCII码排序
    (转)datagridview 自定义列三步走
  • 原文地址:https://www.cnblogs.com/c1047509362/p/12628722.html
Copyright © 2011-2022 走看看