> 上一篇文章,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';