Июл 24, 2015

В первой части мы разобрались, как работает пробный период системы. Ok, продолжим тянуть одеяло на себя.
Задача: изменить дату окончания пробного периода.
Погнали!
Смотрим, как дешифруются даты в файле ...modules/main/include.php:
$_1986987364 = COption::GetOptionString("main", "admin_passwordh");
while ($_1986987364) {
$_461848715 = base64_decode($_1986987364);
$_658498780 = "";
$_2139208883 = "thRH4u67fhw87V7Hyr12Hwy0rFr";
$_1215634966 = strlen($_2139208883);
$_278722441 = 0;
for ($_307887909 = 0; $_307887909 < strlen($_461848715); $_307887909++) {
$_658498780 .= chr(ord($_461848715[$_307887909]) ^ ord($_2139208883[$_278722441]));
if ($_278722441 == $_1215634966 - 1)
$_278722441 = 0;
else
$_278722441 = $_278722441 + 1;
}
//SITEEXPIREDATE
$_912457331 = mktime(0, 0, 0, intval($_658498780[6] . $_658498780[3]), intval($_658498780[1] . $_658498780[14]), intval($_658498780[10] . $_658498780[18] . $_658498780[7] . $_658498780[12]));
unset($_2139208883);
break;
}
@include($_SERVER["DOCUMENT_ROOT"] . "/bitrix/modules/main/admin/define.php");
while (defined("TEMPORARY_CACHE")) {
$_1494959871 = base64_decode(constant("TEMPORARY_CACHE"));
$_464054490 = "";
$_527681262 = "DO_NOT_STEAL_OUR_BUS";
$_278722441 = 0;
for ($_307887909 = 0; $_307887909 < strlen($_1494959871); $_307887909++) {
$_464054490 .= chr(ord($_1494959871[$_307887909]) ^ ord($_527681262[$_278722441]));
if ($_278722441 == 19)
$_278722441 = 0;
else
$_278722441 = $_278722441 + 1;
}
//OLDSITEEXPIREDATE
$_1749264640 = mktime(0, 0, 0, intval($_464054490[6] . $_464054490[16]), intval($_464054490[9] . $_464054490[2]), intval($_464054490[12] . $_464054490[7] . $_464054490[14] . $_464054490[3]));
unset($_527681262);
break;
}
Берётся значение, декодируется из base64, прогоняется через XOR, из результата выдираются отдельные символы и формируется юникс тайм... Вся прелесть XOR шифрования в том, что для получения исходника достаточно прогнать зашифрованные данные через тот же цикл с тем же ключом.
Отлично.
Напишем универсальную функцию и скормим ей +30 дней от текущей даты.
<?php
function BitrixExpireDate($date, $key){
$outCode = '';
$x = 0;
for ($i = 0; $i < strlen($date); $i++) {
$outCode .= chr(ord($date[$i]) ^ ord($key[$x]));
if ($x == strlen($key) - 1)
$x = 0;
else
$x = $x + 1;
}
return $outCode;
}
$key1 = 'DO_NOT_STEAL_OUR_BUS+'; // OLDSITEEXPIREDATE
$key2 = 'thRH4u67fhw87V7Hyr12Hwy0rFr+'; // SITEEXPIREDATE
$nowDate = date('mdY', time() + 60*60*24*30); // сегодня 07242015
$codeDate1 = 'XX'.$nowDate[3].$nowDate[7].'XX'.$nowDate[0].$nowDate[5].'X'.$nowDate[2].'XX'.$nowDate[4].'X'.$nowDate[6].'X'.$nowDate[1].'X'; // OLDSITEEXPIREDATE
$codeDate2 = 'X'.$nowDate[2].'X'.$nowDate[1].'XX'.$nowDate[0].$nowDate[6].'XX'.$nowDate[4].'X'.$nowDate[7].'X'.$nowDate[3].'XXX'.$nowDate[5]; // SITEEXPIREDATE
echo $outCode1 = base64_encode(BitrixExpireDate($codeDate1, $key1)); // OLDSITEEXPIREDATE
echo '<br>';
echo $outCode2 = base64_encode(BitrixExpireDate($codeDate2, $key2)); // SITEEXPIREDATE
?>
Запускаем, получаем результат.
HBdsexcMb2MMdxkUbRdkCmca
LFoKcGwtBgY+MEVgAg4EECEqAQ==
Шикарно!:) Меняем значения в файле ...modules/main/admin/define.php и в строке admin_passwordh (таблица b_option), чистим ...managed_cache/, смотрим, что получилось.

Работает!
Дальше, думаю, понятно. Допиливаем скрипт, ложим на сервер, дёргаем кроном раз в сутки - вечные 30 дней триала и никаких модификаций ядра:)
Хак
Июл 23, 2015

Опустим лирику. Совершенно не важно, как так случилось, что на моём антресольном сервере завелась система «номер один» российского сайтостроения. У нас есть тридцать дней на то, чтобы пощупать продукт, надеть тапки и занести деньги в контору - факт. Конечно, мы так и сделаем, но тридцать дней - мало. Поэтому, лезем в ядро бороться с системой.
С чего начать?.. Естественно, с месседжа в админке: «До истечения пробного периода осталось XX дней.»
И так, разбираемся, откуда растут ноги. Погнали!
Поиском по содержимому файлов добираемся до
..modules/main/interface/prolog_main_admin.php
Часть кода, которая выводит предупреждение:
...
// @global string $SiteExpireDate
...
$delta = $SiteExpireDate-time();
$daysToExpire = ($delta < 0? 0 : ceil($delta/86400));
...
<span class="required"><?echo GetMessage("TRIAL_ATTENTION") ?></span>
<?echo GetMessage("TRIAL_ATTENTION_TEXT1_".$vendor) ?>
<?if ($daysToExpire >= 0):?>
<?echo GetMessage("TRIAL_ATTENTION_TEXT2") ?> <span class="required"><b><?echo $daysToExpire?></b></span> <?echo GetMessage("TRIAL_ATTENTION_TEXT3") ?>.
<?else:?>
<?echo GetMessage("TRIAL_ATTENTION_TEXT4_".$vendor) ?>
<?endif;?>
<?echo GetMessage("TRIAL_ATTENTION_TEXT5_".$vendor) ?>
Упираемся в переменную $SiteExpireDate. Она задаётся где-то не здесь. Ищем, где...
Чёрт его знает где:) Но, встречается в файле ...modules/main/include/prolog_after.php, в котором есть интересная для нас логика:
if(defined("OLDSITEEXPIREDATE") && defined("SITEEXPIREDATE") && OLDSITEEXPIREDATE != SITEEXPIREDATE)
die(GetMessage("expire_mess2"));
Две жизненно важные константы OLDSITEEXPIREDATE и SITEEXPIREDATE. Поиск по ним приводит к хитрому файлу ...modules/main/include.php Отлично! Но, придётся повозиться. Файл содержит ахрененно длинную строку с раздестроенным, PHP кодом. В конторе работают знатные извращенцы:))))) Типа, зашифровали:)
Ок. Приведём в порядок... Полтора часа возни, и получаем читаемый, упрощённый код.
Щаз будет длинно:)))))
<?php
require_once(substr(__FILE__, 0, strlen(__FILE__) - strlen("/include.php")) . "/bx_root.php");
require_once($_SERVER["DOCUMENT_ROOT"] . "/bitrix/modules/main/start.php");
require_once($_SERVER["DOCUMENT_ROOT"] . "/bitrix/modules/main/classes/general/virtual_io.php");
require_once($_SERVER["DOCUMENT_ROOT"] . "/bitrix/modules/main/classes/general/virtual_file.php");
$_488120950 = \Bitrix\Main\Application::getInstance();
$_488120950->initializeExtendedKernel(array(
"get" => $_GET,
"post" => $_POST,
"files" => $_FILES,
"cookie" => $_COOKIE,
"server" => $_SERVER,
"env" => $_ENV
));
$GLOBALS["APPLICATION"] = new CMain;
if (defined("SITE_ID"))
define("LANG", SITE_ID);
if (defined("LANG")) {
if (defined("ADMIN_SECTION") && ADMIN_SECTION === true)
$_1015422197 = CLangAdmin::GetByID(LANG);
else
$_1015422197 = CLang::GetByID(LANG);
$_711298694 = $_1015422197->Fetch();
} else {
$_711298694 = $GLOBALS["APPLICATION"]->GetLang();
define("LANG", $_711298694["LID"]);
}
$_1946907838 = $_711298694["LID"];
if (!defined("SITE_ID"))
define("SITE_ID", $_711298694["LID"]);
define("SITE_DIR", $_711298694["DIR"]);
define("SITE_SERVER_NAME", $_711298694["SERVER_NAME"]);
define("SITE_CHARSET", $_711298694["CHARSET"]);
define("FORMAT_DATE", $_711298694["FORMAT_DATE"]);
define("FORMAT_DATETIME", $_711298694["FORMAT_DATETIME"]);
define("LANG_DIR", $_711298694["DIR"]);
define("LANG_CHARSET", $_711298694["CHARSET"]);
define("LANG_ADMIN_LID", $_711298694["LANGUAGE_ID"]);
define("LANGUAGE_ID", $_711298694["LANGUAGE_ID"]);
$_919381780 = $_488120950->getContext();
$_919381780->setLanguage(LANGUAGE_ID);
$_919381780->setCulture(new \Bitrix\Main\Context\Culture($_711298694));
$_415566121 = $_919381780->getRequest();
if (!$_415566121->isAdminSection()) {
$_919381780->setSite(SITE_ID);
}
$_488120950->start();
$GLOBALS["APPLICATION"]->reinitPath();
if (!defined("POST_FORM_ACTION_URI")) {
define("POST_FORM_ACTION_URI", htmlspecialcharsbx(GetRequestUri()));
}
$GLOBALS["MESS"] = array();
$GLOBALS["ALL_LANG_FILES"] = array();
IncludeModuleLangFile($_SERVER["DOCUMENT_ROOT"] . BX_ROOT . "/modules/main/tools.php");
IncludeModuleLangFile($_SERVER["DOCUMENT_ROOT"] . BX_ROOT . "/modules/main/classes/general/database.php");
IncludeModuleLangFile($_SERVER["DOCUMENT_ROOT"] . BX_ROOT . "/modules/main/classes/general/main.php");
IncludeModuleLangFile(__FILE__);
error_reporting(COption::GetOptionInt("main", "error_reporting", E_COMPILE_ERROR | E_ERROR | E_CORE_ERROR | E_PARSE) & ~E_STRICT);
if (!defined("BX_COMP_MANAGED_CACHE") && COption::GetOptionString("main", "component_managed_cache_on", "Y") <> "N") {
define("BX_COMP_MANAGED_CACHE", true);
}
require_once($_SERVER["DOCUMENT_ROOT"] . BX_ROOT . "/modules/main/filter_tools.php");
require_once($_SERVER["DOCUMENT_ROOT"] . BX_ROOT . "/modules/main/ajax_tools.php");
class CBXFeatures
{
public static function IsFeatureEnabled($_2128331551)
{
return true;
}
public static function IsFeatureEditable($_2128331551)
{
return true;
}
public static function SetFeatureEnabled($_2128331551, $_807891038 = true)
{
}
public static function SaveFeaturesSettings($_1802077022, $_1385896842)
{
}
public static function GetFeaturesList()
{
return array();
}
public static function InitiateEditionsSettings($_2138200839)
{
}
public static function ModifyFeaturesSettings($_2138200839, $_495981549)
{
}
public static function IsFeatureInstalled($_2128331551)
{
return true;
}
}
$_276020476 = GetMessage("expire_mess2");
$_1069399946 = 14;
define("DEMO", "Y");
$_912457331 = 1;
unset($_1986987364);
$_1986987364 = COption::GetOptionString("main", "admin_passwordh");
while ($_1986987364) {
$_461848715 = base64_decode($_1986987364);
$_658498780 = "";
$_2139208883 = "thRH4u67fhw87V7Hyr12Hwy0rFr";
$_1215634966 = strlen($_2139208883);
$_278722441 = 0;
for ($_307887909 = 0; $_307887909 < strlen($_461848715); $_307887909++) {
$_658498780 .= chr(ord($_461848715[$_307887909]) ^ ord($_2139208883[$_278722441]));
if ($_278722441 == $_1215634966 - 1)
$_278722441 = 0;
else
$_278722441 = $_278722441 + 1;
}
//SITEEXPIREDATE
$_912457331 = mktime(0, 0, 0, intval($_658498780[6] . $_658498780[3]), intval($_658498780[1] . $_658498780[14]), intval($_658498780[10] . $_658498780[18] . $_658498780[7] . $_658498780[12]));
unset($_2139208883);
break;
}
$_116706979 = "http://bitrixsoft.com/bitrix/bs.php";
@include($_SERVER["DOCUMENT_ROOT"] . "/bitrix/modules/main/admin/define.php");
$_1749264640 = 2;
while (defined("TEMPORARY_CACHE")) {
$_1494959871 = base64_decode(constant("TEMPORARY_CACHE"));
$_464054490 = "";
$_527681262 = "DO_NOT_STEAL_OUR_BUS"; // Не воровать наш автобус!:))) Хахаха:)))) Зачёт!:)))
$_278722441 = 0;
for ($_307887909 = 0; $_307887909 < strlen($_1494959871); $_307887909++) {
$_464054490 .= chr(ord($_1494959871[$_307887909]) ^ ord($_527681262[$_278722441]));
if ($_278722441 == 19)
$_278722441 = 0;
else
$_278722441 = $_278722441 + 1;
}
//OLDSITEEXPIREDATE
$_1749264640 = mktime(0, 0, 0, intval($_464054490[6] . $_464054490[16]), intval($_464054490[9] . $_464054490[2]), intval($_464054490[12] . $_464054490[7] . $_464054490[14] . $_464054490[3]));
unset($_527681262);
break;
}
// Вечный цикл:))) Нууу, красиво, чё:)
while (!defined("DEMO")) {
function __2139868484($_642293569)
{
return $_642293569 + __2139868484($_642293569);
}
__2139868484(1);
}
if (file_exists($_SERVER["DOCUMENT_ROOT"] . "/bitrix/.config.php")) {
$bxProductConfig = array();
include($_SERVER["DOCUMENT_ROOT"] . "/bitrix/.config.php");
if (isset($bxProductConfig["saas"]["days_after_trial"])) {
$_1329209264 = intval($bxProductConfig["saas"]["days_after_trial"]);
if ($_1329209264 >= 0 && $_1329209264 < 14)
$_1069399946 = $_1329209264;
}
if ($bxProductConfig["saas"]["trial_stopped"] <> "")
$_276020476 = $bxProductConfig["saas"]["trial_stopped"];
}
for ($_307887909 = 0, $_1299663923 = (time() < mktime(0, 0, 0, 5, 1, 2010) || $_912457331 <= 10), $_1158761997 = ($_912457331 < mktime(0, 0, 0, Date("m"), date("d") - $_1069399946, date("Y"))); $_307887909 < 10, $_1299663923 || $_1158761997 || $_912457331 != $_1749264640; $_307887909++, WriteFinalMessage($_276020476));
define("OLDSITEEXPIREDATE", $_912457331);
define("SITEEXPIREDATE", $_1749264640);
$GLOBALS["SiteExpireDate"] = OLDSITEEXPIREDATE; // это мы искали в самом начале... глобальная переменная $SiteExpireDate
$GLOBALS["arCustomTemplateEngines"] = array();
require_once($_SERVER["DOCUMENT_ROOT"] . BX_ROOT . "/modules/main/classes/general/urlrewriter.php");
\Bitrix\Main\Loader::registerAutoLoadClasses("main", array(
"CSiteTemplate" => "classes/general/site_template.php",
"CBitrixComponent" => "classes/general/component.php",
"CComponentEngine" => "classes/general/component_engine.php",
"CComponentAjax" => "classes/general/component_ajax.php",
"CBitrixComponentTemplate" => "classes/general/component_template.php",
"CComponentUtil" => "classes/general/component_util.php",
"CControllerClient" => "classes/general/controller_member.php",
"PHPParser" => "classes/general/php_parser.php",
"CDiskQuota" => "classes/" . $DBType . "/quota.php",
"CEventLog" => "classes/general/event_log.php",
"CEventMain" => "classes/general/event_log.php",
"CAdminFileDialog" => "classes/general/file_dialog.php",
"WLL_User" => "classes/general/liveid.php",
"WLL_ConsentToken" => "classes/general/liveid.php",
"WindowsLiveLogin" => "classes/general/liveid.php",
"CAllFile" => "classes/general/file.php",
"CFile" => "classes/" . $DBType . "/file.php",
"CTempFile" => "classes/general/file_temp.php",
"CFavorites" => "classes/" . $DBType . "/favorites.php",
"CUserOptions" => "classes/general/user_options.php",
"CGridOptions" => "classes/general/grids.php",
"CUndo" => "/classes/general/undo.php",
"CAutoSave" => "/classes/general/undo.php",
"CRatings" => "classes/" . $DBType . "/ratings.php",
"CRatingsComponentsMain" => "classes/" . $DBType . "/ratings_components.php",
"CRatingRule" => "classes/general/rating_rule.php",
"CRatingRulesMain" => "classes/" . $DBType . "/rating_rules.php",
"CTopPanel" => "public/top_panel.php",
"CEditArea" => "public/edit_area.php",
"CComponentPanel" => "public/edit_area.php",
"CTextParser" => "classes/general/textparser.php",
"CPHPCacheFiles" => "classes/general/cache_files.php",
"CDataXML" => "classes/general/xml.php",
"CXMLFileStream" => "classes/general/xml.php",
"CRsaProvider" => "classes/general/rsasecurity.php",
"CRsaSecurity" => "classes/general/rsasecurity.php",
"CRsaBcmathProvider" => "classes/general/rsabcmath.php",
"CRsaOpensslProvider" => "classes/general/rsaopenssl.php",
"CASNReader" => "classes/general/asn.php",
"CBXShortUri" => "classes/" . $DBType . "/short_uri.php",
"CFinder" => "classes/general/finder.php",
"CAccess" => "classes/general/access.php",
"CAuthProvider" => "classes/general/authproviders.php",
"IProviderInterface" => "classes/general/authproviders.php",
"CGroupAuthProvider" => "classes/general/authproviders.php",
"CUserAuthProvider" => "classes/general/authproviders.php",
"CTableSchema" => "classes/general/table_schema.php",
"CCSVData" => "classes/general/csv_data.php",
"CSmile" => "classes/general/smile.php",
"CSmileSet" => "classes/general/smile.php",
"CUserCounter" => "classes/" . $DBType . "/user_counter.php",
"CHotKeys" => "classes/general/hot_keys.php",
"CHotKeysCode" => "classes/general/hot_keys.php",
"CBXSanitizer" => "classes/general/sanitizer.php",
"CBXArchive" => "classes/general/archive.php",
"CAdminNotify" => "classes/general/admin_notify.php",
"CBXFavAdmMenu" => "classes/general/favorites.php",
"CAdminInformer" => "classes/general/admin_informer.php",
"CSiteCheckerTest" => "classes/general/site_checker.php",
"CSqlUtil" => "classes/general/sql_util.php",
"CHTMLPagesCache" => "classes/general/cache_html.php",
"CFileUploader" => "classes/general/uploader.php",
"LPA" => "classes/general/lpa.php"
));
require_once($_SERVER["DOCUMENT_ROOT"] . BX_ROOT . "/modules/main/classes/" . $DBType . "/agent.php");
require_once($_SERVER["DOCUMENT_ROOT"] . BX_ROOT . "/modules/main/classes/" . $DBType . "/user.php");
require_once($_SERVER["DOCUMENT_ROOT"] . BX_ROOT . "/modules/main/classes/" . $DBType . "/event.php");
require_once($_SERVER["DOCUMENT_ROOT"] . BX_ROOT . "/modules/main/classes/general/menu.php");
AddEventHandler("main", "OnAfterEpilog", array(
"\Bitrix\Main\Data\ManagedCache",
"finalize"
));
require_once($_SERVER["DOCUMENT_ROOT"] . BX_ROOT . "/modules/main/classes/" . $DBType . "/usertype.php");
if (file_exists(($_602759598 = $_SERVER["DOCUMENT_ROOT"] . BX_ROOT . "/modules/main/classes/general/update_db_updater.php"))) {
$US_HOST_PROCESS_MAIN = False;
include($_602759598);
}
$GLOBALS["APPLICATION"]->AddJSKernelInfo("main", array(
"/bitrix/js/main/core/core.js",
"/bitrix/js/main/core/core_ajax.js",
"/bitrix/js/main/json/json2.min.js",
"/bitrix/js/main/core/core_ls.js",
"/bitrix/js/main/core/core_popup.js",
"/bitrix/js/main/core/core_tooltip.js",
"/bitrix/js/main/core/core_date.js",
"/bitrix/js/main/core/core_timer.js",
"/bitrix/js/main/core/core_fx.js",
"/bitrix/js/main/core/core_window.js",
"/bitrix/js/main/core/core_autosave.js",
"/bitrix/js/main/rating_like.js",
"/bitrix/js/main/session.js",
"/bitrix/js/main/dd.js",
"/bitrix/js/main/utils.js",
"/bitrix/js/main/core/core_dd.js",
"/bitrix/js/main/core/core_webrtc.js"
));
$GLOBALS["APPLICATION"]->AddCSSKernelInfo("main", array(
"/bitrix/js/main/core/css/core.css",
"/bitrix/js/main/core/css/core_popup.css",
"/bitrix/js/main/core/css/core_tooltip.css",
"/bitrix/js/main/core/css/core_date.css"
));
$GLOBALS["APPLICATION"]->AddJSKernelInfo("coreuploader", array(
"/bitrix/js/main/core/core_uploader/common.js",
"/bitrix/js/main/core/core_uploader/uploader.js",
"/bitrix/js/main/core/core_uploader/file.js",
"/bitrix/js/main/core/core_uploader/queue.js"
));
if (file_exists(($_602759598 = $_SERVER["DOCUMENT_ROOT"] . "/bitrix/init.php")))
include_once($_602759598);
if (($_602759598 = getLocalPath("php_interface/init.php", BX_PERSONAL_ROOT)) !== false)
include_once($_SERVER["DOCUMENT_ROOT"] . $_602759598);
if (($_602759598 = getLocalPath("php_interface/" . SITE_ID . "/init.php", BX_PERSONAL_ROOT)) !== false)
include_once($_SERVER["DOCUMENT_ROOT"] . $_602759598);
if (!defined("BX_FILE_PERMISSIONS"))
define("BX_FILE_PERMISSIONS", "420");
if (!defined("BX_DIR_PERMISSIONS"))
define("BX_DIR_PERMISSIONS", 493);
$GLOBALS["sDocPath"] = $GLOBALS["APPLICATION"]->GetCurPage();
if ((!(defined("STATISTIC_ONLY") && STATISTIC_ONLY && substr($GLOBALS["APPLICATION"]->GetCurPage(), 0, strlen(BX_ROOT . "/admin/")) != BX_ROOT . "/admin/")) && COption::GetOptionString("main", "include_charset", "Y") == "Y" && strlen(LANG_CHARSET) > 0)
header("Content-Type: text/html; charset=" . LANG_CHARSET);
if (COption::GetOptionString("main", "set_p3p_header", "Y") == "Y")
header('P3P: policyref="/bitrix/p3p.xml", CP="NON DSP COR CUR ADM DEV PSA PSD OUR UNR BUS UNI COM NAV INT DEM STA"');
$LICENSE_KEY = "";
if (file_exists(($_602759598 = $_SERVER["DOCUMENT_ROOT"] . BX_ROOT . "/license_key.php")))
include($_602759598);
if ($LICENSE_KEY == "" || strtoupper($LICENSE_KEY) == "DEMO")
define("LICENSE_KEY", "DEMO");
else
define("LICENSE_KEY", $LICENSE_KEY);
header("X-Powered-CMS: Bitrix Site Manager (" . (LICENSE_KEY == "DEMO" ? "DEMO" : md5("BITRIX" . LICENSE_KEY . "LICENCE")) . ")");
define("BX_CRONTAB_SUPPORT", defined("BX_CRONTAB"));
if (COption::GetOptionString("main", "check_agents", "Y") == "Y") {
define("START_EXEC_AGENTS_1", microtime());
$GLOBALS["BX_STATE"] = "AG";
$GLOBALS["DB"]->StartUsingMasterOnly();
CAgent::CheckAgents();
$GLOBALS["DB"]->StopUsingMasterOnly();
define("START_EXEC_AGENTS_2", microtime());
$GLOBALS["BX_STATE"] = "PB";
}
ini_set("session.cookie_httponly", "1");
if ($_355529301 = $GLOBALS["APPLICATION"]->GetCookieDomain())
ini_set("session.cookie_domain", $_355529301);
if (COption::GetOptionString("security", "session", "N") === "Y" && CModule::IncludeModule("security"))
CSecuritySession::Init();
session_start();
foreach (GetModuleEvents("main", "OnPageStart", true) as $_1535583714)
ExecuteModuleEventEx($_1535583714);
$GLOBALS["USER"] = new CUser;
$_1450308129 = $GLOBALS["USER"]->GetSecurityPolicy();
$_895714013 = time();
if (($_SESSION["SESS_IP"] && strlen($_1450308129["SESSION_IP_MASK"]) > 0 && ((ip2long($_1450308129["SESSION_IP_MASK"]) & ip2long($_SESSION["SESS_IP"])) != (ip2long($_1450308129["SESSION_IP_MASK"]) & ip2long($_SERVER["REMOTE_ADDR"])))) || ($_1450308129["SESSION_TIMEOUT"] > 0 && $_SESSION["SESS_TIME"] > 0 && $_895714013 - $_1450308129["SESSION_TIMEOUT"] * 60 > $_SESSION["SESS_TIME"]) || (isset($_SESSION["BX_SESSION_TERMINATE_TIME"]) && $_SESSION["BX_SESSION_TERMINATE_TIME"] > 0 && $_895714013 > $_SESSION["BX_SESSION_TERMINATE_TIME"]) || (isset($_SESSION["BX_SESSION_SIGN"]) && $_SESSION["BX_SESSION_SIGN"] <> bitrix_sess_sign()) || (isSessionExpired())) {
$_SESSION = array();
@session_destroy();
if (COption::GetOptionString("security", "session", "N") === "Y" && CModule::IncludeModule("security"))
CSecuritySession::Init();
session_id(md5(uniqid(rand(), true)));
session_start();
$GLOBALS["USER"] = new CUser;
}
$_SESSION["SESS_IP"] = $_SERVER["REMOTE_ADDR"];
$_SESSION["SESS_TIME"] = time();
if (!isset($_SESSION["BX_SESSION_SIGN"]))
$_SESSION["BX_SESSION_SIGN"] = bitrix_sess_sign();
if ((COption::GetOptionString("main", "use_session_id_ttl", "N") == "Y") && (COption::GetOptionInt("main", "session_id_ttl", 0) > 0) && !defined("BX_SESSION_ID_CHANGE")) {
if (!array_key_exists("SESS_ID_TIME", $_SESSION)) {
$_SESSION["SESS_ID_TIME"] = $_SESSION["SESS_TIME"];
} elseif (($_SESSION["SESS_ID_TIME"] + COption::GetOptionInt("main", "session_id_ttl")) < $_SESSION["SESS_TIME"]) {
if (COption::GetOptionString("security", "session", "N") === "Y" && CModule::IncludeModule("security")) {
CSecuritySession::UpdateSessID();
} else {
session_regenerate_id();
}
$_SESSION["SESS_ID_TIME"] = $_SESSION["SESS_TIME"];
}
}
define("BX_STARTED", true);
if (isset($_SESSION["BX_ADMIN_LOAD_AUTH"])) {
define("ADMIN_SECTION_LOAD_AUTH", "1");
unset($_SESSION["BX_ADMIN_LOAD_AUTH"]);
}
if (!defined("NOT_CHECK_PERMISSIONS") || NOT_CHECK_PERMISSIONS !== true) {
$_1616618786 = isset($_REQUEST["logout"]) && (strtolower($_REQUEST["logout"]) == "yes");
if ($_1616618786 && $GLOBALS["USER"]->IsAuthorized()) {
$GLOBALS["USER"]->Logout();
LocalRedirect($GLOBALS["APPLICATION"]->GetCurPageParam("", array(
"logout"
)));
}
if (!$GLOBALS["USER"]->IsAuthorized()) {
$GLOBALS["USER"]->LoginByCookies();
}
$_1742455712 = false;
if (($_797899070 = $GLOBALS["USER"]->LoginByHttpAuth()) !== null) {
$_1742455712 = $_797899070;
$GLOBALS["APPLICATION"]->SetAuthResult($_1742455712);
}
if (isset($_REQUEST["AUTH_FORM"]) && $_REQUEST["AUTH_FORM"] <> "") {
$_1553056040 = false;
if (COption::GetOptionString("main", "use_encrypted_auth", "N") == "Y") {
$_1224269520 = new CRsaSecurity();
if (($_1956826092 = $_1224269520->LoadKeys())) {
$_1224269520->SetKeys($_1956826092);
$_2078095736 = $_1224269520->AcceptFromForm(array(
"USER_PASSWORD",
"USER_CONFIRM_PASSWORD"
));
if ($_2078095736 == CRsaSecurity::ERROR_SESS_CHECK)
$_1742455712 = array(
"MESSAGE" => GetMessage("main_include_decode_pass_sess"),
"TYPE" => "ERROR"
);
elseif ($_2078095736 < 0)
$_1742455712 = array(
"MESSAGE" => GetMessage("main_include_decode_pass_err", array(
"#ERRCODE#" => $_2078095736
)),
"TYPE" => "ERROR"
);
if ($_2078095736 < 0)
$_1553056040 = true;
}
}
if ($_1553056040 == false) {
if (!defined("ADMIN_SECTION") || ADMIN_SECTION !== true)
$_413428552 = LANG;
else
$_413428552 = false;
if ($_REQUEST["TYPE"] == "AUTH") {
$_1742455712 = $GLOBALS["USER"]->Login($_REQUEST["USER_LOGIN"], $_REQUEST["USER_PASSWORD"], $_REQUEST["USER_REMEMBER"]);
} elseif ($_REQUEST["TYPE"] == "OTP") {
$_1742455712 = $GLOBALS["USER"]->LoginByOtp($_REQUEST["USER_OTP"], $_REQUEST["OTP_REMEMBER"], $_REQUEST["captcha_word"], $_REQUEST["captcha_sid"]);
} elseif ($_REQUEST["TYPE"] == "SEND_PWD") {
$_1742455712 = $GLOBALS["USER"]->SendPassword($_REQUEST["USER_LOGIN"], $_REQUEST["USER_EMAIL"], $_413428552);
} elseif ($_SERVER["REQUEST_METHOD"] == "POST" && $_REQUEST["TYPE"] == "CHANGE_PWD") {
$_1742455712 = $GLOBALS["USER"]->ChangePassword($_REQUEST["USER_LOGIN"], $_REQUEST["USER_CHECKWORD"], $_REQUEST["USER_PASSWORD"], $_REQUEST["USER_CONFIRM_PASSWORD"], $_413428552);
} elseif (COption::GetOptionString("main", "new_user_registration", "N") == "Y" && $_SERVER["REQUEST_METHOD"] == "POST" && $_REQUEST["TYPE"] == "REGISTRATION" && (!defined("ADMIN_SECTION") || ADMIN_SECTION !== true)) {
$_1742455712 = $GLOBALS["USER"]->Register($_REQUEST["USER_LOGIN"], $_REQUEST["USER_NAME"], $_REQUEST["USER_LAST_NAME"], $_REQUEST["USER_PASSWORD"], $_REQUEST["USER_CONFIRM_PASSWORD"], $_REQUEST["USER_EMAIL"], $_413428552, $_REQUEST["captcha_word"], $_REQUEST["captcha_sid"]);
}
if ($_REQUEST["TYPE"] == "AUTH" || $_REQUEST["TYPE"] == "OTP") {
if ($_1742455712 === true && defined("ADMIN_SECTION") && ADMIN_SECTION === true) {
$GLOBALS["APPLICATION"]->StoreCookies();
$_SESSION["BX_ADMIN_LOAD_AUTH"] = true;
echo '<script type="text/javascript">window.onload=function(){top.BX.AUTHAGENT.setAuthResult(false);};</script>';
die();
}
}
}
$GLOBALS["APPLICATION"]->SetAuthResult($_1742455712);
} elseif (!$GLOBALS["USER"]->IsAuthorized()) {
$GLOBALS["USER"]->LoginHitByHash();
}
}
if (($_969573532 = $GLOBALS["USER"]->GetParam("APPLICATION_ID")) !== null) {
$_1589093256 = \Bitrix\Main\Authentication\ApplicationManager::getInstance();
if ($_1589093256->checkScope($_969573532) !== true) {
CHTTP::SetStatus("403 Forbidden");
die();
}
}
if (!defined("ADMIN_SECTION") || ADMIN_SECTION !== true) {
$_201612664 = "";
if (isset($_REQUEST["bitrix_preview_site_template"]) && $_REQUEST["bitrix_preview_site_template"] <> "" && $GLOBALS["USER"]->CanDoOperation("view_other_settings")) {
$_1731543672 = CSiteTemplate::GetByID($_REQUEST["bitrix_preview_site_template"]);
if ($_1702734568 = $_1731543672->Fetch()) {
$_201612664 = $_1702734568["ID"];
}
}
if ($_201612664 == "") {
$_201612664 = CSite::GetCurTemplate();
}
define("SITE_TEMPLATE_ID", $_201612664);
define("SITE_TEMPLATE_PATH", getLocalPath("templates/" . SITE_TEMPLATE_ID, BX_PERSONAL_ROOT));
}
if (isset($_GET["show_page_exec_time"])) {
if ($_GET["show_page_exec_time"] == "Y" || $_GET["show_page_exec_time"] == "N")
$_SESSION["SESS_SHOW_TIME_EXEC"] = $_GET["show_page_exec_time"];
}
if (isset($_GET["show_include_exec_time"])) {
if ($_GET["show_include_exec_time"] == "Y" || $_GET["show_include_exec_time"] == "N")
$_SESSION["SESS_SHOW_INCLUDE_TIME_EXEC"] = $_GET["show_include_exec_time"];
}
if (isset($_GET["bitrix_include_areas"]) && $_GET["bitrix_include_areas"] <> "")
$GLOBALS["APPLICATION"]->SetShowIncludeAreas($_GET["bitrix_include_areas"] == "Y");
if ($GLOBALS["USER"]->IsAuthorized()) {
$_1606313708 = COption::GetOptionString("main", "cookie_name", "BITRIX_SM");
if (!isset($_COOKIE[$_1606313708 . "_SOUND_LOGIN_PLAYED"]))
$GLOBALS["APPLICATION"]->set_cookie("SOUND_LOGIN_PLAYED", "Y", 0);
}
\Bitrix\Main\Page\Frame::shouldBeEnabled();
if (defined("BX_CHECK_SHORT_URI") && BX_CHECK_SHORT_URI && CBXShortUri::CheckUri()) {
die();
}
foreach (GetModuleEvents("main", "OnBeforeProlog", true) as $_1535583714)
ExecuteModuleEventEx($_1535583714);
if ((!defined("NOT_CHECK_PERMISSIONS") || NOT_CHECK_PERMISSIONS !== true) && (!defined("NOT_CHECK_FILE_PERMISSIONS") || NOT_CHECK_FILE_PERMISSIONS !== true)) {
$_1948094785 = $_415566121->getScriptFile();
if (!$GLOBALS["USER"]->CanDoFileOperation("fm_view_file", array(
SITE_ID,
$_1948094785
)) || (defined("NEED_AUTH") && NEED_AUTH && !$GLOBALS["USER"]->IsAuthorized())) {
if ($GLOBALS["USER"]->IsAuthorized() && $_1742455712["MESSAGE"] == "")
$_1742455712 = array(
"MESSAGE" => GetMessage("ACCESS_DENIED") . " " . GetMessage("ACCESS_DENIED_FILE", array(
"#FILE#" => $_1948094785
)),
"TYPE" => "ERROR"
);
if (defined("ADMIN_SECTION") && ADMIN_SECTION == true) {
if ($_REQUEST["mode"] == "list" || $_REQUEST["mode"] == "settings") {
echo "<script>top.location='" . $GLOBALS["APPLICATION"]->GetCurPage() . "?" . DeleteParam(array(
"mode"
)) . "';</script>";
die();
} elseif ($_REQUEST["mode"] == "frame") {
echo "<script type=\"text/javascript\">
var w = (opener? opener.window:parent.window);
w.location.href='" . $GLOBALS["APPLICATION"]->GetCurPage() . "?" . DeleteParam(array(
"mode"
)) . "';
</script>";
die();
} elseif (defined("MOBILE_APP_ADMIN") && MOBILE_APP_ADMIN == true) {
echo json_encode(Array(
"status" => "failed"
));
die();
}
}
$GLOBALS["APPLICATION"]->AuthForm($_1742455712);
}
}
while (!defined("OLDSITEEXPIREDATE") || strlen(OLDSITEEXPIREDATE) <= 0 || OLDSITEEXPIREDATE != SITEEXPIREDATE)
die(GetMessage("expire_mess2"));
if (isset($_1584229364) && $_1584229364 == 404) {
if (COption::GetOptionString("main", "header_200", "N") == "Y")
CHTTP::SetStatus("200 OK");
}
?>
Из всей этой лабуды видно, что система хранит дату (с момента установки плюс тридцать дней) в двух местах. Первое место - файл ...modules/main/admin/define.php, в котором задаётся константа TEMPORARY_CACHE. Второе место - база данных (admin_passwordh в таблице b_option). Осталось поменять значения на свои и посмотреть на результат. Проблема только в том, что дата вида m0m1d0d1y0y1y2y3 разбросана по строке ETd1y3ISm0y1Xd0IRy0Ty2Im1B (прим. для OLDSITEEXPIREDATE), а строка зашифрована методом XOR с разными ключами для каждого случая и обёрнута в base64.
Ничего сложного. Процессы обратимы.
Перекур:)
Хак
Апр 13, 2015

Рок из Подворотен... или как стать звездой за пять минут.
Дано: детище Кнабенгофа http://pilot.spb.ru/rip
Задача: спасти утопающих
И так. Погнали.
Ищем утопленника - Дельфы, 495 голосов.
Смотрим код, вникаем в суть. Среди прочей ереси находим кусок, который отвечает за голосовалку:
$(document).ready( function(){
var _data='act=time';
$.ajax({
type: 'POST',
url: '/modules/vote_request.php',
data: _data,
async: false,
success: function(data){
$(".vote_check").html(data);
},
});
});//end ready
function refresh_captcha() {
var span_captcha = document.getElementById('span_captcha');
span_captcha.removeChild(span_captcha.getElementsByTagName('img')[0]);
var captcha_img = document.createElement('img');
captcha_img.src = '/kcaptcha?'+Math.random();
span_captcha.appendChild(captcha_img);
}
function vote(ahref){
$("span .hidd").remove();
var container = $(ahref).parent();
container.css({position: 'relative', display: 'block'});
var win = $('#hiddenwin');
$(container).append(win.html());
var el = $(container).find(".hidd").show();
var form = el.find('form')[0];
$('.vote_check').click(function() {
var id = $(this).attr('id');
$(form['votenew']).val(id);
});
$(form['keystring']).focus();
el.find('.cancel').click(function(){el.parent().css({position: ''});el.remove();})
el.find('.ОК').click(function() {
var keystring = $(form['keystring']).val();
var id_vote = $(form['votenew']).val();
var _data='act=vote&id_vote='+id_vote+'&capt='+keystring;
$.ajax({
type: 'POST',
url: '/modules/vote_request.php',
data: _data,
async: false,
success: function(data){
//alert(data);
},
});
})
}
Смешно? Смешно:) Всё тлен.
Ок. Кликаем на ссылку Голосовать. Вводим капчу. Дальше... если нажмём OK, отработает обработчик события click, который заботливо весит функция vote... уйдёт post запрос к скрипту vote_request.php ... после чего произойдёт стандартный сабмит формы с get запросом к http://pilot.spb.ru/rip/ - глупость...
Рефреш нам не интересен; иначе, будет больше лишних телодвижений. Мы ленивы.
Ищем кнопку OK, добавляем return false в событие onclick...
<input type="submit" value="ОК" class="ОК" onclick="return false;">
Отлично! Теперь можно втыкать в кнопарь. Пока палец не отсохнет.
Но, ещё раз, мы ленивы - на этом всё строится. Не хреново было бы, если бы... оно само в себя тыкало с определённой периодичностью.
Да без проблем! В стиле тру хацкер:)
<input type="submit" value="ОК" id="def" class="ОК" onclick="setTimeout(function(){document.getElementById('def').click();}, 5); return false;">
Идём курить... Задача выполнена. Дельфы - 6294.
А, да, и не забываем передать привет создателю сайта с пятнадцатилетним стажем:)
З.Ы. Когда-нить Дима покажет, как нагнать коней на весна.фм... Там замес интересней:)
Хак