> 上一篇文章,SQL注入由orderBy($order)函数过滤不严格导致。但是,这个函数对传进的参数进行了一系列过滤,导致getshell的条件比较苛刻。不甘心,于是乎找了一个比较好利用的地方。我只是以这个模块的一个函数为例,其它未提到的地方仍然很有可能存在注入。

一、问题的根源

> 问题出现在limit($limit)函数,它对传进的参数没有经过任何过滤就直接拼接成SQL语句进行查询。

// D:\wamp\www\zentao826\lib\base\dao\dao.class.php
public function limit($limit)
{
    if($this->inCondition and !$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';

点击收藏 | 0 关注 | 0
  • 动动手指,沙发就是你的了!
登录 后跟帖