summaryrefslogtreecommitdiff
path: root/execute.c
diff options
context:
space:
mode:
authorBen Fuhrmannek2014-07-14 13:07:38 +0200
committerBen Fuhrmannek2014-07-14 13:07:38 +0200
commit1dc59e48642c98e34320f1a31c120fbf290fd509 (patch)
tree5126791aac0c7655daa502a00a53d4c2257ced43 /execute.c
parent940509ed02db713920612b0994a57d6227c3655c (diff)
parentaafe0cf82f5fb7220ac6f674bbc1c2091a6a9c4d (diff)
Merge branch 'sql'
Diffstat (limited to 'execute.c')
-rw-r--r--execute.c209
1 files changed, 139 insertions, 70 deletions
diff --git a/execute.c b/execute.c
index 1f7cf15..82a4866 100644
--- a/execute.c
+++ b/execute.c
@@ -24,6 +24,7 @@
24#endif 24#endif
25 25
26#include <fcntl.h> 26#include <fcntl.h>
27#include <fnmatch.h>
27#include "php.h" 28#include "php.h"
28#include "php_ini.h" 29#include "php_ini.h"
29#include "zend_hash.h" 30#include "zend_hash.h"
@@ -880,7 +881,7 @@ int ih_querycheck(IH_HANDLER_PARAMS)
880 return (0); 881 return (0);
881 } 882 }
882 883
883 if ((long) ih->arg1) { 884 if ((long) ih->arg2) {
884 mysql_extension = 1; 885 mysql_extension = 1;
885 } 886 }
886 887
@@ -892,6 +893,7 @@ int ih_querycheck(IH_HANDLER_PARAMS)
892 } 893 }
893 len = Z_STRLEN_P(backup); 894 len = Z_STRLEN_P(backup);
894 query = Z_STRVAL_P(backup); 895 query = Z_STRVAL_P(backup);
896 SDEBUG("SQL |%s|", query);
895 897
896 s = query; 898 s = query;
897 e = s+len; 899 e = s+len;
@@ -1023,29 +1025,16 @@ int ih_fixusername(IH_HANDLER_PARAMS)
1023 void **p = EG(argument_stack).top_element-2; 1025 void **p = EG(argument_stack).top_element-2;
1024#endif 1026#endif
1025 unsigned long arg_count; 1027 unsigned long arg_count;
1026 zval **arg;char *prefix, *postfix, *user; 1028 zval **arg;
1029 char *prefix, *postfix, *user, *user_match, *cp;
1027 zval *backup, *my_user; 1030 zval *backup, *my_user;
1028 int prefix_len, postfix_len, len; 1031 int prefix_len, postfix_len, len;
1029 1032
1030 SDEBUG("function: %s", ih->name); 1033 SDEBUG("function (fixusername): %s", ih->name);
1031 1034
1032 prefix = SUHOSIN_G(sql_user_prefix); 1035 prefix = SUHOSIN_G(sql_user_prefix);
1033 postfix = SUHOSIN_G(sql_user_postfix); 1036 postfix = SUHOSIN_G(sql_user_postfix);
1034 1037 user_match = SUHOSIN_G(sql_user_match);
1035 if ((prefix == NULL || prefix[0] == 0)&&
1036 (postfix == NULL || postfix[0] == 0)) {
1037 return (0);
1038 }
1039
1040 if (prefix == NULL) {
1041 prefix = "";
1042 }
1043 if (postfix == NULL) {
1044 postfix = "";
1045 }
1046
1047 prefix_len = strlen(prefix);
1048 postfix_len = strlen(postfix);
1049 1038
1050 arg_count = (unsigned long) *p; 1039 arg_count = (unsigned long) *p;
1051 1040
@@ -1064,26 +1053,60 @@ int ih_fixusername(IH_HANDLER_PARAMS)
1064 user = Z_STRVAL_P(backup); 1053 user = Z_STRVAL_P(backup);
1065 } 1054 }
1066 1055
1067 if (prefix_len && prefix_len <= len) { 1056 cp = user;
1068 if (strncmp(prefix, user, prefix_len)==0) { 1057 while (cp < user+len) {
1069 prefix = ""; 1058 if (*cp < 32) {
1070 len -= prefix_len; 1059 suhosin_log(S_SQL, "SQL username contains invalid characters");
1060 if (!SUHOSIN_G(simulation)) {
1061 RETVAL_FALSE;
1062 return (1);
1063 } else {
1064 break;
1065 }
1071 } 1066 }
1067 cp++;
1072 } 1068 }
1073 1069
1074 if (postfix_len && postfix_len <= len) { 1070 if ((prefix != NULL && prefix[0]) || (postfix != NULL && postfix[0])) {
1075 if (strncmp(postfix, user+len-postfix_len, postfix_len)==0) { 1071 if (prefix == NULL) {
1072 prefix = "";
1073 }
1074 if (postfix == NULL) {
1076 postfix = ""; 1075 postfix = "";
1077 } 1076 }
1077 prefix_len = strlen(prefix);
1078 postfix_len = strlen(postfix);
1079
1080 MAKE_STD_ZVAL(my_user);
1081 my_user->type = IS_STRING;
1082 my_user->value.str.len = spprintf(&my_user->value.str.val, 0, "%s%s%s", prefix, user, postfix);
1083
1084 /* XXX: memory_leak? */
1085 *arg = my_user;
1086
1087 len = Z_STRLEN_P(my_user);
1088 user = Z_STRVAL_P(my_user);
1078 } 1089 }
1079 1090
1080 MAKE_STD_ZVAL(my_user); 1091 if (user_match && user_match[0]) {
1081 my_user->type = IS_STRING; 1092#ifdef HAVE_FNMATCH
1082 my_user->value.str.len = spprintf(&my_user->value.str.val, 0, "%s%s%s", prefix, user, postfix); 1093 if (fnmatch(user_match, user, 0) != 0) {
1094 suhosin_log(S_SQL, "SQL username ('%s') does not match suhosin.sql.user_match ('%s')", user, user_match);
1095 if (!SUHOSIN_G(simulation)) {
1096 RETVAL_FALSE;
1097 return (1);
1098 }
1099 }
1100#else
1101#warning no support for fnmatch() - setting suhosin.sql.user_match will always fail.
1102 suhosin_log(S_SQL, "suhosin.sql.user_match specified, but system does not support fnmatch()");
1103 if (!SUHOSIN_G(simulation)) {
1104 RETVAL_FALSE;
1105 return (1);
1106 }
1107#endif
1108 }
1083 1109
1084 /* XXX: memory_leak? */
1085 *arg = my_user;
1086
1087 SDEBUG("function: %s - user: %s", ih->name, user); 1110 SDEBUG("function: %s - user: %s", ih->name, user);
1088 1111
1089 return (0); 1112 return (0);
@@ -1552,9 +1575,9 @@ static int ih_getrandmax(IH_HANDLER_PARAMS)
1552} 1575}
1553 1576
1554internal_function_handler ihandlers[] = { 1577internal_function_handler ihandlers[] = {
1555 { "preg_replace", ih_preg_replace, NULL, NULL, NULL }, 1578 { "preg_replace", ih_preg_replace, NULL, NULL, NULL },
1556 { "mail", ih_mail, NULL, NULL, NULL }, 1579 { "mail", ih_mail, NULL, NULL, NULL },
1557 { "symlink", ih_symlink, NULL, NULL, NULL }, 1580 { "symlink", ih_symlink, NULL, NULL, NULL },
1558 1581
1559 { "srand", ih_srand, NULL, NULL, NULL }, 1582 { "srand", ih_srand, NULL, NULL, NULL },
1560 { "mt_srand", ih_mt_srand, NULL, NULL, NULL }, 1583 { "mt_srand", ih_mt_srand, NULL, NULL, NULL },
@@ -1563,49 +1586,95 @@ internal_function_handler ihandlers[] = {
1563 { "getrandmax", ih_getrandmax, NULL, NULL, NULL }, 1586 { "getrandmax", ih_getrandmax, NULL, NULL, NULL },
1564 { "mt_getrandmax", ih_getrandmax, NULL, NULL, NULL }, 1587 { "mt_getrandmax", ih_getrandmax, NULL, NULL, NULL },
1565 1588
1566 { "ocilogon", ih_fixusername, (void *)1, NULL, NULL }, 1589 { "function_exists", ih_function_exists, NULL, NULL, NULL },
1567 { "ociplogon", ih_fixusername, (void *)1, NULL, NULL },
1568 { "ocinlogon", ih_fixusername, (void *)1, NULL, NULL },
1569 { "oci_connect", ih_fixusername, (void *)1, NULL, NULL },
1570 { "oci_pconnect", ih_fixusername, (void *)1, NULL, NULL },
1571 { "oci_new_connect", ih_fixusername, (void *)1, NULL, NULL },
1572 1590
1573 { "fbsql_change_user", ih_fixusername, (void *)1, NULL, NULL }, 1591 /* Mysqli */
1574 { "fbsql_connect", ih_fixusername, (void *)2, NULL, NULL }, 1592 { "mysqli::mysqli", ih_fixusername, (void *)2, NULL, NULL },
1575 { "fbsql_pconnect", ih_fixusername, (void *)2, NULL, NULL }, 1593 { "mysqli_connect", ih_fixusername, (void *)2, NULL, NULL },
1576 1594 { "mysqli::real_connect", ih_fixusername, (void *)2, NULL, NULL },
1577 { "function_exists", ih_function_exists, NULL, NULL, NULL }, 1595 { "mysqli_real_connect", ih_fixusername, (void *)3, NULL, NULL },
1596 { "mysqli_change_user", ih_fixusername, (void *)2, NULL, NULL },
1597 { "mysqli::change_user", ih_fixusername, (void *)1, NULL, NULL },
1598
1599 { "mysqli::query", ih_querycheck, (void *)1, (void *)1, NULL },
1600 { "mysqli_query", ih_querycheck, (void *)2, (void *)1, NULL },
1601 { "mysqli::multi_query", ih_querycheck, (void *)1, (void *)1, NULL },
1602 { "mysqli_multi_query", ih_querycheck, (void *)2, (void *)1, NULL },
1603 { "mysqli::prepare", ih_querycheck, (void *)1, (void *)1, NULL },
1604 { "mysqli_prepare", ih_querycheck, (void *)2, (void *)1, NULL },
1605 { "mysqli::real_query", ih_querycheck, (void *)1, (void *)1, NULL },
1606 { "mysqli_real_query", ih_querycheck, (void *)2, (void *)1, NULL },
1607 { "mysqli::send_query", ih_querycheck, (void *)1, (void *)1, NULL },
1608 { "mysqli_send_query", ih_querycheck, (void *)2, (void *)1, NULL },
1609 // removed in PHP 5.3
1610 { "mysqli_master_query", ih_querycheck, (void *)2, (void *)1, NULL },
1611 { "mysqli_slave_query", ih_querycheck, (void *)2, (void *)1, NULL },
1612 // ----
1578 1613
1579 { "ifx_connect", ih_fixusername, (void *)2, NULL, NULL }, 1614 /* Mysql API - deprecated in PHP 5.5 */
1580 { "ifx_pconnect", ih_fixusername, (void *)2, NULL, NULL }, 1615 { "mysql_connect", ih_fixusername, (void *)2, NULL, NULL },
1616 { "mysql_pconnect", ih_fixusername, (void *)2, NULL, NULL },
1617 { "mysql_query", ih_querycheck, (void *)1, (void *)1, NULL },
1618 { "mysql_db_query", ih_querycheck, (void *)2, (void *)1, NULL },
1619 { "mysql_unbuffered_query", ih_querycheck, (void *)1, (void *)1, NULL },
1620
1621#ifdef SUHOSIN_EXPERIMENTAL
1622 /* MaxDB */
1623 { "maxdb::maxdb", ih_fixusername, (void *)2, NULL, NULL },
1624 { "maxdb_connect", ih_fixusername, (void *)2, NULL, NULL },
1625 { "maxdb::real_connect", ih_fixusername, (void *)2, NULL, NULL },
1626 { "maxdb_real_connect", ih_fixusername, (void *)3, NULL, NULL },
1627 { "maxdb::change_user", ih_fixusername, (void *)1, NULL, NULL },
1628 { "maxdb_change_user", ih_fixusername, (void *)2, NULL, NULL },
1629
1630 { "maxdb_master_query", ih_querycheck, (void *)2, NULL, NULL },
1631 { "maxdb::multi_query", ih_querycheck, (void *)1, NULL, NULL },
1632 { "maxdb_multi_query", ih_querycheck, (void *)2, NULL, NULL },
1633 { "maxdb::query", ih_querycheck, (void *)1, NULL, NULL },
1634 { "maxdb_query", ih_querycheck, (void *)2, NULL, NULL },
1635 { "maxdb::real_query", ih_querycheck, (void *)1, NULL, NULL },
1636 { "maxdb_real_query", ih_querycheck, (void *)2, NULL, NULL },
1637 { "maxdb::send_query", ih_querycheck, (void *)1, NULL, NULL },
1638 { "maxdb_send_query", ih_querycheck, (void *)2, NULL, NULL },
1639 { "maxdb::prepare", ih_querycheck, (void *)1, NULL, NULL },
1640 { "maxdb_prepare", ih_querycheck, (void *)2, NULL, NULL },
1581 1641
1582 { "ibase_connect", ih_fixusername, (void *)2, NULL, NULL }, 1642 /* PDO */
1583 { "ibase_pconnect", ih_fixusername, (void *)2, NULL, NULL }, 1643 /* note: mysql conditional comments not supported here */
1644 { "pdo::__construct", ih_fixusername, (void *)2, NULL, NULL }, /* note: username may come from dsn (param 1) */
1645 { "pdo::query", ih_querycheck, (void *)1, NULL, NULL },
1646 { "pdo::prepare", ih_querycheck, (void *)1, NULL, NULL },
1647 { "pdo::exec", ih_querycheck, (void *)1, NULL, NULL },
1648
1649 /* Oracle OCI8 */
1650 { "ocilogon", ih_fixusername, (void *)1, NULL, NULL },
1651 { "ociplogon", ih_fixusername, (void *)1, NULL, NULL },
1652 { "ocinlogon", ih_fixusername, (void *)1, NULL, NULL },
1653 { "oci_connect", ih_fixusername, (void *)1, NULL, NULL },
1654 { "oci_pconnect", ih_fixusername, (void *)1, NULL, NULL },
1655 { "oci_new_connect", ih_fixusername, (void *)1, NULL, NULL },
1584 1656
1585 { "maxdb", ih_fixusername, (void *)2, NULL, NULL }, 1657 /* FrontBase */
1586 { "maxdb_change_user", ih_fixusername, (void *)2, NULL, NULL }, 1658 { "fbsql_connect", ih_fixusername, (void *)2, NULL, NULL },
1587 { "maxdb_connect", ih_fixusername, (void *)2, NULL, NULL }, 1659 { "fbsql_pconnect", ih_fixusername, (void *)2, NULL, NULL },
1588 { "maxdb_pconnect", ih_fixusername, (void *)2, NULL, NULL }, 1660 { "fbsql_change_user", ih_fixusername, (void *)1, NULL, NULL },
1589 { "maxdb_real_connect", ih_fixusername, (void *)3, NULL, NULL }, 1661 { "fbsql_username", ih_fixusername, (void *)2, NULL, NULL },
1590 1662
1591 { "mssql_connect", ih_fixusername, (void *)2, NULL, NULL }, 1663 /* Informix */
1592 { "mssql_pconnect", ih_fixusername, (void *)2, NULL, NULL }, 1664 { "ifx_connect", ih_fixusername, (void *)2, NULL, NULL },
1665 { "ifx_pconnect", ih_fixusername, (void *)2, NULL, NULL },
1593 1666
1594 { "mysql_query", ih_querycheck, (void *)1, (void *)1, NULL }, 1667 /* Firebird/InterBase */
1595 { "mysql_db_query", ih_querycheck, (void *)2, (void *)1, NULL }, 1668 { "ibase_connect", ih_fixusername, (void *)2, NULL, NULL },
1596 { "mysql_unbuffered_query", ih_querycheck, (void *)1, (void *)1, NULL }, 1669 { "ibase_pconnect", ih_fixusername, (void *)2, NULL, NULL },
1597 { "mysqli_query", ih_querycheck, (void *)2, (void *)1, NULL }, 1670 { "ibase_service_attach", ih_fixusername, (void *)2, NULL, NULL },
1598 { "mysqli_real_query", ih_querycheck, (void *)2, (void *)1, NULL }, 1671
1599 { "mysqli_send_query", ih_querycheck, (void *)2, (void *)1, NULL }, 1672 /* Microsoft SQL Server */
1600 { "mysqli_master_query", ih_querycheck, (void *)2, (void *)1, NULL }, 1673 { "mssql_connect", ih_fixusername, (void *)2, NULL, NULL },
1601 { "mysqli_slave_query", ih_querycheck, (void *)2, (void *)1, NULL }, 1674 { "mssql_pconnect", ih_fixusername, (void *)2, NULL, NULL },
1675#endif
1602 1676
1603 { "mysqli", ih_fixusername, (void *)2, NULL, NULL }, 1677 { NULL, NULL, NULL, NULL, NULL }
1604 { "mysql_connect", ih_fixusername, (void *)2, NULL, NULL },
1605 { "mysql_pconnect", ih_fixusername, (void *)2, NULL, NULL },
1606 { "mysqli_change_user", ih_fixusername, (void *)2, NULL, NULL },
1607 { "mysql_real_connect", ih_fixusername, (void *)3, NULL, NULL },
1608 { NULL, NULL, NULL, NULL, NULL }
1609}; 1678};
1610 1679
1611#define FUNCTION_WARNING() zend_error(E_WARNING, "%s() has been disabled for security reasons", get_active_function_name(TSRMLS_C)); 1680#define FUNCTION_WARNING() zend_error(E_WARNING, "%s() has been disabled for security reasons", get_active_function_name(TSRMLS_C));