The vulnerability can be triggered through the saveLayout() method
defined in /plugins/Dashboard/Controller.php:
```
210. public function saveLayout()
211. {
212. $this->checkTokenInUrl();
213.
214. $layout =
Common::unsanitizeInputValue(Common::getRequestVar('layout'));
215. $layout = strip_tags($layout);
216. $idDashboard = Common::getRequestVar('idDashboard', 1, 'int');
217. $name = Common::getRequestVar('name', '', 'string');
218.
219. if (Piwik::isUserIsAnonymous()) {
220. $session = new SessionNamespace("Dashboard");
221. $session->dashboardLayout = $layout;
222. $session->setExpirationSeconds(1800);
```
User input passed by anonymous users through the "layout" request
parameter is being stored into
a session variable at line 221, and this is possible by invoking an URL
like this:
```
http://[piwik]/index.php?module=Dashboard&action=saveLayout&token_auth=anonymous&layout=[injection]%26%2365536;
```
Since Piwik is not using "utf8mb4" collations for its database, this can
be exploited in combination with a MySQL
UTF8 truncation issue in order to corrupt the session array, allowing
unauthenticated attackers to inject arbitrary
PHP objects into the application scope and carry out Server-Side Request
Forgery (SSRF) attacks, delete arbitrary
files, execute arbitrary PHP code, and possibly other attacks.
Successful exploitation of this vulnerability
requires Piwik to use the database to store session data (dbtable
option) and the application running on
PHP before version 5.4.45, 5.5.29, or 5.6.13.
暂无评论