Что нового

[Сеть, интернет] Авторизация на сайте МТС

Renz

Осваивающий
Сообщения
63
Репутация
37
Не получается авторизоваться в личном кабинете на сайте МТС через POST запрос.
:stars:

Суть:
1.получаем страницу авторизации (GET)
2. получаем cookies в ответе сервера
3. получаем inputs
4. отправляем запрос на авторизацию(POST)
5. вываливается ошибка : Отказано в доступе

POST запрос в Google Chrome(скрыты реальные логин и пароль):
Код:
Request URL:https://login.mts.ru/amserver/UI/Login?gx_charset=UTF-8&auth-status=0&service=moipodpiski&goto=http://moipodpiski.mts.ru/smssubscriptionsstart.aspx
Request Method:POST
Status Code:302 Moved Temporarily
Request Headersview parsed
POST /amserver/UI/Login?gx_charset=UTF-8&auth-status=0&service=moipodpiski&goto=http://moipodpiski.mts.ru/smssubscriptionsstart.aspx HTTP/1.1
Host: login.mts.ru
Connection: keep-alive
Content-Length: 403
Cache-Control: max-age=0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Origin: https://login.mts.ru
User-Agent: Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.154 Safari/537.36
Content-Type: application/x-www-form-urlencoded
Referer: https://login.mts.ru/amserver/UI/Login?gx_charset=UTF-8&auth-status=0&service=moipodpiski&goto=http://moipodpiski.mts.ru/smssubscriptionsstart.aspx
Accept-Encoding: gzip,deflate,sdch
Accept-Language: ru-RU,ru;q=0.8,en-US;q=0.6,en;q=0.4
Cookie: JSESSIONID=A95837C1BA758B3B98C11FDE0274CBCF; AMAuthCookie=AQIC5wM2LY4SfcyC19WIeK-tBr1wvEE0szq5_RN6Fz-lbxI.*AAJTSQACMDQAAlNLAAkzNTY2NTExMDQAAlMxAAIwMw..*; amlbcookie=01
Query String Parametersview sourceview URL encoded
gx_charset:UTF-8
auth-status:0
service:moipodpiski
goto:http://moipodpiski.mts.ru/smssubscriptionsstart.aspx
Form Dataview parsed
IDToken1=9121234567&IDToken2=123453&IDButton=Submit&goto=http%3A%2F%2Fmoipodpiski.mts.ru%2Fsmssubscriptionsstart.aspx&encoded=false&loginURL=%2Famserver%2FUI%2FLogin%3Fgx_charset%3DUTF-8%26service%3Dmoipodpiski%26goto%3Dhttp%253A%252F%252Fmoipodpiski.mts.ru%252Fsmssubscriptionsstart.aspx%26auth-status%3D0&csrf.sign=54e545420722f90d974a65cca005504b4d491d350141f7daade126d02719f451&csrf.ts=1395300542208
Response Headersview source
Access-Control-Allow-Credentials:true
Access-Control-Allow-Origin:https://oauth.mts.ru
Cache-Control:no-cache, no-store
Connection:keep-alive
Content-Length:577
Content-Security-Policy:default-src 'self'; script-src 'self' 'unsafe-inline'; style-src 'self' 'unsafe-inline'; img-src 'self' data:; frame-src http://*.mts.ru https://*.mts.ru http://*.mts.ru:80 https://*.mts.ru:443; report-uri /amserver/csp-report;
Content-Type:text/html;charset=utf-8
Date:Thu, 20 Mar 2014 07:32:22 GMT
Expires:Wed, 31 Dec 1969 23:59:59 GMT
Location:http://moipodpiski.mts.ru/smssubscriptionsstart.aspx
Pragma:no-cache
Server:nginx/1.3.14
Set-Cookie:AMAuthCookie=LOGOUT; Domain=.mts.ru; Expires=Thu, 01-Jan-1970 00:00:10 GMT; Path=/
Set-Cookie:MTSWebSSO=AQIC5wM2LY4SfcyC19WIeK-tBr1wvEE0szq5_RN6Fz-lbxI.*AAJTSQACMDQAAlNLAAkzNTY2NTExMDQAAlMxAAIwMw..*;path=/;domain=.mts.ru;httponly
Set-Cookie:login.mts.ru.logout=0; Version=1; Domain=.mts.ru; Path=/
Set-Cookie:IHLink=https://ihelper.nnov.mts.ru/selfcare/welcome.aspx; Domain=.mts.ru; Expires=Thu, 01-Jan-2114 00:00:10 GMT; Path=/
X-Content-Security-Policy:default-src 'self' 'unsafe-inline'; img-src 'self' data:; frame-src http://*.mts.ru https://*.mts.ru http://*.mts.ru:80 https://*.mts.ru:443; options inline-script; report-uri /amserver/csp-report;
X-Content-Type-Options:nosniff
X-Frame-Options:DENY
X-node:02b01
X-node:d1
X-Powered-By:openam.org.ru/1.0
X-rev:4034
X-WebKit-CSP:allow 'self'; options inline-script; report-uri /amserver/csp-report;
X-XSS-Protection:1; mode=block

Код AutoIt:
Код:
$sLoginMTS = "9121234567"
$sPassMTS = "12345"
Global $oErrorHandler

Func ErrorFunc()
    MsgBox(16, 'Ошибка', $oErrorHandler.description & " - " & $oErrorHandler.description)
    Exit 2
EndFunc

__GetDataSubscription($sLoginMTS, $sPassMTS)

Func __GetDataSubscription($sLoginMTS = "", $sPassMTS = "")
	
	Local $sIDToken1 = ""
	Local $sIDToken2 = ""
	Local $sIDButton = "Submit"
	Local $sgoto = "http%3A%2F%2Fmoipodpiski.mts.ru%2Fsmssubscriptionsstart.aspx"
	Local $sencoded = "false"
	Local $sloginURL = "%2Famserver%2FUI%2FLogin%3Fgx_charset%3DUTF-8%26service%3Dmoipodpiski%26goto%3Dhttp%253A%252F%252Fmoipodpiski.mts.ru%252Fsmssubscriptionsstart.aspx%26auth-status%3D0"
	Local $scsrfsign = ""
	Local $scsrfts = ""
	Local $sURL1 = 'https://login.mts.ru/amserver/UI/Login?gx_charset=UTF-8&auth-status=0&service=moipodpiski&goto=http://moipodpiski.mts.ru/smssubscriptionsstart.aspx'
	Local $sURL2 = 'https://login.mts.ru/amserver/UI/Login?gx_charset=UTF-8&auth-status=0&service=moipodpiski&goto=http://moipodpiski.mts.ru/smssubscriptionsstart.aspx'

	Local $sAllResponseHeaders = ''
	Local $sCOOKIES = ''
	
	$oErrorHandler = ObjEvent('AutoIt.Error', 'ErrorFunc') 
	
	Local $oRequest = ObjCreate('MSXML2.XMLHTTP')
	If Not IsObj($oRequest) Then
		Return SetError($_IEStatus_InvalidDataType, 1, 0)
	EndIf
	
	Local $oHtmlFile = ObjCreate('HtmlFile')
	If Not IsObj($oHtmlFile) Then
		Return SetError($_IEStatus_InvalidDataType, 1, 0)
	EndIf
	
	
	$oRequest.Open('GET', $sURL1, 0)
	$oRequest.SetRequestHeader('Connection','keep-alive')
	$oRequest.Send()

	
	;парсим ответ сервера, получаем cookies
	$aResponseHeaders = StringSplit ( $oRequest.getAllResponseHeaders(), @CRLF )
	For $i = 1 To $aResponseHeaders[0]
		If StringLeft( $aResponseHeaders[$i], 10) = 'Set-Cookie' Then
			$iPozSim = StringInStr( $aResponseHeaders[$i], ';')
			$sCOOKIES &= StringMid($aResponseHeaders[$i],13, $iPozSim - 13 ) & '; ' 
		EndIf
	Next
	$sCOOKIES = StringMid ($sCOOKIES, 1, StringLen($sCOOKIES) - 2)
	ConsoleWrite($sCOOKIES & @CRLF);
	
	; получаем настройки формы
	$sData = $oRequest.responsetext
	$oHtmlFile.designMode = 'on'
	$oHtmlFile.Write($sData)
	$oElement = $oHtmlFile.getElementByID('IDButton')
	If Not IsObj($oElement) Then
		Return SetError($_IEStatus_NoMatch, 2, 0)
	EndIf
;~ 	ConsoleWrite($sData & @CRLF);
	$oElemForm = $oElement.form
	$oInputs = $oElemForm.getElementsByTagName('input')
	For $oInput In $oInputs
		If $oInput.name = 'csrf.sign' Then
			$scsrfsign = $oInput.value
		ElseIf $oInput.name = 'csrf.ts' Then
			$scsrfts = $oInput.value
		EndIf
		ConsoleWrite($oInput.name  & ' - '&  $oInput.value & @CRLF);
	Next
	$oHtmlFile.Write('')
	
	$oRequest.Open('POST', $sURL2, 0)
	
	$oRequest.SetRequestHeader('Accept','text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8')
	$oRequest.SetRequestHeader('Accept-Encoding','gzip,deflate,sdch')
	$oRequest.SetRequestHeader('Accept-Language','ru-RU,ru;q=0.8,en-US;q=0.6,en;q=0.4')
	$oRequest.SetRequestHeader('Connection','keep-alive')
	$oRequest.SetRequestHeader('Content-Type', 'application/x-www-form-urlencoded')
	$oRequest.SetRequestHeader('Cookie', $sCOOKIES)
	$oRequest.SetRequestHeader('Cache-Control','max-age=0')
	$oRequest.SetRequestHeader('Referer','https://login.mts.ru/amserver/UI/Login?gx_charset=UTF-8&service=moipodpiski&goto=http%3A%2F%2Fmoipodpiski.mts.ru%2Fsmssubscriptionsstart.aspx&auth-status=0')
	$oRequest.SetRequestHeader('Host', 'login.mts.ru')
	$oRequest.SetRequestHeader('User-Agent', 'Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.154 Safari/537.36')
	$oRequest.SetRequestHeader('Origin','https//login.mts.ru')
	
	
	$sSendText = 'IDToken1='& $sLoginMTS &'&IDToken2='& $sPassMTS &'&IDButton=' & $sIDButton & '&goto=' & $sgoto & '&encoded=false&loginURL=' & $sloginURL & '&csrf.sign=' & $scsrfsign &'&csrf.ts=' & $scsrfts
	$oRequest.SetRequestHeader('Content-Length',StringLen($sSendText))
	ConsoleWrite(StringLen($sSendText) & @CRLF)
	ConsoleWrite($sSendText & @CRLF);
	$oRequest.Send($sSendText) ; что тебе еще надо скотина?!!!
	$sData = $oRequest.responsetext 	
	MsgBox(0,"Status",$oRequest.statustext)	
	ConsoleWrite($sData)
	
	$oRequest.SetRequestHeader('Content-Type', 'text/html')
	$oRequest.Open('GET', 'http://moipodpiski.mts.ru/smssubscriptionsstart.aspx', 0)
	$oRequest.Send()
	$sData = $oRequest.responsetext 	
	MsgBox(0,"Status",$oRequest.statustext)	
	ConsoleWrite($sData)
 	
	$oErrorHandler = 0 ;выключаем обработчик ошибок
	
EndFunc
 

alex33

Скриптер
Сообщения
1,457
Репутация
186
А что если заменить строку
Код:
$oRequest.SetRequestHeader('Cookies', $sCOOKIES)

на строку
Код:
$oRequest.SetRequestHeader('Cookie', $sCOOKIES)

У нас же
Код:
Cookie: JSESSIONID
а не
Код:
Cookies: JSESSIONID
 
Автор
Renz

Renz

Осваивающий
Сообщения
63
Репутация
37
Проверил, так тоже не работает.

В браузере Cookie:
Код:
Cookie: JSESSIONID=A95837C1BA758B3B98C11FDE0274CBCF; AMAuthCookie=AQIC5wM2LY4SfcyC19WIeK-tBr1wvEE0szq5_RN6Fz-lbxI.*AAJTSQACMDQAAlNLAAkzNTY2NTExMDQAAlMxAAIwMw..*; amlbcookie=01

Это я всякие варианты проверял, забыл поправить. :smile:
 

alex33

Скриптер
Сообщения
1,457
Репутация
186
Может быть из-за этого не работает?
Код:
$oRequest.SetRequestHeader('Origin','https//login.mts.ru')

':' там надо поставить...
Код:
$oRequest.SetRequestHeader('Origin','https://login.mts.ru')


P.S. Не пользуюсь МТС, соответственно логина и пароля (для отладки) у меня нет. А с этих сообщений мне приходится только ****** :smile:
 
Автор
Renz

Renz

Осваивающий
Сообщения
63
Репутация
37
alex33 спасибо за найденную опечатку.
Но...
Так тоже не работает.
С левыми номерами выкидывает обратно на страницу ввода логина и пароля.
С реальными номерами просто не проходит авторизацию.

Отсюда вывод: Строка запроса правильная.
Защита у МТС больно хитрая :mad:.
 

alex33

Скриптер
Сообщения
1,457
Репутация
186
Я бы сделал так:
1. Запустить сниффер;
2. Проделать нужные действия в браузере;
3. Запустить AutoIt скрипт который должен выполнять те же действия что вы выполняли в браузере.
4. Внимательно посмотреть в сниффере данные браузера и скрипта;
5. Найти различия, подправить скрипт и повторить всё с шага 3 (пока не заработает).

Я делаю именно так.


Добавлено:
Сообщение автоматически объединено:

Renz сказал(а):
5. вываливается ошибка : Отказано в доступе
Берём строку
Код:
Local $oRequest = ObjCreate('MSXML2.XMLHTTP')

и заменяем её на строку
Код:
Local $oRequest = ObjCreate('WinHttp.WinHttpRequest.5.1')

Дальше берём строку
Код:
$oRequest.SetRequestHeader('Content-Type', 'text/html')

(не знаю даже для чего вы её туда вставили) и удаляем её.
Строка
Код:
$oRequest.SetRequestHeader('Host', 'login.mts.ru')
тоже лишняя. Она сама вставляется в запрос по умолчанию.
Ошибка отказано в доступе больше не появляется.
Связано это с тем, что в третим запросе приходит заголовок location, а объект XmlHttp location не обрабатывает.

Далее: для работы нам требуется сохранять и передавать наши cookies.
 
Автор
Renz

Renz

Осваивающий
Сообщения
63
Репутация
37
Связано это с тем, что в третим запросе приходит заголовок location, а объект XmlHttp location не обрабатывает
:ok:

ВОТ ОНО!!! Заменил на объект "WinHttp.WinHttpRequest.5.1" Вычистил заголовки. Заработало!
alex33 респект тебе и уважуха. :beer: Сейчас скрипт причешу, сюда скину, может пригодится кому.
 
Верх