SQL注入由 orderBy($order) 函数过滤不严格导致。但是,这个函数对传进的参数进行了一系列过滤,导致 getshell 的条件比较苛刻。不甘心,于是乎找了一个比较好利用的地方。我只是以这个模块的一个函数为例,其它未提到的地方仍然很有可能存在注入。
一、问题的根源
问题出现在 limit($limit) 函数,它对传进的参数没有经过任何过滤就直接拼接成SQL语句进行查询。
// D:\wamp\www\zentao826\lib\base\dao\dao.class.php public function limit($limit) { if($this->inConditionand !$this->conditionIsTrue) return $this; if(empty($limit)) return $this; stripos($limit, 'limit') !== false ? $this->sql .= " $limit " : $this->sql .= ' ' . DAO::LIMIT . " $limit "; return $this; } |
二、利用点
把这个函数在控制器文件中搜索了一下, ->limit($ 只出现在了 module\block\control.php 中,。这个模块中只有 main() 函数是最重要的函数,其它函数都是通过传参进行回调的。直接切入重点吧
// 288行 public function main($module = '', $id = 0) { // 代码省略 $mode = strtolower($this->get->mode); if($mode == 'getblocklist') { // 代码省略 } elseif($mode == 'getblockdata') { // 需要base64编码 $code = strtolower($this->get->blockid); $params = $this->get->param; $params = json_decode(base64_decode($params)); // 这里需要编码 // 代码省略 $this->viewType = (isset($params->viewType) and $params->viewType == 'json') ? 'json' : 'html'; $this->params = $params; $this->view->code = $this->get->blockid; $func = 'print' . ucfirst($code) . 'Block'; if(method_exists('block', $func)) { $this->$func($module); // 在这里进行了动态调用 } else { $this->view->data = $this->block->$func($mo |