у меня есть CMS но у него есть дырка

spdigital

Новичок
у меня есть CMS но у него есть дырка простим expolit запросом можно создать нового админа помогите решить эту проблему или дайте совет :unsure:

вот UsersController
PHP:
<?php
 
class UsersController extends plan_Controller
{
    public function browseAction()
    {
        $this->checkLogin();
    }
    
    
    public function dataAction()
    {
        if(!$this->checkLogin(false))
        {
            echo Cadastre_Controller::RESULT_SESSION_EXPIRED; return;
        }
        $this->_dispatcher->enableView(true);
        $this->_dispatcher->enableLayout(false);
    }
    
    
    public function formAction()
    {
        if(!$this->checkLogin(false))
        {
            echo Cadastre_Controller::RESULT_SESSION_EXPIRED; return;
        }
        $this->_dispatcher->enableView(true);
        $this->_dispatcher->enableLayout(false);
        
    }
    
        
    public function saveAction()
    {
        $this->checkLogin();
         
        $oRequest = $this->_dispatcher->getRequest();
        
        $this->_dispatcher->enableView(false);
        $result = 1;
        $message = '';
 
        $oUsers = new Users();
        try {
            $email = $oRequest->getParam('email');
            if(!empty($email))
            {
                $oEmailValidator = new App_Validate_Email('users.msgInvalidEmail');
                if(!$oEmailValidator->isValid($email))
                    throw new App_Exception_Validate($oEmailValidator->getFailureMessage());
            }
                
            $username = $oRequest->getParam('username');
            $oNonEmptyValidator = new App_Validate_NonEmpty('users.msgUsernameEmpty');
            if(!$oNonEmptyValidator->isValid($username))
                throw new App_Exception_Validate($oNonEmptyValidator->getFailureMessage());
                
            $user_type_id = $oRequest->getParam('user_type_id');
            $oNonEmptyValidator = new App_Validate_NonEmpty('users.msgUsertypeEmpty');
            if(!$oNonEmptyValidator->isValid($user_type_id))
                throw new App_Exception_Validate($oNonEmptyValidator->getFailureMessage());
            
            $status = $oRequest->getParam('hidden');
            $data = array(
                'hidden' => ($status == 'on') ? '1' : '0',
                'username' => $username,
                'user_type_id' => $user_type_id,
                'password' => $oRequest->getParam('password'),
                'email' => $oRequest->getParam('email')
            );
            
            $oLanguages = new Languages();
            $languages = $oLanguages->getLanguagesByCodes(App_Registry::get('languages'));
            
            $content_data = array();
            foreach($languages as $lang=>$lang_id)
            {
                $firstname = $oRequest->getParam('firstname_'.$lang);
                $lastname = $oRequest->getParam('lastname_'.$lang);
                $secondname = $oRequest->getParam('secondname_'.$lang);
 
                $content_data[] = array(
                    'lang_id' => $lang_id,
                    'firstname' => $firstname,
                    'lastname' => $lastname,
                    'secondname' => $secondname,
                );
            }
            
            $user_id = $oRequest->getParam('user_id');
            if(empty($user_id))
            {
                $oUsers->addUser($data, $content_data);
            }
            else
            {
                $oUsers->updateUser($user_id, $data, $content_data);
            }
            $oUsers->db_commit();
        }
        catch(App_Exception_NonCritical $e)
        {
            $oUsers->db_rollback();
            $result = 0;
            $message = $e->getMessage();
        }
        
        echo App_Json::encode(array('result'=>$result, 'message'=>$message));
    }
    
    
    public function deleteAction()
    {
        if(!$this->checkLogin(false))
        {
            echo App_Json::encode(array('result'=>Cadastre_Controller::RESULT_SESSION_EXPIRED)); return;
        }
        
        $id = $this->_dispatcher->getRequest()->getParam('id');
 
        $oUsers = new Users();
        try {
            $oUsers->deleteUser($id);
            $oUsers->getAdapter()->commit();
            $result = 1;
            $message = '';
        }
        catch(App_Db_Exception_RowIsReferenced $e)
        {
            $oUsers->getAdapter()->rollback();
            $result = 0;
            $message = $this->_dispatcher->getTranslator()->translate('users.msgUserCannotBeDeleted');
        }
        catch(App_Exception_NonCritical $e)
        {
            $oUsers->getAdapter()->rollback();
            $result = 0;
            $message = $this->_dispatcher->getTranslator()->translate($e->getMessage());
        }
        echo App_Json::encode(array('result'=>$result, 'message'=>$message));
    }
}
вот сам код expolita исходник autoit
PHP:
Global $sPostData = "username=" & $adduser  & "&password=" &$addpass & "&email=" & $rndmail &"&user_type_id=1&firstname_en=" & $adduser & "&lastname_en=" & $adduser & "&secondname_en=" & $adduser & "&firstname_am=&lastname_am=&secondname_am=&firstname_ru=&lastname_ru=&s econdname_ru=&user_id=0&x-technology=ajax"
 
 
Global $hOpen = _WinHttpOpen("Mozilla/5.0 (X11; U; Linux i686; en-US; rv:0.9.4) Gecko/20120122 Netscape6/6.2")
 
 
Global $hConnect = _WinHttpConnect($hOpen, $sAddress)
 
 
Global $hRequest = _WinHttpOpenRequest($hConnect, _
        "POST", _
        "admin/users/save", _
        Default, _
        Default, _
        "application/json, text/javascript, */*")
 
 
_WinHttpAddRequestHeaders($hRequest, "Accept-Language: en-us,en;q=0.5")
_WinHttpAddRequestHeaders($hRequest, "Accept-Encoding: gzip, deflate")
_WinHttpAddRequestHeaders($hRequest, "DNT: 1")
_WinHttpAddRequestHeaders($hRequest, "Keep-Alive: 300")
_WinHttpAddRequestHeaders($hRequest, "Connection: keep-alive")
_WinHttpAddRequestHeaders($hRequest, "Content-Type: application/x-www-form-urlencoded; charset=UTF-8")
_WinHttpAddRequestHeaders($hRequest, "X-Requested-With: XMLHttpRequest")
 

AmdY

Пью пиво
Команда форума
Данный код работает так как задумывали его авторы. Другое дело что в отсутствующем коде checkLogin может быть дырка позволяющая добавлять пользователей без авторизации.
 

spdigital

Новичок
PHP:
<?php

class pl_Controller extends App_Dispatcher_Universal_Controller_Abstract
{
	const RESULT_SESSION_EXPIRED = 'session_expired';
	
	
	/**
	 * Callback function, called by dispatcher before any action method
	 * Controller classes can override it, to do something before controller's action execution
	 * @access public
	 */
	public function beforeActionCallback()
	{
		App_Registry::set('LANG_ID', $this->getRequestLanguageId());
	}
	
	
	/**
	 * Returns language id of the language passed by url
	 * @return integer
	 */
	public function getRequestLanguageId()
	{
		$lang = new Languages();
		$lang_code = $this->_dispatcher->getRoute()->getLanguage();
		$langArr = $lang->getLanguagesByCodes(array($lang_code)) ;
		return $langArr[$lang_code];
	}
	
	
	/**
	 * Checks if user has been logged in prevoiusly.
	 * Renders login page if user is not logged in
	 * @access protected
	 * @param boolean $bForward    If true - render error page
	 * @return boolean    false - if session expired
	 */
	protected function checkLogin($bForward = true)
	{
		if(null === App_Registry::get('temp_sn')->user_id)
		{
			if($bForward)
			{
				$oRoute = $this->_dispatcher->getRoute();
				$oRoute->forward(null, $oRoute->getIndexController(), $oRoute->getIndexAction());
			}
			return false;
		}
		return true;
	}
}
вот код
 

AmdY

Пью пиво
Команда форума
if(null === App_Registry::get('temp_sn')->user_id)
Здесь делается проверка авторизирован ли пользователь. что там у вас лежит не знаю. Ваш сканер похоже куки не отсыылает и не понятно как эта проверка может проходить безболезненно, при вызове метода checkLogin параметр false в saveAction-е не передаётся. Нужно лопатить другие исходники и дебажить.
Я так понимаю что вы не программист, поэтому проще нанять специалиста со знанием Zend Framework, который за минимальную цену закроет этот дефект.
 

MiksIr

miksir@home:~$
Посмотрите как используется checkLogin во всех actionXXX и сравните с тем, что в actionSave
 
  • Like
Реакции: AmdY

AmdY

Пью пиво
Команда форума
MiksIr
Судя по коду там должен быть редирект $oRoute->forward
Или там просто дёргается другой экшин а затем довыполняется этот.
 

AmdY

Пью пиво
Команда форума
Да, вопрос снят, редирект в ZF делается через _redirect, MiksIr прав.
 
Сверху