이 글은 기계 번역의 미러 문서이며, 원본 기사로 바로 이동하려면 여기를 클릭해 주세요.

보기: 14835|회답: 3

QQ 퀵 로그인 프로토콜 분석 및 "CSRF" 구현

[링크 복사]
게시됨 2017. 3. 21. 오후 3:45:47 | | | |
우리 모두 알다시피, 텐센트는 익숙하지 않은 브라우저에서 QQ 빠른 로그인을 구현하기 위해 Activex를 사용했고, 가장 먼저 해야 할 일은 QuickLogin 컨트롤을 설치하는 것이었습니다.
언제 시작할지 모를 때, 퀵 로그인이 갑자기 조작이 필요 없게 됩니다.
그때 저는 매우 혼란스러웠습니다. 텐센트는 로컬 애플리케이션과 상호작용할 때 어떤 이상한 방법을 사용했을까요?

플러그인이 없으면 웹페이지가 로컬 애플리케이션과 직접 상호작용할 수 없어야 합니다(프로토콜이 정의되어 있지 않지만, 프로그램이 제공하는 결과는 호출할 수 없을 뿐).

우연히(사실 작업 관리자를 보고 네이티브 httpd와 Apache 실행 중인 것을 발견하다가 지루해서), 갑자기 한 가지 가능성을 깨달았습니다: 만약 QQ가 로컬 포트를 열고, HTTP 프로토콜을 준수하는 웹 서버, 즉 TCP 서버를 만든 후, 웹페이지 ajax가 그 QQ(현재 웹 서버)에 요청을 보내면, 결과를 얻을 수 있나요?

그게 바로 그 결과입니다.


웹 JS는 http://localhost.ptlogin2.qq.com(4300-4308 포트를 하나씩 성공으로 연결)로 GET 요청을 시작합니다.
핑을 보내면 127.0.0.1이 나오고, 포트를 확인하면 실제로 QQ가 사용 중입니다.

첫 번째 요청: /pt_get_uins?callback=ptui_getuins_CB&r=0.5919004196050326&pt_local_tk=399224727
쿠키 pt_local_tk 뭐든지; r은 난수입니다

결과는 JSON 배열입니다:
var var_sso_uin_list=[{"account":"QQ 계정에 로그인됨","face_index":-1,"gender":0,"nickname":"Your QQ 닉네임","uin":"여전히 당신의 QQ 계정","client_type":66818,"uin_flag":8388612}]; ptui_getuins_CB(var_sso_uin_list);

그 다음 http://ptlogin2.qq.com/getface 사용해 QQ 아바타를 얻으세요. 이 부분은 여기서 다루지 않겠습니다

이렇게 하면 QQ 정보를 웹페이지에 표시할 수 있습니다.

아바타를 누르면(로그인 선택을 할 때)

다음과 같은 요청이 생성됩니다:
http://localhost.ptlogin2.qq.com:4300/pt_get_st?clientuin=你的QQ号&callback=ptui_getst_CB&r=0.7293395590126179&pt_local_tk=399224727
마찬가지로, r은 무작위 숫자pt_local_tk 쿠키에서 나온 숫자입니다local_token
이 요청은 무엇을 하는 걸까요?


자, 세트-쿠키.

그 후 요청을 진행하세요
http://ptlogin2.qq.com/jump?clientuin=你的QQ号&keyindex=19&pt_aid=549000912&daid=5&u1=http%3A%2F%2Fqzs.qzone.qq.com%2Fqzone%2Fv5%2Floginsucc.html%3Fpara%3Dizone&pt_local_tk=1881902769&pt_3rd_aid=0&ptopt=1&style=40
여기서 U1은 목적지 주소뿐입니다

이 요청은 필요한 모든 쿠키를 반환하며, 로그인 상태입니다.

그래서 프로토콜을 배운 후, 심각한 문제가 발견되었습니다: (흑심을 가진 프로그램)이 사용자를 대신해 이런 일을 한다면 어떻게 될까요?

지금 바로 시작하세요!

맥이 하나밖에 없어서 Obj-C로 작성했습니다.

[self GET:@"http://localhost.ptlogin2.qq.com:4300/pt_get_uins?callback=ptui_getuins_CB&r=0.47178753013324637&pt_local_tk=-1211438011" 헤더:nil];
//这里的GET是我自己封装的一个方法,GET网页上的数据

참고: 이전에 QQ 봇(WebQQ 프로토콜 기반)에서 사용한 경험에 비추어 보면, Referer 헤더는 매우 중요합니다(반드시 .qq.com 도메인이어야 합니다). 잘못되면 반드시 실패합니다. 그래서 여기에는 로터리가 없습니다

참고로, 그때 저는 Obj-C를 처음 접한 상태라 코드가 좀 어리석게 느껴질 수 있으니 양해 부탁드립니다.
//cookiedata是个NSDictionary




이렇게 하면 로그인이 완료되고, QQ 공간 인터페이스(여기는 게시되지 않음)를 찾을 수 있으며, 게시물이 성공합니다.

이게 무슨 뜻일까요? 즉, 프로그램이 로컬에서 실행되는 한 QQ 로그인을 완료할 수 있고, QQ 공간 같은 플랫폼에서 보조 인증이 필요 없는 은밀한 작업을 할 수 있다는 뜻입니다




이전의:지식을 대중화하기: CSS에서 단위 px와 em, rem의 차이를 철저히 이해하세요
다음:XDU 미터 실시간 인터넷 속도 모니터링 [소스 코드]
게시됨 2017. 3. 21. 오후 4:36:43 |
나는 이 검은 마음의 프로그래머가 될 거야
 집주인| 게시됨 2017. 3. 21. 오후 4:44:46 |
샤오저, 2017-3-21 16:36에 게시됨
나는 이 검은 마음의 프로그래머가 될 거야

자, 자, 소프트웨어 좀 써서 내가 관찰하게 해 줘
게시됨 2017. 9. 27. 오후 3:47:58 |
원래 주소: https://www.52pojie.cn/thread-591949-1-1.html
동의 없이 재인쇄하지 말아 주시며, 재인쇄 시 출처를 명시하지 말아 주세요.
면책 조항:
Code Farmer Network에서 발행하는 모든 소프트웨어, 프로그래밍 자료 또는 기사는 학습 및 연구 목적으로만 사용됩니다; 위 내용은 상업적 또는 불법적인 목적으로 사용되지 않으며, 그렇지 않으면 모든 책임이 사용자에게 부담됩니다. 이 사이트의 정보는 인터넷에서 가져온 것이며, 저작권 분쟁은 이 사이트와는 관련이 없습니다. 위 내용은 다운로드 후 24시간 이내에 컴퓨터에서 완전히 삭제해야 합니다. 프로그램이 마음에 드신다면, 진짜 소프트웨어를 지원하고, 등록을 구매하며, 더 나은 진짜 서비스를 받아주세요. 침해가 있을 경우 이메일로 연락해 주시기 바랍니다.

Mail To:help@itsvse.com