понедельник, 27 сентября 2021 г.

Как взломать систему тестирования

Сегодня нужно было сдавать тесты по промбезопасности, и нужно было выучить больше 200 вопросов. Я честно проработал почти 200 вопросов, но вот на обеде, один товарищ мне подсказал интересную идею, что сайт тестирования можно попробовать взломать и написать скрипт который бы автоматически давал бы подсказку правильного ответа. Конечно же я загорелся этой идеей - ведь можно потратить много часов времени чтобы автоматизировать ту работу, которую можно было бы сделать за полчаса - задача для настоящего программиста, да еще и хакера - приятно нае*ать систему. Есть еще одна статья даже с картинками про взлом другого теста https://boolkin.blogspot.com/2023/02/test-hack.html

Каково было мое удивление, когда в консоли разработчика я увидел что на сайте правильные ответы вообще никак не прячутся - все правильные ответы помечены признаком true, хоть и спрятаны в скрытых элементах. Пройдясь по всем скрытым элементам и найдя все те которые true - выяснилось что это реально правильные ответы. Дальше дело было за малым - нужно  было как-то показать какие ответы верные, и желательно скрыто. Почему-то я сразу же пошел самым сложным путем: решил создать на странице скрытый элемент куда записать все ответы в формате "Вопрос №х, Ответ: у". Этот элемент желательно скрывать от глаз посторонних и открывать только когда можно, по щелчку мышью по небольшой точке внизу, скрыть можно также щелкнув по ней же или по этому элементу. Конструкция довольно простая - решается тупо влоб - создать элемент, записать нужные свойства и добавить его на страницу

let el = document.getElementsByTagName("body")[0];
let div = document.createElement("div");
div.innerHTML = ".";
div.style.position = "fixed";
div.style.bottom = 0;
div.style.cursor= "pointer";
div.style.zIndex = "999";
el.after(div);
div.onclick = function () { let tog = document.getElementById("ans");
tog.style.display = tog.style.display =="none" ? "inline-block" : "none";
};

Таким же образом и div2 куда пишутся правильные ответы:

let div2 = document.createElement("div");
div2.id = "ans";
div2.innerHTML = str;
div2.style.position = "fixed";
div2.style.bottom = 0;
div2.style.display ="none";
div2.style.cursor= "pointer";
div2.style.zIndex = "9999";
div.after(div2);
div2.onclick = function () { let tog = document.getElementById("ans"); tog.style.display = tog.style.display =="none" ? "inline-block" : "none"; };

Довольно интересно стало попробовать вызывать это меню по кнопке клавиатуры, и почти сразу нашел довольно простой скрипт, который таким же методом показывает и скрывает окно с правильным ответами:

document.addEventListener("keydown", function(){
    var x=event.keyCode || event.which;
    if(x==17){
        var y = document.getElementById("ans");
        if (y.style.display === "block"){
            y.style.display = "none";
        }
        else {
            y.style.display = "block";
        }
    }
})  

И уже только потом я додумался что куда проще правильные ответы сделать не скрытыми элементами, и как выяснилось ответ в тесте и этот скрытый элемент с правильным ответом находятся под одним родительским элементом, а это значит что если подкрасить этот родительский элемент, то можно выделить этим цветом правильный ответ. В общем если применит не яркий цвет, то получится очень даже круто, код вообще супер простой:

let inp = document.getElementsByTagName("input");
for (let i=0;i<inp.length;i++) {
    if (inp[i].value == "true") inp[i].parentElement.style.backgroundColor = "snow";
}

Snow - почти белый цвет, не бросается в глаза на белом фоне. Как я и говорил в коде находятся все теги input и родетели тех из них у которых значение тру выделяются цветом snow.

Все это очень круто реализуется при помощи букмарклета - можно взять предыдущий код целиком , закинуть его в генератор и получить желаемый результат, причем пришлось добаить конструкцию такую чтобы и на файрфоксе работало правильно

Ну и чтобы не пропадало добро, опубликую все это дело в виде букмарклета тут в блоге:

prombez24 тут собраны все функции - подсветка ответа, и скрытое окно которое можно открыть по кнопке CTRL или щелчку мышью

2 комментария:

  1. javascript: (() => { var soundstop = new Audio("https://assets.mixkit.co/sfx/preview/mixkit-melodic-gold-price-2000.mp3");var soundstart = new Audio("https://assets.mixkit.co/sfx/preview/mixkit-happy-bells-notification-937.mp3");let stop = false;setInterval(function (){let tag = parseInt(document.getElementById("tag0").innerHTML);if (!stop & tag==0) {let timerId = setTimeout(()=>{soundstop.play(); stop=true;},1000);}if (stop & tag>0) {soundstart.play(); stop=false;clearTimeout(timerId);}},5000) })();

    ОтветитьУдалить
  2. доброго дня, а может сможете и мне подсказать с одним из тестов? sergo5{}mail.ru

    ОтветитьУдалить