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

ChangeLog
t3lib/class.t3lib_div.php

index fab108a..4e7861d 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-06  Steffen Kamper  <steffen@typo3.org>
 
index 9d91807..f71e7af 100644 (file)
@@ -4445,17 +4445,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;
                }
        }
@@ -4498,6 +4500,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) {