zoukankan      html  css  js  c++  java
  • 2020/1/29 PHP代码审计之XSS漏洞

    0x00 XSS漏洞简介

    人们经常将跨站脚本攻击(Cross Site Scripting)缩写为CSS,但这会与层叠样式表(Cascading Style Sheets,CSS)的缩写混淆。因此,有人将跨站脚本攻击缩写为XSS。

    跨站脚本攻击是指恶意攻击者往Web页面里插入恶意Script代码,当用户浏览该页之时,嵌入其中Web里面的Script代码会被执行,从而达到恶意攻击用户的目的。
    xss漏洞通常是通过php的输出函数将javascript代码输出到html页面中,通过用户本地浏览器执行的,所以xss漏洞关键就是寻找参数未过滤的输出函数。
    常见的输出函数有: echo printf print print_r sprintf die var-dump var_export.

    xss 分类:(三类)

    反射型XSS:<非持久化> 攻击者事先制作好攻击链接, 需要欺骗用户自己去点击链接才能触发XSS代码(服务器中没有这样的页面和内容),一般容易出现在搜索页面。

    存储型XSS:<持久化> 代码是存储在服务器中的,如在个人信息或发表文章等地方,加入代码,如果没有过滤或过滤不严,那么这些代码将储存到服务器中,每当有用户访问该页面的时候都会触发代码执行,这种XSS非常危险,容易造成蠕虫,大量盗窃cookie(虽然还有种DOM型XSS,但是也还是包括在存储型XSS内)。

    DOM型XSS:基于文档对象模型Document Objeet Model,DOM)的一种漏洞。DOM是一个与平台、编程语言无关的接口,它允许程序或脚本动态地访问和更新文档内容、结构和样式,处理后的结果能够成为显示页面的一部分。DOM中有很多对象,其中一些是用户可以操纵的,如uRI ,location,refelTer等。客户端的脚本程序可以通过DOM动态地检查和修改页面内容,它不依赖于提交数据到服务器端,而从客户端获得DOM中的数据在本地执行,如果DOM中的数据没有经过严格确认,就会产生DOM XSS漏洞

    0x01 挖掘思路

    没有过滤的参数,传入到输出函数中。
    多关注以下一些地方:
    搜索内容
    发表文章
    留言
    评论回复
    资料设置

    0x02 反射型XSS

    常见场景:
    1:将前端获取的内容,直接输出到浏览器页面。

    $content = $_GET['content'];
    echo $content;
    

    ##2: 直接输出到HTML标签内

    <?
    $content = $_GET['content'];
    ?>
    <input type="text" value="<?php echo $content?>">
    

    这种是最常见的,我们需要闭合标签。

    3:直接输出到先闭合前面 然后插入我们的payload

    0x03 反射和存储的区别

    反射型:
    输入-输出
    存储型:
    输入-进入数据库-取出数据库-输出

    0x04 DOM型XSS

    代码:

    <?php
    $xss = $_GET['xss'];
    ?>
    <input type="text" id="text" value="<?php echo $xss;?>">
    <div id="print"></div>
    <script type="text/javascript">
        var text = document.getElementById("text");
        var print = document.getElementById("print");
        print.innerHTML = text.value;
     
    
    
    
    </script>
    

    payload:

    ?xss=<img src=x onerror=alert(/xss/)>
    

    DOM-XSS的数据流向是:URL-->浏览器

    0x05 修复方案

    1:在表单提交或者url参数传递前,对需要的参数进行过滤

    例如:在项目的web.xml配置过滤器:

    <filter>  
            <filter-name>XssEscape</filter-name>  
            <filter-class>XssFilter</filter-class>  
        </filter>  
        <filter-mapping>  
            <filter-name>XssEscape</filter-name>  
            <url-pattern>/*</url-pattern>  
        </filter-mapping>
    

    2:客户端做数据的验证与过滤,关键的过滤步骤在客户端进行
    3:过滤用户输入的 检查用户输入的内容中是否有非法内容。如<>(尖括号)、”(引号)、 ‘(单引号)、%(百分比符号)、;(分号)、()(括号)、&(& 符号)、+(加号)等。、严格控制输出

    可以利用下面这些函数对出现xss漏洞的参数进行过滤
    1、htmlspecialchars() 函数,用于转义处理在页面上显示的文本。
    2、htmlentities() 函数,用于转义处理在页面上显示的文本。
    3、strip_tags() 函数,过滤掉输入、输出里面的恶意标签。
    4、header() 函数,使用header("Content-type:application/json"); 用于控制 json 数据的头部,不用于浏览。
    5、urlencode() 函数,用于输出处理字符型参数带入页面链接中。
    6、intval() 函数用于处理数值型参数输出页面中。
    7、自定义函数,在大多情况下,要使用一些常用的 html 标签,以美化页面显示,如留言、小纸条。那么在这样的情况下,要采用白名单的方法使用合法的标签显示,过滤掉非法的字符。
    
    各语言示例:
      PHP的htmlentities()或是htmlspecialchars()。
       Python的cgi.escape()。
       ASP的Server.HTMLEncode()。
       ASP.NET的Server.HtmlEncode()或功能更强的Microsoft Anti-Cross Site Scripting Library
       Java的xssprotect(Open Source Library)。
       Node.js的node-validator。
    
  • 相关阅读:
    Vue-router 报NavigationDuplicated的可能解决方案
    go 数据类型转换
    在vscode 之中使用 GO MOD
    javascript格式化
    Mac node-sass 安装失败“v8::String::Utf8Value”
    Django 使用gunicorn 和 supervisord部署
    关于windows上的账号(权限)切换
    python中的global关键字
    暂时性的小总结
    windwos 安装下kafka的安装使用
  • 原文地址:https://www.cnblogs.com/wangtanzhi/p/12239918.html
Copyright © 2011-2022 走看看