• APP: yxcms

最后一波, go…

0x01 分析

分析了yxcms的model层后发现在底层实现了过滤,几乎所有的过滤都会走底层,那么如何实现过滤呢?

0x02 SQLi

第一处是我们的数字型注入,数字型注入无需引号。
位置于: apps/member/controller/photoController.php, 在r=member/photo/del调用的方法下,如果用post传如此部分代码:
屏幕快照 2019-11-14 下午2.06.22.png
首先$delid传入一个被implode成字符串的东西,implode方法传入的要是一个数组。而通过超全局变量传入程序的可以是字符串数组NULL三种, 这里我们可用通过dotype=del&delid[]=111&delid[]=222构造控制$delid变量,传入,单引号闭合。
经过photoModel直接来到model层的select 语句:

  1. <php
  2. public function select($condition = '', $field = '', $order = '', $limit = ''){
  3. return $this->model->table($this->table, $this->ignoreTablePrefix)->field($field)->where($condition)->order($order)->limit($limit)->select();
  4. }
  5. $condition = 'id in ([可控])'
  6. $field = 'id,photolist,sort,extfield,account'

传入cpMysql解析查询条件:
$condition = WHERE id in ([可控])

屏幕快照 2019-11-14 下午2.22.05.png最终落实在持久层的查询语句: SELECT id,photolist,sort,extfield,account FROM yx_photo WHERE id in (111) 因为这里是数字型内容,不用引号闭合,有没有检查和转化类型所以用户可以输入字符串又不需要引号闭合,构成了一处注入。

dotype=del&delid[]=1) and sleep(5)#
后边就可以盲注或显错了。

此处漏洞如何修补的呢:
屏幕快照 2019-11-14 下午2.36.59.png

intval,在开发的时候要特别注意拼接的整形参数,需要intval。至少还有一处:

  1. <?php
  2. public function colchange()
  3. {
  4. if('change'!=$_POST['dotype']) $this->error('操作类型错误~',url('photo/index'));
  5. if(empty($_POST['delid'])||empty($_POST['col'])) $this->error('您没有选择~',url('photo/index'));
  6. foreach($_POST['delid'] as $value){
  7. $changeid .= intval($value).',';
  8. }
  9. $changeid = substr($changeid,0,-1);
  10. $data['sort']=$_POST['col'];
  11. model('photo')->update("id in ('".$changeid."') and account='".$this->mesprefix.$this->auth['account']."'",$data);
  12. $this->success('栏目移动成功~',url('photo/index'));
  13. }

(也已经修复)