From 70aca8937767bd2c0e99f76f8ec94910c7d38df8 Mon Sep 17 00:00:00 2001
From: Jared Hancock <jared@osticket.com>
Date: Wed, 20 Jun 2012 22:24:25 -0500
Subject: [PATCH] Remove SQL injection vulnerabilities

Map each of the inputs from $_POST['ids'] into a separate, sanitized
database input (via the db_input() function), then implode() the array with
commas and build the SQL statement.
---
 include/class.team.php |  4 +++-
 scp/apikeys.php        |  6 ++++--
 scp/banlist.php        | 12 ++++++++----
 scp/canned.php         |  6 ++++--
 scp/categories.php     |  6 ++++--
 scp/departments.php    | 10 +++++++---
 scp/emails.php         |  5 ++++-
 scp/filters.php        |  6 ++++--
 scp/groups.php         |  6 ++++--
 scp/helptopics.php     |  6 ++++--
 scp/slas.php           |  6 ++++--
 scp/staff.php          |  3 ++-
 scp/syslogs.php        |  3 ++-
 scp/teams.php          |  6 ++++--
 scp/templates.php      |  3 ++-
 15 files changed, 60 insertions(+), 28 deletions(-)

diff --git a/include/class.team.php b/include/class.team.php
index 48d7b5655..1f663880d 100644
--- a/include/class.team.php
+++ b/include/class.team.php
@@ -126,7 +126,9 @@ class Team {
         if($vars['remove']) {
             $sql='DELETE FROM '.TEAM_MEMBER_TABLE
                 .' WHERE team_id='.db_input($this->getId())
-                .' AND staff_id IN('.implode(',',$_POST['remove']).')';
+                .' AND staff_id IN ('
+                    .implode(',', array_map('db_input', $_POST['remove']))
+                .')';
             db_query($sql);
         }
 
diff --git a/scp/apikeys.php b/scp/apikeys.php
index ece244445..f9293f605 100644
--- a/scp/apikeys.php
+++ b/scp/apikeys.php
@@ -45,7 +45,8 @@ if($_POST){
             }else{
                 $count=count($_POST['ids']);
                 if($_POST['enable']){
-                    $sql='UPDATE '.API_KEY_TABLE.' SET isactive=1 WHERE id IN ('.implode(',',$_POST['ids']).')';
+                    $sql='UPDATE '.API_KEY_TABLE.' SET isactive=1 WHERE id IN ('.
+                        implode(',', array_map('db_input', $_POST['ids'])).')';
                     if(db_query($sql) && ($num=db_affected_rows())){
                         if($num==$count)
                             $msg='Selected API keys enabled';
@@ -55,7 +56,8 @@ if($_POST){
                         $errors['err']='Unable to enable selected API keys.';
                     }
                 }elseif($_POST['disable']){
-                    $sql='UPDATE '.API_KEY_TABLE.' SET isactive=0  WHERE id IN ('.implode(',',$_POST['ids']).')';
+                    $sql='UPDATE '.API_KEY_TABLE.' SET isactive=0  WHERE id IN ('.
+                        implode(',', array_map('db_input', $_POST['ids'])).')';
                     if(db_query($sql) && ($num=db_affected_rows())) {
                         if($num==$count)
                             $msg='Selected API keys disabled';
diff --git a/scp/banlist.php b/scp/banlist.php
index b56d05c6d..faa709fd3 100644
--- a/scp/banlist.php
+++ b/scp/banlist.php
@@ -68,8 +68,10 @@ if($_POST && !$errors && $filter){
             }else{
                 $count=count($_POST['ids']);
                 if($_POST['enable']){
-                    $sql='UPDATE '.EMAIL_FILTER_RULE_TABLE.' SET isactive=1 WHERE filter_id='.db_input($filter->getId()).
-                         ' AND id IN ('.implode(',',$_POST['ids']).')';
+                    $sql='UPDATE '.EMAIL_FILTER_RULE_TABLE.' SET isactive=1 WHERE filter_id='.
+                            db_input($filter->getId()).
+                         ' AND id IN ('.
+                            implode(',', array_map('db_input', $_POST['ids'])).')';
                     if(db_query($sql) && ($num=db_affected_rows())){
                         if($num==$count)
                             $msg='Selected emails ban status set to enabled';
@@ -79,8 +81,10 @@ if($_POST && !$errors && $filter){
                         $errors['err']='Unable to enable selected emails';
                     }
                 }elseif($_POST['disable']){
-                    $sql='UPDATE '.EMAIL_FILTER_RULE_TABLE.' SET isactive=0  WHERE filter_id='.db_input($filter->getId()).
-                         ' AND id IN ('.implode(',',$_POST['ids']).')';
+                    $sql='UPDATE '.EMAIL_FILTER_RULE_TABLE.' SET isactive=0 WHERE filter_id='.
+                            db_input($filter->getId()).
+                         ' AND id IN ('.
+                            implode(',', array_map('db_input', $_POST['ids'])).')';
                     if(db_query($sql) && ($num=db_affected_rows())) {
                         if($num==$count)
                             $msg='Selected emails ban status set to disabled';
diff --git a/scp/canned.php b/scp/canned.php
index cb6da802e..fa208a273 100644
--- a/scp/canned.php
+++ b/scp/canned.php
@@ -71,7 +71,8 @@ if($_POST && $thisstaff->canManageCannedResponses()) {
             } else {
                 $count=count($_POST['ids']);
                 if($_POST['enable']) {
-                    $sql='UPDATE '.CANNED_TABLE.' SET isenabled=1 WHERE canned_id IN ('.implode(',',$_POST['ids']).')';
+                    $sql='UPDATE '.CANNED_TABLE.' SET isenabled=1 WHERE canned_id IN ('.
+                        implode(',', array_map('db_input', $_POST['ids'])).')';
                     if(db_query($sql) && ($num=db_affected_rows())) {
                         if($num==$count)
                             $msg='Selected canned replies enabled';
@@ -81,7 +82,8 @@ if($_POST && $thisstaff->canManageCannedResponses()) {
                         $errors['err']='Unable to enable selected canned replies.';
                     }
                 } elseif($_POST['disable']) {
-                    $sql='UPDATE '.CANNED_TABLE.' SET isenabled=0  WHERE canned_id IN ('.implode(',',$_POST['ids']).')';
+                    $sql='UPDATE '.CANNED_TABLE.' SET isenabled=0 WHERE canned_id IN ('.
+                        implode(',', array_map('db_input', $_POST['ids'])).')';
                     if(db_query($sql) && ($num=db_affected_rows())) {
                         if($num==$count)
                             $msg='Selected canned replies disabled';
diff --git a/scp/categories.php b/scp/categories.php
index 787b81b5f..ed98da897 100644
--- a/scp/categories.php
+++ b/scp/categories.php
@@ -52,7 +52,8 @@ if($_POST){
             } else {
                 $count=count($_POST['ids']);
                 if($_POST['public']) {
-                    $sql='UPDATE '.FAQ_CATEGORY_TABLE.' SET ispublic=1 WHERE category_id IN ('.implode(',',$_POST['ids']).')';
+                    $sql='UPDATE '.FAQ_CATEGORY_TABLE.' SET ispublic=1 WHERE category_id IN ('.
+                        implode(',', array_map('db_input', $_POST['ids'])).')';
                     if(db_query($sql) && ($num=db_affected_rows())) {
                         if($num==$count)
                             $msg='Selected categories made PUBLIC';
@@ -62,7 +63,8 @@ if($_POST){
                         $errors['err']='Unable to enable selected categories public.';
                     }
                 } elseif($_POST['private']) {
-                    $sql='UPDATE '.FAQ_CATEGORY_TABLE.' SET ispublic=0  WHERE category_id IN ('.implode(',',$_POST['ids']).')';
+                    $sql='UPDATE '.FAQ_CATEGORY_TABLE.' SET ispublic=0 WHERE category_id IN ('.
+                        implode(',', array_map('db_input', $_POST['ids'])).')';
                     if(db_query($sql) && ($num=db_affected_rows())) {
                         if($num==$count)
                             $msg='Selected categories made PRIVATE';
diff --git a/scp/departments.php b/scp/departments.php
index d0869cdf7..ae03b6385 100644
--- a/scp/departments.php
+++ b/scp/departments.php
@@ -45,7 +45,8 @@ if($_POST){
             }else{
                 $count=count($_POST['ids']);
                 if($_POST['public']){
-                    $sql='UPDATE '.DEPT_TABLE.' SET ispublic=1 WHERE dept_id IN ('.implode(',',$_POST['ids']).')';
+                    $sql='UPDATE '.DEPT_TABLE.' SET ispublic=1 WHERE dept_id IN ('
+                        .implode(',', array_map('db_input', $_POST['ids'])).')';
                     if(db_query($sql) && ($num=db_affected_rows())){
                         if($num==$count)
                             $msg='Selected departments made public';
@@ -56,7 +57,9 @@ if($_POST){
                     }
                 }elseif($_POST['private']){
                     $sql='UPDATE '.DEPT_TABLE.' SET ispublic=0  '.
-                         'WHERE dept_id IN ('.implode(',',$_POST['ids']).') AND dept_id!='.db_input($cfg->getDefaultDeptId());
+                         'WHERE dept_id IN ('
+                            .implode(',', array_map('db_input', $_POST['ids']))
+                        .') AND dept_id!='.db_input($cfg->getDefaultDeptId());
                     if(db_query($sql) && ($num=db_affected_rows())) {
                         if($num==$count)
                             $msg='Selected departments made private';
@@ -68,7 +71,8 @@ if($_POST){
 
                 }elseif($_POST['delete']){
                     //Deny all deletes if one of the selections has members in it.
-                    $sql='SELECT count(staff_id) FROM '.STAFF_TABLE.' WHERE dept_id IN ('.implode(',',$_POST['ids']).')';
+                    $sql='SELECT count(staff_id) FROM '.STAFF_TABLE.' WHERE dept_id IN ('
+                        .implode(',', array_map('db_input', $_POST['ids'])).')';
                     list($members)=db_fetch_row(db_query($sql));
                     if($members)
                         $errors['err']='Dept. with users can not be deleted. Move staff first.';
diff --git a/scp/emails.php b/scp/emails.php
index ddc626fb3..fa8a150d7 100644
--- a/scp/emails.php
+++ b/scp/emails.php
@@ -46,7 +46,10 @@ if($_POST){
                 $count=count($_POST['ids']);
 
                 $sql='SELECT count(dept_id) FROM '.DEPT_TABLE.' dept '.
-                     'WHERE email_id IN ('.implode(',',$_POST['ids']).') OR autoresp_email_id IN ('.implode(',',$_POST['ids']).')';
+                     'WHERE email_id IN ('.
+                        implode(',', array_map('db_input', $_POST['ids'])).
+                     ') OR autoresp_email_id IN ('.
+                        implode(',', array_map('db_input', $_POST['ids'])).')';
                 list($depts)=db_fetch_row(db_query($sql));
                 if($depts>0){
                     $errors['err']='One or more of the selected emails is being used by a department. Remove association first!';
diff --git a/scp/filters.php b/scp/filters.php
index f39b794d0..665f5bd1e 100644
--- a/scp/filters.php
+++ b/scp/filters.php
@@ -48,7 +48,8 @@ if($_POST){
             }else{
                 $count=count($_POST['ids']);
                 if($_POST['enable']){
-                    $sql='UPDATE '.EMAIL_FILTER_TABLE.' SET isactive=1 WHERE id IN ('.implode(',',$_POST['ids']).')';
+                    $sql='UPDATE '.EMAIL_FILTER_TABLE.' SET isactive=1 WHERE id IN ('.
+                        implode(',', array_map('db_input', $_POST['ids'])).')';
                     if(db_query($sql) && ($num=db_affected_rows())){
                         if($num==$count)
                             $msg='Selected filters enabled';
@@ -58,7 +59,8 @@ if($_POST){
                         $errors['err']='Unable to enable selected filters';
                     }
                 }elseif($_POST['disable']){
-                    $sql='UPDATE '.EMAIL_FILTER_TABLE.' SET isactive=0  WHERE id IN ('.implode(',',$_POST['ids']).')';
+                    $sql='UPDATE '.EMAIL_FILTER_TABLE.' SET isactive=0  WHERE id IN ('.
+                        implode(',', array_map('db_input', $_POST['ids'])).')';
                     if(db_query($sql) && ($num=db_affected_rows())) {
                         if($num==$count)
                             $msg='Selected filters disabled';
diff --git a/scp/groups.php b/scp/groups.php
index 7a4f95916..4deefd48c 100644
--- a/scp/groups.php
+++ b/scp/groups.php
@@ -43,7 +43,8 @@ if($_POST){
             }else{
                 $count=count($_POST['ids']);
                 if($_POST['enable']){
-                    $sql='UPDATE '.GROUP_TABLE.' SET group_enabled=1, updated=NOW() WHERE group_id IN ('.implode(',',$_POST['ids']).')';
+                    $sql='UPDATE '.GROUP_TABLE.' SET group_enabled=1, updated=NOW() WHERE group_id IN ('.
+                        implode(',', array_map('db_input', $_POST['ids'])).')';
                     if(db_query($sql) && ($num=db_affected_rows())){
                         if($num==$count)
                             $msg='Selected groups activated';
@@ -53,7 +54,8 @@ if($_POST){
                         $errors['err']='Unable to activate selected groups';
                     }
                 }elseif($_POST['disable']){
-                    $sql='UPDATE '.GROUP_TABLE.' SET group_enabled=0, updated=NOW() WHERE group_id IN ('.implode(',',$_POST['ids']).')';
+                    $sql='UPDATE '.GROUP_TABLE.' SET group_enabled=0, updated=NOW() WHERE group_id IN ('.
+                        implode(',', array_map('db_input', $_POST['ids'])).')';
                     if(db_query($sql) && ($num=db_affected_rows())) {
                         if($num==$count)
                             $msg='Selected groups disabled';
diff --git a/scp/helptopics.php b/scp/helptopics.php
index 18c34393e..45a288f41 100644
--- a/scp/helptopics.php
+++ b/scp/helptopics.php
@@ -45,7 +45,8 @@ if($_POST){
             }else{
                 $count=count($_POST['ids']);
                 if($_POST['enable']){
-                    $sql='UPDATE '.TOPIC_TABLE.' SET isactive=1 WHERE topic_id IN ('.implode(',',$_POST['ids']).')';
+                    $sql='UPDATE '.TOPIC_TABLE.' SET isactive=1 WHERE topic_id IN ('.
+                        implode(',', array_map('db_input', $_POST['ids'])).')';
                     if(db_query($sql) && ($num=db_affected_rows())){
                         if($num==$count)
                             $msg='Selected help topics enabled';
@@ -55,7 +56,8 @@ if($_POST){
                         $errors['err']='Unable to enable selected help topics.';
                     }
                 }elseif($_POST['disable']){
-                    $sql='UPDATE '.TOPIC_TABLE.' SET isactive=0  WHERE topic_id IN ('.implode(',',$_POST['ids']).')';
+                    $sql='UPDATE '.TOPIC_TABLE.' SET isactive=0  WHERE topic_id IN ('.
+                        implode(',', array_map('db_input', $_POST['ids'])).')';
                     if(db_query($sql) && ($num=db_affected_rows())) {
                         if($num==$count)
                             $msg='Selected help topics disabled';
diff --git a/scp/slas.php b/scp/slas.php
index c67a4d8cd..8c7c1b4af 100644
--- a/scp/slas.php
+++ b/scp/slas.php
@@ -45,7 +45,8 @@ if($_POST){
             }else{
                 $count=count($_POST['ids']);
                 if($_POST['enable']){
-                    $sql='UPDATE '.SLA_TABLE.' SET isactive=1 WHERE id IN ('.implode(',',$_POST['ids']).')';
+                    $sql='UPDATE '.SLA_TABLE.' SET isactive=1 WHERE id IN ('.
+                        implode(',', array_map('db_input', $_POST['ids'])).')';
                     if(db_query($sql) && ($num=db_affected_rows())){
                         if($num==$count)
                             $msg='Selected SLA plans enabled';
@@ -55,7 +56,8 @@ if($_POST){
                         $errors['err']='Unable to enable selected SLA plans.';
                     }
                 }elseif($_POST['disable']){
-                    $sql='UPDATE '.SLA_TABLE.' SET isactive=0  WHERE id IN ('.implode(',',$_POST['ids']).')';
+                    $sql='UPDATE '.SLA_TABLE.' SET isactive=0  WHERE id IN ('.
+                        implode(',', array_map('db_input', $_POST['ids'])).')';
                     if(db_query($sql) && ($num=db_affected_rows())) {
                         if($num==$count)
                             $msg='Selected SLA plans disabled';
diff --git a/scp/staff.php b/scp/staff.php
index 863a348c9..eacafb317 100644
--- a/scp/staff.php
+++ b/scp/staff.php
@@ -45,7 +45,8 @@ if($_POST){
             }else{
                 $count=count($_POST['ids']);
                 if($_POST['enable']){
-                    $sql='UPDATE '.STAFF_TABLE.' SET isactive=1 WHERE staff_id IN ('.implode(',',$_POST['ids']).')';
+                    $sql='UPDATE '.STAFF_TABLE.' SET isactive=1 WHERE staff_id IN ('.
+                        implode(',', array_map('db_input', $_POST['ids'])).')';
                     if(db_query($sql) && ($num=db_affected_rows())){
                         if($num==$count)
                             $msg='Selected staff activated';
diff --git a/scp/syslogs.php b/scp/syslogs.php
index 843fecd84..aaaf1843c 100644
--- a/scp/syslogs.php
+++ b/scp/syslogs.php
@@ -23,7 +23,8 @@ if($_POST){
             }else{
                 $count=count($_POST['ids']);
                 if($_POST['delete']){
-                    $sql='DELETE FROM '.SYSLOG_TABLE.' WHERE log_id IN ('.implode(',',$_POST['ids']).')';
+                    $sql='DELETE FROM '.SYSLOG_TABLE.' WHERE log_id IN ('
+                        .implode(',', array_map('db_input', $_POST['ids'])).')';
                     if(db_query($sql) && ($num=db_affected_rows())){
                         if($num==$count)
                             $msg='Selected logs deleted successfully';
diff --git a/scp/teams.php b/scp/teams.php
index c57937219..2fcbb1b1e 100644
--- a/scp/teams.php
+++ b/scp/teams.php
@@ -43,7 +43,8 @@ if($_POST){
             }else{
                 $count=count($_POST['ids']);
                 if($_POST['enable']){
-                    $sql='UPDATE '.TEAM_TABLE.' SET isenabled=1 WHERE team_id IN ('.implode(',',$_POST['ids']).')';
+                    $sql='UPDATE '.TEAM_TABLE.' SET isenabled=1 WHERE team_id IN ('.
+                        implode(',', array_map('db_input', $_POST['ids'])).')';
                     if(db_query($sql) && ($num=db_affected_rows())){
                         if($num==$count)
                             $msg='Selected teams activated';
@@ -53,7 +54,8 @@ if($_POST){
                         $errors['err']='Unable to activate selected teams';
                     }
                 }elseif($_POST['disable']){
-                    $sql='UPDATE '.TEAM_TABLE.' SET isenabled=0 WHERE team_id IN ('.implode(',',$_POST['ids']).')';
+                    $sql='UPDATE '.TEAM_TABLE.' SET isenabled=0 WHERE team_id IN ('.
+                        implode(',', array_map('db_input', $_POST['ids'])).')';
                     if(db_query($sql) && ($num=db_affected_rows())) {
                         if($num==$count)
                             $msg='Selected teams disabled';
diff --git a/scp/templates.php b/scp/templates.php
index 47e24dd6e..b87713662 100644
--- a/scp/templates.php
+++ b/scp/templates.php
@@ -54,7 +54,8 @@ if($_POST){
             }else{
                 $count=count($_POST['ids']);
                 if($_POST['enable']){
-                    $sql='UPDATE '.EMAIL_TEMPLATE_TABLE.' SET isactive=1 WHERE tpl_id IN ('.implode(',',$_POST['ids']).')';
+                    $sql='UPDATE '.EMAIL_TEMPLATE_TABLE.' SET isactive=1 WHERE tpl_id IN ('.
+                        implode(',', array_map('db_input', $_POST['ids'])).')';
                     if(db_query($sql) && ($num=db_affected_rows())){
                         if($num==$count)
                             $msg='Selected templates enabled';
-- 
GitLab