ThinkPHP3 2 3框架exp注入

2022-08-24 20:06:11 字數 3252 閱讀 8678

這個注入與bind注入差不多

直接在indexcontroller.class.php中建立乙個demo

public function index()
資料庫配置:

<?php 

return array(

//'配置項'=>'配置值'

'db_type' => 'mysql',

'db_host' => 'localhost',

'db_name' => 'thinkphp',

'db_user' => 'root',

'db_pwd' => 'root',

'db_port' => '3306',

'db_fields_cache' => true,

'show_page_trace' => true,

);

payload:

indexcontroller.class.php

<?php 

namespace home\controller;

use think\controller;

class indexcontroller extends controller

}

可以看到這裡並沒有使用i函式使用i函式則不會產生exp注入),原因我們在之後分析,我們先來分析這個注入。直接跟入where函式:

可以看到跟以前一樣,由於傳入的是陣列,直接將id陣列賦值給了$this->options['where'],然後返回。

繼續跟入find,還是跟以前一樣,需要關注的兩個位置是:

$options            =   $this->_parseoptions($options);

$resultset = $this->db->select($options);

先來跟入$this->_parseoptions($options);

/**

* 分析表示式

* @access protected

* @param array $options 表示式引數

* @return array

*/protected function _parseoptions($options=array()) else

// 資料表別名

if(!empty($options['alias']))

// 記錄操作的模型名稱

$options['model'] = $this->name;

// 字段型別驗證

if(isset($options['where']) && is_array($options['where']) && !empty($fields) && !isset($options['join']))

}elseif(!is_numeric($key) && '_' != substr($key,0,1) && false === strpos($key,'.') && false === strpos($key,'(') && false === strpos($key,'|') && false === strpos($key,'&'))

unset($options['where'][$key]);}}

}// 查詢過後清空sql表示式組裝 避免影響下次查詢

$this->options = array();

// 表示式過濾

$this->_options_filter($options);

return $options;

}

可以看到由於傳入陣列所以在if(is_scalar($val))處並沒有進入_parsetype進行型別轉換,最後返回,接下分析$this->db->select($options):

繼續進入$this->buildselectsql($options);:

然後是$this->parsesql($this->selectsql,$options);:

之後重點在這個parsewhere中的parsewhereitem函式,和bind基本一樣。

可以看到在parsewhereitem直接進行了拼接,拼接結果為:

`id` =1 and updatexml(1,concat(0x7,user(),0x7e),1)
最後返回最終拼接結果為:

造成了sql注入。

最後回到一開始的i函式問題,在i函式內部的think_filter中,對exp進行了正則匹配,如果匹配到了會在其後面加空格,從而使得後面的將會對其進行處理無法正確拼接sql注入語句。

在取出傳入引數時使用i函式即可避免產生exp注入。

thinkphp漏洞分析集合

**審計之thinkphp3.2.3

ThinkPHP3 2 3使用分頁

todo 基礎分頁的相同 封裝,使前台的 更少 param count 要分頁的總記錄數 param int pagesize 每頁查詢條數 return think page function getpage count,pagesize 10 控制器中使用的 如下 public function...

ThinkPHP3 2 3使用分頁

thinkphp3.2.3使用分頁 首先要搞清楚的就是thinkphp3.2.3的分頁類已經被移到了think page.class.php,這是跟以前的版本有些不一樣的,使用起來還是跟以前版本差不多,但是預設的效果不敢恭維,所以最好是自己加些樣式。todo 基礎分頁的相同 封裝,使前台的 更少 p...

ThinkPHP3 2 3目錄結構

在第一次訪問應用入口檔案的時候,會顯示如圖所示的預設的歡迎頁面,並自動生成了乙個預設的應用模組home。common 應用公共模組 common 應用公共函式目錄 conf 應用公共配置檔案目錄 home 預設生成的home模組 conf 模組配置檔案目錄 common 模組函式公共目錄 contr...