Обзор защиты веб-ресурсов с помощью AWS WAF
Amazon AWS капча предлагает два ключевых метода защиты веб-ресурсов от нежелательных автоматических действий:
- CAPTCHA – механизм, предлагающий пользователю выполнить одну из задач: ввод текста, перемещение слайдера, выбор объектов на изображении или взаимодействие с элементами на экране. В качестве альтернативы предлагается аудио-капча, где необходимо распознать слова на фоне шума.
Challenge – проверка пользователя в фоновом режиме без необходимости решать задачи. Система анализирует параметры сессии и поведение запросов, включая частоту обращений, использование JavaScript, перемещения мыши и наличие куки. В случае успешного прохождения проверки пользователь продолжает работу с сайтом, в противном случае ему может быть показана CAPTCHA или заблокирован доступ.
Amazon WAF обладает сложными механизмами защиты, но для тестирования, безопасного парсинга и отладки возможно автоматическое решение капчи amazon через облачный сервис CapMonster Cloud.
Для решения капчи amazon необходимо получить ключевые параметры:
- Перейдите на целевой сайт с капчей amazon.
- Откройте Инструменты разработчика (DevTools), вкладку Сеть (Network) и найдите запрос с ответом 405.
- Перейдите во вкладку Response и найдите объект window.gokuProps, содержащий:
- websiteKey – ключ капчи.
- context – контекст проверки.
- iv – параметр шифрования.
- Ссылки на challenge.js и captcha.js.
Пример JavaScript-кода для автоматического получения параметров AWS WAF CAPTCHA:
var gokuProps = window.gokuProps;
var websiteKey = gokuProps ? gokuProps.key : "Не найдено";
var context = gokuProps ? gokuProps.context : "Не найдено";
var iv = gokuProps ? gokuProps.iv : "Не найдено";
var scripts = Array.from(document.querySelectorAll('script'));
var challengeScriptUrl = scripts.find(script => script.src.includes('challenge.js'))?.src || "Не найдено";
var captchaScriptUrl = scripts.find(script => script.src.includes('captcha.js'))?.src || "Не найдено";
console.log({ websiteKey, context, iv, challengeScriptUrl, captchaScriptUrl });
Создание задачи для CapMonster Cloud:
{
"clientKey": "API_KEY",
"task": {
"type": "AmazonTaskProxyless",
"websiteURL": "https://example.com",
"challengeScript": "https://example.com/challenge.js",
"captchaScript": "https://example.com/captcha.js",
"websiteKey": "ключ_капчи",
"context": "контекст",
"iv": "шифрованный параметр",
"cookieSolution": true
}
}
Пример ответа:
{
"errorId": 0,
"taskId": 407533072
}
Запрос результата решения:
{
"clientKey": "API_KEY",
"taskId": 407533072
}
Пример успешного ответа:
{
"errorId": 0,
"status": "ready",
"solution": {
"cookies": {
"aws-waf-token": "ключ_токена"
},
"userAgent": "userAgentPlaceholder"
}
}
Пример кода для автоматического обхода AWS WAF CAPTCHA:
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
import requests, time, os
API_KEY = os.getenv('CAPMONSTER_API_KEY')
CREATE_TASK_URL = 'https://api.capmonster.cloud/createTask'
GET_TASK_RESULT_URL = 'https://api.capmonster.cloud/getTaskResult'
def create_task(website_key, context, iv, challenge_script, captcha_script):
task_data = {
"clientKey": API_KEY,
"task": {
"type": "AmazonTaskProxyless",
"websiteURL": 'https://example.com',
"challengeScript": challenge_script,
"captchaScript": captcha_script,
"websiteKey": website_key,
"context": context,
"iv": iv,
"cookieSolution": True
}
}
response = requests.post(CREATE_TASK_URL, json=task_data)
return response.json().get("taskId")
def get_task_result(task_id):
while True:
response = requests.post(GET_TASK_RESULT_URL, json={"clientKey": API_KEY, "taskId": task_id})
result = response.json()
if result.get("status") == "ready":
return result["solution"]
time.sleep(5)
# Запуск Selenium
options = webdriver.ChromeOptions()
options.add_argument('--headless')
driver = webdriver.Chrome(options=options)
driver.get('https://example.com')
# Ожидание CAPTCHA
iframe = WebDriverWait(driver, 20).until(EC.presence_of_element_located((By.CSS_SELECTOR, 'iframe[src*="execute-api"]')))
driver.switch_to.frame(iframe)
# Извлечение параметров CAPTCHA
params = driver.execute_script("return window.gokuProps;")
challenge_script, captcha_script = [driver.execute_script(f"return document.querySelector('script[src*="{x}"').src;") for x in ("challenge.js", "captcha.js")]
# Решение CAPTCHA
task_id = create_task(params["key"], params["context"], params["iv"], challenge_script, captcha_script)
solution = get_task_result(task_id)
driver.add_cookie({"name": "aws-waf-token", "value": solution["cookies"]["aws-waf-token"]})
driver.refresh()
- Асинхронные запросы – используйте асинхронное программирование для ускорения работы.
- Безголовый режим – включайте headless для экономии ресурсов.
- Использование прокси – меняйте IP-адрес и User-Agent.
- Работа с динамическими CAPTCHA – следите за обновлениями amazon и адаптируйте скрипт.
- Оптимизация частоты запросов – избегайте слишком частых обращений, чтобы не привлекать внимание системы защиты.
Amazon также использует сложные механизмы защиты для предотвращения автоматизированных атак. The data you передается в зашифрованном виде, что усложняет анализ. Для определения ботов используется automated public turing система, выполняющая public turing test на основе поведения пользователя.
NB: Напоминаем, что продукт используется для автоматизации тестирования на ваших собственных сайтах и на сайтах, к которым у вас есть доступ на законных основаниях.