コード例 #1
0
 /**
  * Function to delete an ids log entry
  */
 public function deleteidsentryAction()
 {
     // verify auth-key
     $this->checkCsrfToken();
     // Security check
     if (!SecurityUtil::checkPermission('SecurityCenter::', '::', ACCESS_DELETE)) {
         throw new \Zikula\Framework\Exception\ForbiddenException();
     }
     // get paramters
     $id = (int) $this->request->get('id', 0);
     // sanity check
     if (!is_numeric($id)) {
         return LogUtil::registerError($this->__f("Error! Received a non-numeric object ID '%s'.", $id));
     }
     $object = new \SecurityCenterModule\DBObject\Intrusion();
     $data = $object->get($id);
     // check for valid object
     if (!$data) {
         return LogUtil::registerError($this->__f('Error! Invalid %s received.', "object ID [{$id}]"));
     } else {
         // delete object
         $object->delete();
     }
     // redirect back to view function
     return $this->redirect(ModUtil::url('SecurityCenter', 'admin', 'viewidslog'));
 }
コード例 #2
0
 /**
  * Process results from IDS scan.
  *
  * @param \IDS_Init   $init   PHPIDS init object reference.
  * @param \IDS_Report $result The result object from PHPIDS.
  *
  * @return void
  */
 private function _processIdsResult(\IDS_Init $init, \IDS_Report $result)
 {
     // $result contains any suspicious fields enriched with additional info
     // Note: it is moreover possible to dump this information by simply doing
     //"echo $result", calling the IDS_Report::$this->__toString() method implicitely.
     $requestImpact = $result->getImpact();
     if ($requestImpact < 1) {
         // nothing to do
         return;
     }
     // update total session impact to track an attackers activity for some time
     $sessionImpact = SessionUtil::getVar('idsImpact', 0) + $requestImpact;
     SessionUtil::setVar('idsImpact', $sessionImpact);
     // let's see which impact mode we are using
     $idsImpactMode = System::getVar('idsimpactmode', 1);
     $idsImpactFactor = 1;
     if ($idsImpactMode == 1) {
         $idsImpactFactor = 1;
     } elseif ($idsImpactMode == 2) {
         $idsImpactFactor = 10;
     } elseif ($idsImpactMode == 3) {
         $idsImpactFactor = 5;
     }
     // determine our impact threshold values
     $impactThresholdOne = System::getVar('idsimpactthresholdone', 1) * $idsImpactFactor;
     $impactThresholdTwo = System::getVar('idsimpactthresholdtwo', 10) * $idsImpactFactor;
     $impactThresholdThree = System::getVar('idsimpactthresholdthree', 25) * $idsImpactFactor;
     $impactThresholdFour = System::getVar('idsimpactthresholdfour', 75) * $idsImpactFactor;
     $usedImpact = $idsImpactMode == 1 ? $requestImpact : $sessionImpact;
     // react according to given impact
     if ($usedImpact > $impactThresholdOne) {
         // db logging
         // determine IP address of current user
         $_REMOTE_ADDR = System::serverGetVar('REMOTE_ADDR');
         $_HTTP_X_FORWARDED_FOR = System::serverGetVar('HTTP_X_FORWARDED_FOR');
         $ipAddress = $_HTTP_X_FORWARDED_FOR ? $_HTTP_X_FORWARDED_FOR : $_REMOTE_ADDR;
         $currentPage = System::getCurrentUri();
         $currentUid = UserUtil::getVar('uid');
         $intrusionItems = array();
         foreach ($result as $event) {
             $eventName = $event->getName();
             $malVar = explode(".", $eventName, 2);
             $filters = array();
             foreach ($event as $filter) {
                 array_push($filters, array('id' => $filter->getId(), 'description' => $filter->getDescription(), 'impact' => $filter->getImpact(), 'tags' => $filter->getTags(), 'rule' => $filter->getRule()));
             }
             $tagVal = $malVar[1];
             $newIntrusionItem = array('name' => array($eventName), 'tag' => $tagVal, 'value' => $event->getValue(), 'page' => $currentPage, 'uid' => $currentUid, 'ip' => $ipAddress, 'impact' => $result->getImpact(), 'filters' => serialize($filters), 'date' => DateUtil::getDatetime());
             if (array_key_exists($tagVal, $intrusionItems)) {
                 $intrusionItems[$tagVal]['name'][] = $newIntrusionItem['name'][0];
             } else {
                 $intrusionItems[$tagVal] = $newIntrusionItem;
             }
         }
         // log details to database
         foreach ($intrusionItems as $tag => $intrusionItem) {
             $intrusionItem['name'] = implode(", ", $intrusionItem['name']);
             // create new ZIntrusion instance
             $obj = new \SecurityCenterModule\DBObject\Intrusion();
             // set data
             $obj->setData($intrusionItem);
             // save object to db
             $obj->save();
         }
     }
     if (System::getVar('idsmail') && $usedImpact > $impactThresholdTwo) {
         // mail admin
         // prepare mail text
         $mailBody = __('The following attack has been detected by PHPIDS') . "\n\n";
         $mailBody .= __f('IP: %s', $ipAddress) . "\n";
         $mailBody .= __f('UserID: %s', $currentUid) . "\n";
         $mailBody .= __f('Date: %s', DateUtil::strftime(__('%b %d, %Y'), time())) . "\n";
         if ($idsImpactMode == 1) {
             $mailBody .= __f('Request Impact: %d', $requestImpact) . "\n";
         } else {
             $mailBody .= __f('Session Impact: %d', $sessionImpact) . "\n";
         }
         $mailBody .= __f('Affected tags: %s', join(' ', $result->getTags())) . "\n";
         $attackedParameters = '';
         foreach ($result as $event) {
             $attackedParameters .= $event->getName() . '=' . urlencode($event->getValue()) . ", ";
         }
         $mailBody .= __f('Affected parameters: %s', trim($attackedParameters)) . "\n";
         $mailBody .= __f('Request URI: %s', urlencode($currentPage));
         // prepare other mail arguments
         $siteName = System::getVar('sitename');
         $adminmail = System::getVar('adminmail');
         $mailTitle = __('Intrusion attempt detected by PHPIDS');
         if (ModUtil::available('MailerModule')) {
             $args = array();
             $args['fromname'] = $siteName;
             $args['fromaddress'] = $adminmail;
             $args['toname'] = 'Site Administrator';
             $args['toaddress'] = $adminmail;
             $args['subject'] = $mailTitle;
             $args['body'] = $mailBody;
             $rc = ModUtil::apiFunc('MailerModule', 'user', 'sendmessage', $args);
         } else {
             $headers = "From: {$siteName} <{$adminmail}>\n" . "X-Priority: 1 (Highest)";
             System::mail($adminmail, $mailTitle, $mailBody, $headers);
         }
     }
     if ($usedImpact > $impactThresholdThree) {
         // block request
         if (System::getVar('idssoftblock')) {
             // warn only for debugging the ruleset
             LogUtil::registerError(__('Malicious request code / a hacking attempt was detected. This request has NOT been blocked!'));
         } else {
             throw new Zikula_Exception_Forbidden(__('Malicious request code / a hacking attempt was detected. Thus this request has been blocked.'), null, $result);
         }
     }
     return;
 }