這個注入與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...