Давайте посмотрим, как мы можем разобраться в этом коде, topi c by topi c.
Выражения в скобках.
Они могут потенциально вызывать функции, поэтому давайте точно увидеть, что они делают. Они всегда появляются как числитель или знаменатель в одном делении. Итак, я перечислю здесь все используемые числители / знаменатели:
+((!+[]+!![]+!![]+!![]+!![]+!![]+!![]+[])+(!+[]+!![]+!![]+!![]+!![]+!![]+!![]+!![]+!![])+(!+[]+!![]+!![]+!![]+!![]+!![]+!![])+(+[])+(+[])+(!+[]+!![]+!![])+(!+[]+!![]+!![]+!![])+(!+[]+!![]+!![])+(!+[]+!![]+!![]+!![]+!![]+!![]+!![]))
+((!+[]+!![]+!![]+!![]+!![]+!![]+!![]+!![]+!![]+[])+(+[])+(!+[]+!![]+!![]+!![])+(+[])+(!+[]+!![]+!![]+!![])+(+[])+(!+[]+!![]+!![]+!![]+!![]+!![])+(+[])+(!+[]+!![]+!![]+!![]+!![]+!![]+!![]+!![]+!![]))
+((!+[]+!![]+!![]+!![]+!![]+!![]+!![]+!![]+[])+(!+[]+!![]+!![])+(!+[]+!![]+!![]+!![]+!![]+!![]+!![]+!![])+(+[])+(!+[]+!![]+!![]+!![])+(+!![])+(!+[]+!![]+!![]+!![]+!![]+!![])+(!+[]+!![]+!![]+!![])+(+!![]))
+((!+[]+!![]+!![]+!![]+!![]+!![]+!![]+!![]+!![]+[])+(!+[]+!![]+!![]+!![])+(!+[]+!![])+(!+[]+!![]+!![])+(!+[]+!![]+!![]+!![]+!![]+!![]+!![]+!![])+(!+[]+!![]+!![]+!![]+!![]+!![]+!![])+(!+[]+!![]+!![]+!![]+!![])+(!+[]+!![])+(!+[]+!![]+!![]+!![]+!![]+!![]+!![]+!![]))
+((!+[]+!![]+!![]+!![]+!![]+!![]+!![]+!![]+[])+(!+[]+!![]+!![])+(!+[]+!![]+!![]+!![]+!![]+!![]+!![]+!![])+(+[])+(!+[]+!![]+!![]+!![])+(+!![])+(!+[]+!![]+!![]+!![]+!![]+!![])+(!+[]+!![]+!![]+!![])+(!+[]+!![]+!![]+!![]+!![]+!![]+!![]))
+((+!![]+[])+(!+[]+!![])+(!+[]+!![]+!![]+!![]+!![]+!![]+!![])+(+!![])+(!+[]+!![]+!![]+!![]+!![]+!![]+!![]+!![]+!![])+(+!![])+(+[])+(!+[]+!![]+!![]+!![]+!![]+!![]+!![]+!![]+!![])+(!+[]+!![]+!![]+!![]+!![]+!![]+!![]+!![]+!![]))
+((!+[]+!![]+!![]+!![]+!![]+!![]+!![]+!![]+[])+(!+[]+!![]+!![])+(!+[]+!![]+!![]+!![]+!![]+!![]+!![]+!![])+(+[])+(!+[]+!![]+!![]+!![])+(+!![])+(!+[]+!![]+!![]+!![]+!![]+!![])+(!+[]+!![]+!![]+!![])+(!+[]+!![]+!![]+!![]+!![]+!![]+!![]))
+((!+[]+!![]+!![]+!![]+!![]+!![]+[])+(!+[]+!![])+(!+[]+!![]+!![]+!![]+!![]+!![])+(!+[]+!![]+!![]+!![]+!![]+!![]+!![])+(!+[]+!![]+!![]+!![]+!![]+!![]+!![]+!![])+(!+[]+!![]+!![]+!![]+!![]+!![])+(!+[]+!![]+!![]+!![]+!![]+!![]+!![])+(!+[]+!![]+!![]+!![]+!![]+!![]+!![]+!![])+(!+[]+!![]+!![]+!![]+!![]))
+((!+[]+!![]+!![]+!![]+!![]+!![]+!![]+[])+(!+[]+!![]+!![]+!![]+!![]+!![]+!![]+!![]+!![])+(!+[]+!![]+!![]+!![]+!![]+!![]+!![])+(+[])+(+[])+(!+[]+!![]+!![])+(!+[]+!![]+!![]+!![])+(!+[]+!![]+!![])+(!+[]+!![]+!![]+!![]+!![]+!![]+!![]))
+((!+[]+!![]+!![]+!![]+[])+(!+[]+!![]+!![]+!![])+(!+[]+!![]+!![]+!![])+(!+[]+!![]+!![]+!![]+!![]+!![])+(!+[]+!![]+!![]+!![]+!![]+!![])+(+[])+(+[])+(!+[]+!![]+!![]+!![]+!![]+!![]+!![])+(!+[]+!![]+!![]+!![]))
Эти выражения работают только с несколькими различными компонентами:
!![]
!+[]
(+[])
[]
!![]
и !+[]
оценивают до true
и так как все они появляются как операнды сложения или унарного плюса, они приводятся к 1
. Замена этого дает:
+((1+1+1+1+1+1+1+[])+(1+1+1+1+1+1+1+1+1)+(1+1+1+1+1+1+1)+(+[])+(+[])+(1+1+1)+(1+1+1+1)+(1+1+1)+(1+1+1+1+1+1+1))
+((1+1+1+1+1+1+1+1+1+[])+(+[])+(1+1+1+1)+(+[])+(1+1+1+1)+(+[])+(1+1+1+1+1+1)+(+[])+(1+1+1+1+1+1+1+1+1))
+((1+1+1+1+1+1+1+1+[])+(1+1+1)+(1+1+1+1+1+1+1+1)+(+[])+(1+1+1+1)+(+1)+(1+1+1+1+1+1)+(1+1+1+1)+(+1))
+((1+1+1+1+1+1+1+1+1+[])+(1+1+1+1)+(1+1)+(1+1+1)+(1+1+1+1+1+1+1+1)+(1+1+1+1+1+1+1)+(1+1+1+1+1)+(1+1)+(1+1+1+1+1+1+1+1))
+((1+1+1+1+1+1+1+1+[])+(1+1+1)+(1+1+1+1+1+1+1+1)+(+[])+(1+1+1+1)+(+1)+(1+1+1+1+1+1)+(1+1+1+1)+(1+1+1+1+1+1+1))
+((+1+[])+(1+1)+(1+1+1+1+1+1+1)+(+1)+(1+1+1+1+1+1+1+1+1)+(+1)+(+[])+(1+1+1+1+1+1+1+1+1)+(1+1+1+1+1+1+1+1+1))
+((1+1+1+1+1+1+1+1+[])+(1+1+1)+(1+1+1+1+1+1+1+1)+(+[])+(1+1+1+1)+(+1)+(1+1+1+1+1+1)+(1+1+1+1)+(1+1+1+1+1+1+1))
+((1+1+1+1+1+1+[])+(1+1)+(1+1+1+1+1+1)+(1+1+1+1+1+1+1)+(1+1+1+1+1+1+1+1)+(1+1+1+1+1+1)+(1+1+1+1+1+1+1)+(1+1+1+1+1+1+1+1)+(1+1+1+1+1))
+((1+1+1+1+1+1+1+[])+(1+1+1+1+1+1+1+1+1)+(1+1+1+1+1+1+1)+(+[])+(+[])+(1+1+1)+(1+1+1+1)+(1+1+1)+(1+1+1+1+1+1+1))
+((1+1+1+1+[])+(1+1+1+1)+(1+1+1+1)+(1+1+1+1+1+1)+(1+1+1+1+1+1)+(+[])+(+[])+(1+1+1+1+1+1+1)+(1+1+1+1))
Компоненты (+[])
оцениваются в 0, а оставшиеся +[]
запускают конкатенацию строк, что соответствует +""
. Результат:
+((1+1+1+1+1+1+1+"")+(1+1+1+1+1+1+1+1+1)+(1+1+1+1+1+1+1)+0+0+(1+1+1)+(1+1+1+1)+(1+1+1)+(1+1+1+1+1+1+1))
+((1+1+1+1+1+1+1+1+1+"")+0+(1+1+1+1)+0+(1+1+1+1)+0+(1+1+1+1+1+1)+0+(1+1+1+1+1+1+1+1+1))
+((1+1+1+1+1+1+1+1+"")+(1+1+1)+(1+1+1+1+1+1+1+1)+0+(1+1+1+1)+(+1)+(1+1+1+1+1+1)+(1+1+1+1)+(+1))
+((1+1+1+1+1+1+1+1+1+"")+(1+1+1+1)+(1+1)+(1+1+1)+(1+1+1+1+1+1+1+1)+(1+1+1+1+1+1+1)+(1+1+1+1+1)+(1+1)+(1+1+1+1+1+1+1+1))
+((1+1+1+1+1+1+1+1+"")+(1+1+1)+(1+1+1+1+1+1+1+1)+0+(1+1+1+1)+(+1)+(1+1+1+1+1+1)+(1+1+1+1)+(1+1+1+1+1+1+1))
+((+1+"")+(1+1)+(1+1+1+1+1+1+1)+(+1)+(1+1+1+1+1+1+1+1+1)+(+1)+0+(1+1+1+1+1+1+1+1+1)+(1+1+1+1+1+1+1+1+1))
+((1+1+1+1+1+1+1+1+"")+(1+1+1)+(1+1+1+1+1+1+1+1)+0+(1+1+1+1)+(+1)+(1+1+1+1+1+1)+(1+1+1+1)+(1+1+1+1+1+1+1))
+((1+1+1+1+1+1+"")+(1+1)+(1+1+1+1+1+1)+(1+1+1+1+1+1+1)+(1+1+1+1+1+1+1+1)+(1+1+1+1+1+1)+(1+1+1+1+1+1+1)+(1+1+1+1+1+1+1+1)+(1+1+1+1+1))
+((1+1+1+1+1+1+1+"")+(1+1+1+1+1+1+1+1+1)+(1+1+1+1+1+1+1)+0+0+(1+1+1)+(1+1+1+1)+(1+1+1)+(1+1+1+1+1+1+1))
+((1+1+1+1+"")+(1+1+1+1)+(1+1+1+1)+(1+1+1+1+1+1)+(1+1+1+1+1+1)+0+0+(1+1+1+1+1+1+1)+(1+1+1+1))
Теперь мы можем вычислить и заменить эти 1 + 1 + ... + 1 на то, что они оценивают (пока не работайте с круглыми скобками):
+((7+"")+(9)+(7)+0+0+(3)+(4)+(3)+(7))
+((9+"")+0+(4)+0+(4)+0+(6)+0+(9))
+((8+"")+(3)+(8)+0+(4)+(+1)+(6)+(4)+(+1))
+((9+"")+(4)+(2)+(3)+(8)+(7)+(5)+(2)+(8))
+((8+"")+(3)+(8)+0+(4)+(+1)+(6)+(4)+(7))
+((+1+"")+(2)+(7)+(+1)+(9)+(+1)+0+(9)+(9))
+((8+"")+(3)+(8)+0+(4)+(+1)+(6)+(4)+(7))
+((6+"")+(2)+(6)+(7)+(8)+(6)+(7)+(8)+(5))
+((7+"")+(9)+(7)+0+0+(3)+(4)+(3)+(7))
+((4+"")+(4)+(4)+(6)+(6)+0+0+(7)+(4))
Остальные, внутренние унарные операторы плюс, в (+1
, могут быть удалены, и все, кроме внешних скобок, также могут быть удалены:
+(7+""+9+7+0+0+3+4+3+7)
+(9+""+0+4+0+4+0+6+0+9)
+(8+""+3+8+0+4+1+6+4+1)
+(9+""+4+2+3+8+7+5+2+8)
+(8+""+3+8+0+4+1+6+4+7)
+(1+""+2+7+1+9+1+0+9+9)
+(8+""+3+8+0+4+1+6+4+7)
+(6+""+2+6+7+8+6+7+8+5)
+(7+""+9+7+0+0+3+4+3+7)
+(4+""+4+4+6+6+0+0+7+4)
Все внутренние операторы плюс теперь являются конкатенациями строк, так что оценивает:
+("797003437")
+("904040609")
+("838041641")
+("942387528")
+("838041647")
+("127191099")
+("838041647")
+("626786785")
+("797003437")
+("444660074")
Оставшийся унарный оператор выполняет окончательную оценку:
797003437
904040609
838041641
942387528
838041647
127191099
838041647
626786785
797003437
444660074
Вы могли бы оценить выражения, как они были в консоли разработчика, но таким образом вы абсолютно убедитесь, что нет скрытых побочных эффектов или зависимостей, которые могли бы go остаться незамеченными.
Значение OBQXEnQ.GMuEaNBC
С приведенными выше выражениями, приведенными к их числовым значениям, мы получим следующее:
var OBQXEnQ = {
"GMuEaNBC": 797003437 / 904040609;
};
OBQXEnQ.GMuEaNBC += 838041641 / 942387528;
OBQXEnQ.GMuEaNBC -= 838041647 / 127191099;
OBQXEnQ.GMuEaNBC += 838041647 / 626786785;
OBQXEnQ.GMuEaNBC += 797003437 / 444660074;
... так что это можно упростить до:
var OBQXEnQ.GMuEaNBC = 797003437 / 904040609 + 838041641 / 942387528 - 838041647 / 127191099 + 838041647 / 626786785 + 797003437 / 444660074;
... что составляет:
var OBQXEnQ.GMuEaNBC = -1.6885301087751048;
Переменные s,t,o,p,b,r,e,a,k,i,n,g
Мы игнорируем подсказку: -)
Теперь, когда мы расшифровали обфуск Из выражений становится ясно, что e
никогда не вызывается. Таким образом, мы можем удалить эту функцию из кода.
Переменные o
и g
использовались только в e
, поэтому их также можно удалить из кода.
Of переменные s,t,o,p,b,r,e,a,k,i,n,g
, нам нужно только сохранить (на данный момент) t
, r
и a
. Другие не используются.
Свободное выражение '; 121'
также не играет роли.
Значение t.length
В коде есть эта часть:
t = document.createElement('div');
t.innerHTML="<a href='/'>x</a>";
t = t.firstChild.href;
r = t.match(/https?:\/\//)[0];
t = t.substr(r.length);
t = t.substr(0,t.length-1);
Это сложный способ сделать t = location.host
. Единственное использование t
- это length
в более позднем выражении.
То есть t.length
становится location.host.length
. Но ясно, что это зависит от того, где этот javascript работает. В комментариях ниже вы упоминаете веб-адрес этой страницы, и поэтому t
оценивается как "queue-tickets.liverpoolf c .com", и, таким образом, t.length
равно 29.
При таком упрощении мы больше не нужны переменные t
и r
.
Значение, присвоенное a.value
Мы сократили присвоение до a.value
до:
a.value = (-1.6885301087751048 + location.host.length).toFixed(10);
Как указано выше location.host.length
это 29 в вашем случае. Следовательно, вышесказанное эквивалентно:
a.value = "27.3114698912";
функциям для прослушивания события DOMContentLoaded
Две функции a
и b
предназначены для выполнения кода, когда документ загружен, с обратной совместимостью до IE9.
Переменная параметра c
получает значение false
при фактическом вызове b
, но это значение по умолчанию для addEventListener
; мы можем опустить это.
Таким образом, игнорируя проблему совместимости IE8, вызов b
эквивалентен:
document.addEventListener("DOMContentLoaded", callback);
Таким образом, мы можем также пропустить определение этих двух функций. И поскольку это были единственные переменные, определенные непосредственно во внешней области действия IIFE, мы можем также исключить этот IIFE.
Результат:
Вышеуказанные сокращения приводят к следующему коду:
document.addEventListener("DOMContentLoaded", function () {
document.getElementById('cf-content').style.display = 'block';
setTimeout(function () {
document.getElementById('jschl-answer').value = "27.3114698912";
var f = document.getElementById('challenge-form');
f.action += location.hash;
f.submit();
}, 4000);
});
Клиент / Сервер
Этот код клиента отправляет форму на страницу сервера Queue.aspx
. Он передает информацию через URL и через полезную нагрузку POST.
URL содержит два бита информации:
__cf_chl_jschl_tk__=
: жестко закодированное значение #
: так называемый "ха sh", который является просто повторением того, что было в текущем URL ха sh (после символа #
).
Полезная нагрузка POST имеет следующее значение:
r=
: значение с жестким кодом jschl_vc=
: значение с жестким кодом pass=
: значение с жестким кодом jschl-answer=
: значение, которое предоставляет код JavaScript, т. Е. "27.3114698912" при запуске на вашем действующем сайте.
Этот HTTP-запрос отправлен на Queue.aspx
Через 4 секунды после загрузки текущей страницы.
Поскольку ваш вопрос не содержит информации о том, что Queue.aspx
делает с этой информацией, мой анализ на этом заканчивается.
Если вы контролируете Queue.aspx
, тогда весь этот анализ на самом деле не имеет никакого значения, так как вы могли бы просто поместить некоторые записи в код ASP (. NET) Queue.aspx
и увидеть:
- что именно в Переменная POST
jschl-answer
, которую отправляет клиент, и - что отправляется обратно клиенту: какое перенаправление URL (если есть) и какое tent.
Приложение
При самостоятельном использовании живого URL-адреса я отмечаю, что он записывает код повара ie, поэтому при следующем посещении этого же URL-адреса перенаправление будет незамедлительной.
Первая 4-секундная задержка (с setTimeout
), по-видимому, служит только защитой от массовых атак на веб-сайт (DOS-атаки). Однако это очень простая мера, и ее легко можно обойти.