Fixed bug #16593: It is possible to bypass 'verifyFilenameAgainstDenyPattern'
authorOliver Hader <oliver.hader@typo3.org>
Thu, 16 Dec 2010 13:42:34 +0000 (13:42 +0000)
committerOliver Hader <oliver.hader@typo3.org>
Thu, 16 Dec 2010 13:42:34 +0000 (13:42 +0000)
git-svn-id: https://svn.typo3.org/TYPO3v4/Core/branches/TYPO3_4-4@9797 709f56b5-9817-0410-a4d7-c38de5d9e867

ChangeLog
t3lib/class.t3lib_div.php

index c198e22..5ad14e4 100755 (executable)
--- a/ChangeLog
+++ b/ChangeLog
@@ -7,6 +7,7 @@
        * Fixed bug #15735: FORM content object is susceptible to XSS (thanks to Benjamin Mack)
        * Fixed bug #16362: Directory traversal attack in em_unzip
        * Fixed bug #16485: Cross-Site Scripting in showpic functionality
+       * Fixed bug #16593: It is possible to bypass 'verifyFilenameAgainstDenyPattern'
 
 2010-12-07  Christian Kuhn  <lolli@schwarzbu.ch>
 
index f985a60..e8a5594 100644 (file)
@@ -4331,17 +4331,19 @@ final class t3lib_div {
 
        /**
         * Checks for malicious file paths.
-        * Returns true if no '//', '..' or '\' is in the $theFile
+        *
+        * Returns TRUE if no '//', '..', '\' or control characters are found in the $theFile.
         * This should make sure that the path is not pointing 'backwards' and further doesn't contain double/back slashes.
         * So it's compatible with the UNIX style path strings valid for TYPO3 internally.
         * Usage: 14
         *
         * @param       string          Filepath to evaluate
-        * @return      boolean         True, if no '//', '\', '/../' is in the $theFile and $theFile doesn't begin with '../'
+        * @return      boolean         TRUE, $theFile is allowed path string
+        * @see         http://php.net/manual/en/security.filesystem.nullbytes.php
         * @todo        Possible improvement: Should it rawurldecode the string first to check if any of these characters is encoded ?
         */
        public static function validPathStr($theFile)   {
-               if (strpos($theFile, '//')===false && strpos($theFile, '\\')===false && !preg_match('#(?:^\.\.|/\.\./)#', $theFile)) {
+               if (strpos($theFile, '//') === FALSE && strpos($theFile, '\\') === FALSE && !preg_match('#(?:^\.\.|/\.\./|[[:cntrl:]])#', $theFile)) {
                        return true;
                }
        }
@@ -4382,6 +4384,11 @@ final class t3lib_div {
         * @return      boolean
         */
        public static function verifyFilenameAgainstDenyPattern($filename)      {
+                       // Filenames are not allowed to contain control characters:
+               if (preg_match('/[[:cntrl:]]/', $filename)) {
+                       return FALSE;
+               }
+
                if (strcmp($filename,'') && strcmp($GLOBALS['TYPO3_CONF_VARS']['BE']['fileDenyPattern'],''))    {
                        $result = preg_match('/'.$GLOBALS['TYPO3_CONF_VARS']['BE']['fileDenyPattern'].'/i',$filename);
                        if ($result)    return false;   // so if a matching filename is found, return false;