VYPR
Moderate severityNVD Advisory· Published Oct 16, 2009· Updated Apr 23, 2026

CVE-2009-3696

CVE-2009-3696

Description

Cross-site scripting (XSS) vulnerability in phpMyAdmin 2.11.x before 2.11.9.6 and 3.x before 3.2.2.1 allows remote attackers to inject arbitrary web script or HTML via a crafted name for a MySQL table.

AI Insight

LLM-synthesized narrative grounded in this CVE's description and references.

Cross-site scripting vulnerability in phpMyAdmin allows remote attackers to inject arbitrary web script or HTML via a crafted MySQL table name.

## Vulnerability phpMyAdmin versions 2.11.x before 2.11.9.6 and 3.x before 3.2.2.1 contain a cross-site scripting (XSS) vulnerability. The issue lies in improper sanitization of MySQL table names, allowing an attacker to inject arbitrary HTML and JavaScript. This occurs when a crafted table name is processed by the application. The vulnerability is described in PMASA-2009-6 [2].

Exploitation

An attacker can exploit this vulnerability by creating or crafting a MySQL table with a malicious name containing script code. When a user views or interacts with such a table within phpMyAdmin, the injected script executes in the context of the user's session. No authentication is required if the attacker can create tables, but typical exploitation requires database write access or social engineering to have an administrator create the table [1][3].

Impact

Successful exploitation allows remote attackers to inject arbitrary web script or HTML, leading to potential session hijacking, defacement, or theft of sensitive information within the phpMyAdmin session. The XSS executes in the user's browser with the privileges of the logged-in user [1].

Mitigation

The vulnerability is fixed in phpMyAdmin versions 2.11.9.6 and 3.2.2.1, released on or around October 13, 2009 [2]. Users are advised to upgrade immediately. Red Hat released updated packages for Fedora 10, 11, and 12 [2]. No workarounds are documented; upgrading is the recommended mitigation [1][3].

AI Insight generated on May 23, 2026. Synthesized from this CVE's description and the cited reference URLs; citations are validated against the source bundle.

Affected packages

Versions sourced from the GitHub Security Advisory.

PackageAffected versionsPatched versions
phpmyadmin/phpmyadminPackagist
>= 2.11.0, < 2.11.9.62.11.9.6
phpmyadmin/phpmyadminPackagist
>= 3.0.0, < 3.2.2.13.2.2.1

Affected products

71
  • cpe:2.3:a:phpmyadmin:phpmyadmin:2.11.0:*:*:*:*:*:*:*+ 69 more
    • cpe:2.3:a:phpmyadmin:phpmyadmin:2.11.0:*:*:*:*:*:*:*
    • cpe:2.3:a:phpmyadmin:phpmyadmin:2.11.0.0:*:*:*:*:*:*:*
    • cpe:2.3:a:phpmyadmin:phpmyadmin:2.11.0:beta1:*:*:*:*:*:*
    • cpe:2.3:a:phpmyadmin:phpmyadmin:2.11.0beta1:*:*:*:*:*:*:*
    • cpe:2.3:a:phpmyadmin:phpmyadmin:2.11.0:rc1:*:*:*:*:*:*
    • cpe:2.3:a:phpmyadmin:phpmyadmin:2.11.1:*:*:*:*:*:*:*
    • cpe:2.3:a:phpmyadmin:phpmyadmin:2.11.1.0:*:*:*:*:*:*:*
    • cpe:2.3:a:phpmyadmin:phpmyadmin:2.11.1.1:*:*:*:*:*:*:*
    • cpe:2.3:a:phpmyadmin:phpmyadmin:2.11.1.2:*:*:*:*:*:*:*
    • cpe:2.3:a:phpmyadmin:phpmyadmin:2.11.1:rc1:*:*:*:*:*:*
    • cpe:2.3:a:phpmyadmin:phpmyadmin:2.11.2:*:*:*:*:*:*:*
    • cpe:2.3:a:phpmyadmin:phpmyadmin:2.11.2.0:*:*:*:*:*:*:*
    • cpe:2.3:a:phpmyadmin:phpmyadmin:2.11.2.1:*:*:*:*:*:*:*
    • cpe:2.3:a:phpmyadmin:phpmyadmin:2.11.2.2:*:*:*:*:*:*:*
    • cpe:2.3:a:phpmyadmin:phpmyadmin:2.11.3:*:*:*:*:*:*:*
    • cpe:2.3:a:phpmyadmin:phpmyadmin:2.11.3.0:*:*:*:*:*:*:*
    • cpe:2.3:a:phpmyadmin:phpmyadmin:2.11.3:rc1:*:*:*:*:*:*
    • cpe:2.3:a:phpmyadmin:phpmyadmin:2.11.4:*:*:*:*:*:*:*
    • cpe:2.3:a:phpmyadmin:phpmyadmin:2.11.4.0:*:*:*:*:*:*:*
    • cpe:2.3:a:phpmyadmin:phpmyadmin:2.11.4:rc1:*:*:*:*:*:*
    • cpe:2.3:a:phpmyadmin:phpmyadmin:2.11.5:*:*:*:*:*:*:*
    • cpe:2.3:a:phpmyadmin:phpmyadmin:2.11.5.0:*:*:*:*:*:*:*
    • cpe:2.3:a:phpmyadmin:phpmyadmin:2.11.5.1:*:*:*:*:*:*:*
    • cpe:2.3:a:phpmyadmin:phpmyadmin:2.11.5.2:*:*:*:*:*:*:*
    • cpe:2.3:a:phpmyadmin:phpmyadmin:2.11.5:rc1:*:*:*:*:*:*
    • cpe:2.3:a:phpmyadmin:phpmyadmin:2.11.6:*:*:*:*:*:*:*
    • cpe:2.3:a:phpmyadmin:phpmyadmin:2.11.6.0:*:*:*:*:*:*:*
    • cpe:2.3:a:phpmyadmin:phpmyadmin:2.11.6:rc1:*:*:*:*:*:*
    • cpe:2.3:a:phpmyadmin:phpmyadmin:2.11.7:*:*:*:*:*:*:*
    • cpe:2.3:a:phpmyadmin:phpmyadmin:2.11.7.0:*:*:*:*:*:*:*
    • cpe:2.3:a:phpmyadmin:phpmyadmin:2.11.8:*:*:*:*:*:*:*
    • cpe:2.3:a:phpmyadmin:phpmyadmin:2.11.9:*:*:*:*:*:*:*
    • cpe:2.3:a:phpmyadmin:phpmyadmin:2.11.9.0:*:*:*:*:*:*:*
    • cpe:2.3:a:phpmyadmin:phpmyadmin:2.11.9.1:*:*:*:*:*:*:*
    • cpe:2.3:a:phpmyadmin:phpmyadmin:2.11.9.2:*:*:*:*:*:*:*
    • cpe:2.3:a:phpmyadmin:phpmyadmin:2.11.9.3:*:*:*:*:*:*:*
    • cpe:2.3:a:phpmyadmin:phpmyadmin:2.11.9.4:*:*:*:*:*:*:*
    • cpe:2.3:a:phpmyadmin:phpmyadmin:2.11.9.5:*:*:*:*:*:*:*
    • cpe:2.3:a:phpmyadmin:phpmyadmin:3.0.0:*:*:*:*:*:*:*
    • cpe:2.3:a:phpmyadmin:phpmyadmin:3.0.0-alpha:*:*:*:*:*:*:*
    • cpe:2.3:a:phpmyadmin:phpmyadmin:3.0.0-beta:*:*:*:*:*:*:*
    • cpe:2.3:a:phpmyadmin:phpmyadmin:3.0.0:rc1:*:*:*:*:*:*
    • cpe:2.3:a:phpmyadmin:phpmyadmin:3.0.1:*:*:*:*:*:*:*
    • cpe:2.3:a:phpmyadmin:phpmyadmin:3.0.1.1:*:*:*:*:*:*:*
    • cpe:2.3:a:phpmyadmin:phpmyadmin:3.0.1:rc1:*:*:*:*:*:*
    • cpe:2.3:a:phpmyadmin:phpmyadmin:3.1.0:*:*:*:*:*:*:*
    • cpe:2.3:a:phpmyadmin:phpmyadmin:3.1.0.0:*:*:*:*:*:*:*
    • cpe:2.3:a:phpmyadmin:phpmyadmin:3.1.0-beta1:*:*:*:*:*:*:*
    • cpe:2.3:a:phpmyadmin:phpmyadmin:3.1.1:*:*:*:*:*:*:*
    • cpe:2.3:a:phpmyadmin:phpmyadmin:3.1.1:rc1:*:*:*:*:*:*
    • cpe:2.3:a:phpmyadmin:phpmyadmin:3.1.2:*:*:*:*:*:*:*
    • cpe:2.3:a:phpmyadmin:phpmyadmin:3.1.2:rc1:*:*:*:*:*:*
    • cpe:2.3:a:phpmyadmin:phpmyadmin:3.1.3:*:*:*:*:*:*:*
    • cpe:2.3:a:phpmyadmin:phpmyadmin:3.1.3.1:*:*:*:*:*:*:*
    • cpe:2.3:a:phpmyadmin:phpmyadmin:3.1.3:1:*:*:*:*:*:*
    • cpe:2.3:a:phpmyadmin:phpmyadmin:3.1.3.2:*:*:*:*:*:*:*
    • cpe:2.3:a:phpmyadmin:phpmyadmin:3.1.3:rc1:*:*:*:*:*:*
    • cpe:2.3:a:phpmyadmin:phpmyadmin:3.1.4:*:*:*:*:*:*:*
    • cpe:2.3:a:phpmyadmin:phpmyadmin:3.1.4:rc2:*:*:*:*:*:*
    • cpe:2.3:a:phpmyadmin:phpmyadmin:3.1.5:*:*:*:*:*:*:*
    • cpe:2.3:a:phpmyadmin:phpmyadmin:3.1.5:rc1:*:*:*:*:*:*
    • cpe:2.3:a:phpmyadmin:phpmyadmin:3.2.0:*:*:*:*:*:*:*
    • cpe:2.3:a:phpmyadmin:phpmyadmin:3.2.0.1:*:*:*:*:*:*:*
    • cpe:2.3:a:phpmyadmin:phpmyadmin:3.2.0-beta1:*:*:*:*:*:*:*
    • cpe:2.3:a:phpmyadmin:phpmyadmin:3.2.0:rc1:*:*:*:*:*:*
    • cpe:2.3:a:phpmyadmin:phpmyadmin:3.2.1:*:*:*:*:*:*:*
    • cpe:2.3:a:phpmyadmin:phpmyadmin:3.2.1:rc1:*:*:*:*:*:*
    • cpe:2.3:a:phpmyadmin:phpmyadmin:3.2.2:*:*:*:*:*:*:*
    • cpe:2.3:a:phpmyadmin:phpmyadmin:3.2.2:rc1:*:*:*:*:*:*
    • (no CPE)range: <2.11.9.6, >=3.0.0 <3.2.2.1
  • ghsa-coords
    Range: >= 2.11.0, < 2.11.9.6

Patches

2
212daad0c082

[security] XSS and SQL injection

https://github.com/phpmyadmin/phpmyadminMarc DelisleOct 12, 2009via ghsa
4 files changed · +20 14
  • ChangeLog+3 0 modified
    @@ -11,6 +11,9 @@ $HeadURL: https://phpmyadmin.svn.sourceforge.net/svnroot/phpmyadmin/trunk/phpMyA
     - [core] do not automatically set and create TempDir, it might lead to security
       issue (thanks to Thijs Kinkhorst)
     
    +2.11.9.6 (2009-10-12)
    +- [security] XSS and SQL injection, thanks to Herman van Rink
    +
     2.11.9.5 (2009-03-24)
     - [security] XSS vulnerability on export page
     - [security] Insufficient output sanitizing when generating configuration file
    
  • db_operations.php+1 1 modified
    @@ -463,7 +463,7 @@
             <?php
             while ($pages = @PMA_DBI_fetch_assoc($test_rs)) {
                 echo '                <option value="' . $pages['page_nr'] . '">'
    -                . $pages['page_nr'] . ': ' . $pages['page_descr'] . '</option>' . "\n";
    +                . $pages['page_nr'] . ': ' . htmlspecialchars($pages['page_descr']) . '</option>' . "\n";
             } // end while
             PMA_DBI_free_result($test_rs);
             unset($test_rs);
    
  • pdf_pages.php+6 6 modified
    @@ -273,7 +273,7 @@
                 if (isset($chpage) && $chpage == $curr_page['page_nr']) {
                     echo ' selected="selected"';
                 }
    -            echo '>' . $curr_page['page_nr'] . ': ' . $curr_page['page_descr'] . '</option>';
    +            echo '>' . $curr_page['page_nr'] . ': ' . htmlspecialchars($curr_page['page_descr']) . '</option>';
             } // end while
             echo "\n";
             ?>
    @@ -426,12 +426,12 @@ function resetDrag() {
                 echo "\n" . '        <td>'
                      . "\n" . '            <select name="c_table_' . $i . '[name]">';
                 foreach ($selectboxall AS $key => $value) {
    -                echo "\n" . '                <option value="' . $value . '"';
    +                echo "\n" . '                <option value="' . htmlspecialchars($value) . '"';
                     if ($value == $sh_page['table_name']) {
                         echo ' selected="selected"';
                         $tabExist[$_mtab] = TRUE;
                     }
    -                echo '>' . $value . '</option>';
    +                echo '>' . htmlspecialchars($value) . '</option>';
                 } // end while
                 echo "\n" . '            </select>'
                      . "\n" . '        </td>';
    @@ -459,7 +459,7 @@ function resetDrag() {
             echo "\n" . '        <td>'
                  . "\n" . '            <select name="c_table_' . $i . '[name]">';
             foreach ($selectboxall AS $key => $value) {
    -            echo "\n" . '                <option value="' . $value . '">' . $value . '</option>';
    +            echo "\n" . '                <option value="' . htmlspecialchars($value) . '">' . htmlspecialchars($value) . '</option>';
             }
             echo "\n" . '            </select>'
                  . "\n" . '        </td>';
    @@ -490,8 +490,8 @@ function resetDrag() {
         if (!empty($tabExist) && is_array($tabExist)) {
             foreach ($tabExist AS $key => $value) {
                 if (!$value) {
    -                $_strtrans  .= '<input type="hidden" name="delrow[]" value="' . $key . '" />' . "\n";
    -                $_strname   .= '<li>' . $key . '</li>' . "\n";
    +                $_strtrans  .= '<input type="hidden" name="delrow[]" value="' . htmlspecialchars($key) . '" />' . "\n";
    +                $_strname   .= '<li>' . htmlspecialchars($key) . '</li>' . "\n";
                     $shoot       = TRUE;
                 }
             }
    
  • pmd_pdf.php+10 7 modified
    @@ -23,26 +23,29 @@
     
         $pmd_table = PMA_backquote($GLOBALS['cfgRelation']['db']) . '.' . PMA_backquote($GLOBALS['cfgRelation']['designer_coords']);
         $pma_table = PMA_backquote($GLOBALS['cfgRelation']['db']) . '.' . PMA_backquote($cfgRelation['table_coords']);
    +    $scale_q = PMA_sqlAddslashes($scale);
    +    $pdf_page_number_q = PMA_sqlAddslashes($pdf_page_number);
     
         if (isset($exp)) {
     
    -        $sql = "REPLACE INTO " . $pma_table . " (db_name, table_name, pdf_page_number, x, y) SELECT db_name, table_name, " . $pdf_page_number . ", ROUND(x/" . $scale . ") , ROUND(y/" . $scale . ") y FROM " . $pmd_table . " WHERE db_name = '" . $db . "'";
    +        $sql = "REPLACE INTO " . $pma_table . " (db_name, table_name, pdf_page_number, x, y) SELECT db_name, table_name, " . $pdf_page_number_q . ", ROUND(x/" . $scale_q . ") , ROUND(y/" . $scale_q . ") y FROM " . $pmd_table . " WHERE db_name = '" . PMA_sqlAddslashes($db) . "'";
     
             PMA_query_as_cu($sql,TRUE,PMA_DBI_QUERY_STORE);
         }
     
         if (isset($imp)) {
             PMA_query_as_cu(
             'UPDATE ' . $pma_table . ',' . $pmd_table .
    -        ' SET ' . $pmd_table . '.`x`= ' . $pma_table . '.`x` * '. $scale . ',
    -        ' . $pmd_table . '.`y`= ' . $pma_table . '.`y` * '.$scale.'
    +        ' SET ' . $pmd_table . '.`x`= ' . $pma_table . '.`x` * '. $scale_q . ',
    +        ' . $pmd_table . '.`y`= ' . $pma_table . '.`y` * '. $scale_q .'
             WHERE
             ' . $pmd_table . '.`db_name`=' . $pma_table . '.`db_name`
             AND
             ' . $pmd_table . '.`table_name` = ' . $pma_table . '.`table_name`
             AND
    -        ' . $pmd_table . '.`db_name`=\''.$db.'\'
    -        AND pdf_page_number = '.$pdf_page_number.';',TRUE,PMA_DBI_QUERY_STORE);     }
    +        ' . $pmd_table . '.`db_name`=\''. PMA_sqlAddslashes($db) .'\'
    +        AND pdf_page_number = ' . $pdf_page_number_q . ';', TRUE, PMA_DBI_QUERY_STORE);     
    +    }
     
         die("<script>alert('$strModifications');history.go(-2);</script>");
     }
    @@ -76,11 +79,11 @@
           <select name="pdf_page_number">
           <?php
           $table_info_result = PMA_query_as_cu('SELECT * FROM '.PMA_backquote($GLOBALS['cfgRelation']['db']) . '.' . PMA_backquote($cfgRelation['pdf_pages']).'
    -                                             WHERE db_name = \''.$db.'\'');
    +                                              WHERE db_name = \'' . PMA_sqlAddslashes($db) . '\'');
           while($page = PMA_DBI_fetch_assoc($table_info_result))
           {
           ?>
    -      <option value="<?php echo $page['page_nr'] ?>"><?php echo $page['page_descr'] ?></option>
    +      <option value="<?php echo $page['page_nr'] ?>"><?php echo htmlspecialchars($page['page_descr']) ?></option>
           <?php
           }
           ?>
    
8ec543499972

[security] XSS and SQL injection

https://github.com/phpmyadmin/phpmyadminMarc DelisleOct 12, 2009via ghsa
5 files changed · +22 16
  • ChangeLog+3 0 modified
    @@ -55,6 +55,9 @@ $HeadURL: https://phpmyadmin.svn.sourceforge.net/svnroot/phpmyadmin/trunk/phpMyA
     - bug #2872247 [interface] Failed opening required 'mysql_charsets.lib.php', thanks to CyberLeo Kitsana - cyberleo
     - bug [structure] "In use" table incorrectly reported as "view" 
     
    +3.2.2.1 (2009-10-12)
    +- [security] XSS and SQL injection, thanks to Herman van Rink
    +
     3.2.2.0 (2009-09-13)
     - bug #2825293 [structure] Default value for a BIT column
     - bug [display] Red arrows were reversed in the list of tables 
    
  • db_operations.php+1 1 modified
    @@ -627,7 +627,7 @@
             <?php
             while ($pages = @PMA_DBI_fetch_assoc($test_rs)) {
                 echo '                <option value="' . $pages['page_nr'] . '">'
    -                . $pages['page_nr'] . ': ' . $pages['page_descr'] . '</option>' . "\n";
    +                . $pages['page_nr'] . ': ' . htmlspecialchars($pages['page_descr']) . '</option>' . "\n";
             } // end while
             PMA_DBI_free_result($test_rs);
             unset($test_rs);
    
  • db_structure.php+2 2 modified
    @@ -287,7 +287,7 @@
     
         $row_count++;
         if ($table_is_view) {
    -        $hidden_fields[] = '<input type="hidden" name="views[]" value="' .  $each_table['TABLE_NAME'] . '" />';
    +        $hidden_fields[] = '<input type="hidden" name="views[]" value="' .  htmlspecialchars($each_table['TABLE_NAME']) . '" />';
         }
     
         if ($each_table['TABLE_ROWS'] > 0) {
    @@ -373,7 +373,7 @@
     <tr class="<?php echo $odd_row ? 'odd' : 'even'; $odd_row = ! $odd_row; ?>">
         <td align="center">
             <input type="checkbox" name="selected_tbl[]"
    -            value="<?php echo $each_table['TABLE_NAME']; ?>"
    +            value="<?php echo htmlspecialchars($each_table['TABLE_NAME']); ?>"
                 id="checkbox_tbl_<?php echo $i; ?>"<?php echo $checked; ?> /></td>
         <th><label for="checkbox_tbl_<?php echo $i; ?>"
                 title="<?php echo $alias; ?>" style="<?php echo $ignored ? ' ignored' : ''; ?>"><?php echo $truename; ?></label>
    
  • pdf_pages.php+6 6 modified
    @@ -270,7 +270,7 @@
                 if (isset($chpage) && $chpage == $curr_page['page_nr']) {
                     echo ' selected="selected"';
                 }
    -            echo '>' . $curr_page['page_nr'] . ': ' . $curr_page['page_descr'] . '</option>';
    +            echo '>' . $curr_page['page_nr'] . ': ' . htmlspecialchars($curr_page['page_descr']) . '</option>';
             } // end while
             echo "\n";
             ?>
    @@ -429,12 +429,12 @@ function resetDrag() {
                 echo "\n" . '        <td>'
                      . "\n" . '            <select name="c_table_' . $i . '[name]">';
                 foreach ($selectboxall AS $key => $value) {
    -                echo "\n" . '                <option value="' . $value . '"';
    +                echo "\n" . '                <option value="' . htmlspecialchars($value) . '"';
                     if ($value == $sh_page['table_name']) {
                         echo ' selected="selected"';
                         $tabExist[$_mtab] = TRUE;
                     }
    -                echo '>' . $value . '</option>';
    +                echo '>' . htmlspecialchars($value) . '</option>';
                 } // end while
                 echo "\n" . '            </select>'
                      . "\n" . '        </td>';
    @@ -462,7 +462,7 @@ function resetDrag() {
             echo "\n" . '        <td>'
                  . "\n" . '            <select name="c_table_' . $i . '[name]">';
             foreach ($selectboxall AS $key => $value) {
    -            echo "\n" . '                <option value="' . $value . '">' . $value . '</option>';
    +            echo "\n" . '                <option value="' . htmlspecialchars($value) . '">' . htmlspecialchars($value) . '</option>';
             }
             echo "\n" . '            </select>'
                  . "\n" . '        </td>';
    @@ -493,8 +493,8 @@ function resetDrag() {
         if (!empty($tabExist) && is_array($tabExist)) {
             foreach ($tabExist AS $key => $value) {
                 if (!$value) {
    -                $_strtrans  .= '<input type="hidden" name="delrow[]" value="' . $key . '" />' . "\n";
    -                $_strname   .= '<li>' . $key . '</li>' . "\n";
    +                $_strtrans  .= '<input type="hidden" name="delrow[]" value="' . htmlspecialchars($key) . '" />' . "\n";
    +                $_strname   .= '<li>' . htmlspecialchars($key) . '</li>' . "\n";
                     $shoot       = TRUE;
                 }
             }
    
  • pmd_pdf.php+10 7 modified
    @@ -23,26 +23,29 @@
     
         $pmd_table = PMA_backquote($GLOBALS['cfgRelation']['db']) . '.' . PMA_backquote($GLOBALS['cfgRelation']['designer_coords']);
         $pma_table = PMA_backquote($GLOBALS['cfgRelation']['db']) . '.' . PMA_backquote($cfgRelation['table_coords']);
    +    $scale_q = PMA_sqlAddslashes($scale);
    +    $pdf_page_number_q = PMA_sqlAddslashes($pdf_page_number);
     
         if (isset($exp)) {
     
    -        $sql = "REPLACE INTO " . $pma_table . " (db_name, table_name, pdf_page_number, x, y) SELECT db_name, table_name, " . $pdf_page_number . ", ROUND(x/" . $scale . ") , ROUND(y/" . $scale . ") y FROM " . $pmd_table . " WHERE db_name = '" . $db . "'";
    +        $sql = "REPLACE INTO " . $pma_table . " (db_name, table_name, pdf_page_number, x, y) SELECT db_name, table_name, " . $pdf_page_number_q . ", ROUND(x/" . $scale_q . ") , ROUND(y/" . $scale_q . ") y FROM " . $pmd_table . " WHERE db_name = '" . PMA_sqlAddslashes($db) . "'";
     
             PMA_query_as_controluser($sql,TRUE,PMA_DBI_QUERY_STORE);
         }
     
         if (isset($imp)) {
             PMA_query_as_controluser(
             'UPDATE ' . $pma_table . ',' . $pmd_table .
    -        ' SET ' . $pmd_table . '.`x`= ' . $pma_table . '.`x` * '. $scale . ',
    -        ' . $pmd_table . '.`y`= ' . $pma_table . '.`y` * '.$scale.'
    +        ' SET ' . $pmd_table . '.`x`= ' . $pma_table . '.`x` * '. $scale_q . ',
    +        ' . $pmd_table . '.`y`= ' . $pma_table . '.`y` * '. $scale_q .'
             WHERE
             ' . $pmd_table . '.`db_name`=' . $pma_table . '.`db_name`
             AND
             ' . $pmd_table . '.`table_name` = ' . $pma_table . '.`table_name`
             AND
    -        ' . $pmd_table . '.`db_name`=\''.$db.'\'
    -        AND pdf_page_number = '.$pdf_page_number.';',TRUE,PMA_DBI_QUERY_STORE);     }
    +        ' . $pmd_table . '.`db_name`=\''. PMA_sqlAddslashes($db) .'\'
    +        AND pdf_page_number = ' . $pdf_page_number_q . ';', TRUE, PMA_DBI_QUERY_STORE);     
    +    }
     
         die("<script>alert('$strModifications');history.go(-2);</script>");
     }
    @@ -79,11 +82,11 @@
           <select name="pdf_page_number">
           <?php
           $table_info_result = PMA_query_as_controluser('SELECT * FROM '.PMA_backquote($GLOBALS['cfgRelation']['db']) . '.' . PMA_backquote($cfgRelation['pdf_pages']).'
    -                                             WHERE db_name = \''.$db.'\'');
    +                                             WHERE db_name = \'' . PMA_sqlAddslashes($db) . '\'');
           while($page = PMA_DBI_fetch_assoc($table_info_result))
           {
           ?>
    -      <option value="<?php echo $page['page_nr'] ?>"><?php echo $page['page_descr'] ?></option>
    +      <option value="<?php echo $page['page_nr'] ?>"><?php echo htmlspecialchars($page['page_descr']) ?></option>
           <?php
           }
           ?>
    

Vulnerability mechanics

Root cause

"Missing HTML escaping of user-controllable MySQL table names and page descriptions before output in web pages allows cross-site scripting."

Attack vector

An attacker who can create or rename a MySQL table with a crafted name containing JavaScript payloads can trigger XSS when a phpMyAdmin administrator views pages that display table names, such as the database structure page or PDF designer interface [CWE-79]. The crafted table name is stored in the database and later echoed into HTML without sanitization in multiple files including `pdf_pages.php`, `db_structure.php`, and `db_operations.php` [patch_id=18830][patch_id=18831]. No authentication bypass is required beyond having the ability to create tables with arbitrary names in a database accessible to phpMyAdmin.

Affected code

The vulnerability spans multiple files: `pdf_pages.php` (lines 273, 426-462, 490-493), `db_operations.php` (line 463 in 2.11.x, line 627 in 3.x), `db_structure.php` (lines 287, 373), and `pmd_pdf.php` (lines 23-82). All locations output user-controlled database values (table names, page descriptions) into HTML without HTML entity encoding.

What the fix does

The patches apply `htmlspecialchars()` to all user-controllable values before they are inserted into HTML output. In `pdf_pages.php` and `db_operations.php`, the `$page['page_descr']` field is wrapped with `htmlspecialchars()` [patch_id=18830][patch_id=18831]. In `db_structure.php`, `$each_table['TABLE_NAME']` is escaped in both hidden fields and checkbox values [patch_id=18831]. The `pmd_pdf.php` changes also add `PMA_sqlAddslashes()` for SQL query parameters to prevent SQL injection alongside the XSS fix [patch_id=18830][patch_id=18831].

Preconditions

  • inputAttacker must be able to create or rename a MySQL table with an arbitrary name containing HTML/JavaScript
  • configphpMyAdmin must have the Designer/PDF schema feature enabled (for some attack paths)
  • authA victim administrator must view the affected phpMyAdmin page (e.g., database structure or PDF export page)

Generated on May 19, 2026. Inputs: CWE entries + fix-commit diffs from this CVE's patches. Citations validated against bundle.

References

26

News mentions

0

No linked articles in our index yet.