QQ 공간 로그 인 파라미터 분석 Firefox+Firebug
저 희 는 보통 이 를 통 해 QQ 공간 을 방문 한 후에 브 라 우 저 는 돌아 오 는 페이지 를 받 은 후에 자동 으로 페이지 의 링크 에 따라 다른 자원 을 방문 합 니 다.실제 프로 그래 밍 을 할 때 이 단 계 를 쓰 지 않 아 도 됩 니 다.브 라 우 저 를 모 의 하려 고 하지 않 는 한.
링크 2:http://xui.ptlogin2.qq.com/cgi-bin/xlogin?proxy_url=http%3A//qzs.qq.com/qzone/v6/portal/proxy.html&daid=5&pt_qzone_sig=1&hide_title_bar=1&low_login=0&qlogin_auto_login=1&no_verifyimg=1&link_target=blank&appid=549000912&style=22&target=self&s_url=http%3A%2F%2Fqzs.qq.com%2Fqzone%2Fv5%2Floginsucc.html%3Fpara%3Dizone&pt_qr_app=%E6%89%8B%E6%9C%BAQQ%E7%A9%BA%E9%97%B4&pt_qr_link=http%3A//z.qzone.com/download.html&self_regurl=http%3A//qzs.qq.com/qzone/v6/reg/index.html&pt_qr_help_링크=http%3A//z.qzone.com/download.htmlhttp://i.qq.com/페이지 에 포 함 된 것 을 되 돌려 줍 니 다.이 링크 는 cookies 정 보 를 얻 을 수 있 습 니 다.예 를 들 어 ptlogin_sig pt_clientip pt_serverip pt_local_token uikey 등 중요 해 보 이 는 것 은 pt 입 니 다.login_sig,뒤에 링크 가 있 습 니 다.하지만 이 값 이 중복 되 더 라 도 서버 에 정상적으로 접근 할 수 있 습 니 다.
관계:링크 3 의 loginsig=2cookie 를 연결 하 는 ptlogin_sig
링크 3:http://check.ptlogin2.qq.com/check?regmaster=&pt_tea=1&pt_vcode=1&uin=[QQ 번호]&appid=549000912&jsver=10132&js_type=1&login_sig=Jb8qYYR6XWBexI*sJL*jj20hiQ72ZFMg06OIKOHDVoaoJxi0Cl90-LYtEtEgHMHb&u1=http%3A%2F%2Fqzs.qq.com%2Fqzone%2Fv5%2Flognocc.html%3Fpara%3Dizone&r=0.81206208100567006 로그 인 창 에 사용자 이름 을 입력 한 후 ajax 가 자동 으로 검사 하 는 링크 입 니 다.서버 는 다음 문자열 을 되 돌려 줍 니 다.
ptui_checkVC('0','!HIE','\x00\x00\x00\x00\x3a\x6d\x15\xdc','6720543da1e5adc5b0aab8b3932b2ec4ef8c38a32bbd9ad59d35f1074a7256be8f7fce48e0ca1642d5d2a3502d8a1c1049e285c81e1af7b3','0');
checkVC 의 첫 번 째 매개 변 수 는 0 일 때 인증 코드 를 입력 하지 않 아 도 된다 는 것 을 나타 낸다.시 대 표 는 인증 코드 를 입력 해 야 합 니 다.
checkVC 의 첫 번 째 매개 변 수 는 0 시의 관계 입 니 다.링크 4 의 verifycode=checkVC 의 두 번 째 매개 변수,링크 4 의 ptverifysession_v1=3cookie 를 연결 하 는 ptvfsession,4 를 연결 하 는 p=암호 화 된 비밀번호
링크 4:http://ptlogin2.qq.com/login?u=[QQ 번호]&verifycode=!CED&pt_vcode_v1=0&pt_verifysession_v1=8fe5343710afe3cbf7b62f4ee56e747251f23edddf0c681087c169738022caded5e33d5621468c7c81ce236cb0e76aaf4a7b8d8499bbb44d&p=jG1LpyBWFAsL9w-199hdIHuvpllpsBufclV9ZECJXkZcmrHlBKlh12WXQvzxSGxQMGkBndMzikwrEgqPJtUEurShStmzGYNKLKTNHP92snWXipoDUUg-G3VSeiw-nryQvE6Mr0khGUqbD2W2FcyMWPihe8MBmFoQpOSsSJWe7Br30kwS8co*WjgDh0aM1xAKGMfpG*QRxEXJ2Cj6L-Tb5Q__&pt_randsalt=0&u1=http%3A%2F%2Fqzs.qq.com%2Fqzone%2Fv5%2Floginsucc.html%3Fpara%3Dizone&ptredirect=0&h=1&t=1&g=1&from_ui=1&ptlang=2052&action=5-15-1441425206927&js_ver=10132&js_type=1&login_sig=Ro4T6*1opNh*GcOfSYi5iKaDT0uB5F-S7KM3rEn-DzkZI1uewRtX*xjfqFRnKbkU&pt_uistyle=32&aid=549000912&daid=5&pt_qzone_sig=1
중요 한 것 은 이 암호 화 된 비밀 번 호 를 분석 하 는 것 이다.다음은 주로 이것 을 분석 하 는 데 쓰 인 다.
로그 인 버튼 으로 전환,오른쪽 단추-->Firebug 로 요소 보기
그리고 HTML 에 있 는 위 치 를 볼 수 있 습 니 다.그리고 오른쪽 이 벤트 를 클릭 하면 js 스 크 립 트 에 대응 하 는 click 함 수 를 볼 수 있 습 니 다.
먼저 오른쪽 단 추 를 눌 러 서 함 수 를 복사 한 다음,오른쪽 단 추 를 눌 러 서 스 크 립 트 에서 봅 니 다
복 사 된 함 수 는 다음 과 같 습 니 다:
4.567913.그리고 우 리 는 위 코드 의 일부 문 자 를 선택 하여 검색 합 니 다.
검색 결과
다음은 pt.plogin.submit(e)에 대응 하 는 내용 을 찾 아 보 겠 습 니 다.
다음 내용 을 찾 으 면 var b=pt.plogin.getSubmitUrl('login')에 주의 하 십시오.이것 은 getSubmitUrl 함 수 를 호출 하여 뒤의 암호 화 작업 을 수행 합 니 다.
(function (e){e&&e.preventDefault();if(pt.plogin.needShowNewVc==true){pt.plogin.showVC()}else{pt.plogin.submit(e)}})
다음은 getSubmitUrl 이라는 함 수 를 찾 겠 습 니 다.
$.e.add(domBtn, 'click', function (e) {
e && e.preventDefault();
if (pt.plogin.needShowNewVc == true) {
pt.plogin.showVC()
} else {
pt.plogin.submit(e)
}
});
그 중에서 코드 에서 비교적 중요 한 것 은 f.p=$.Encryption.getEncryption(d,pt.plogin.salt,f.verifycode,pt.plogin.armSafeEdit.isSafe)이다.
마지막 매개 변수 pt.plogin.armSafeEdit.isSafe 는 중요 하지 않 습 니 다.이 매개 변 수 는 보안 컨트롤 이 설치 되 어 있 는 지 없 는 지 판단 하 는 데 사 용 됩 니 다.설치 되 어 있 지 않 으 면 비밀 번 호 는 원래 의 값 으로 전 달 됩 니 다.설치 되 어 있 으 면 비밀 번 호 는 md5 값 으로 전 달 됩 니 다.
다음은 getEncryption 이라는 함 수 를 찾 습 니 다.
submit: function (a) {
if (pt.plogin.cntCheckTimeout >= 2) {
pt.plogin.show_err(pt.plogin.checkErr[pt.ptui.lang]);
pt.plogin.needVc = false;
pt.plogin.needShowNewVc = false;
return
}
pt.plogin.submitTime = new Date().getTime();
a && a.preventDefault();
if (pt.plogin.lastCheckAccount != pt.plogin.account && !pt.plogin.hasCheck) {
pt.plogin.check(arguments.callee);
return
}
if (!pt.plogin.ptui_onLogin(document.loginform)) {
return false
} else {
$.cookie.set('ptui_loginuin', escape(document.loginform.u.value), pt.ptui.domain, '/', 24 * 30)
}
if (pt.plogin.checkRet == - 1 || pt.plogin.checkRet == 3) {
pt.plogin.show_err(pt.plogin.checkErr[pt.ptui.lang]);
pt.plogin.lastCheckAccount = '';
pt.plogin.domFocus($('p'));
pt.plogin.check();
return
}
clearTimeout(pt.plogin.loginClock);
pt.plogin.loginClock = setTimeout('pt.plogin.loginTimeout();', 5000);
var b = pt.plogin.getSubmitUrl('login');
$.winName.set('login_href', encodeURIComponent(pt.ptui.href));
pt.plogin.showLoading();
if (pt.plogin.isVCSessionTimeOut() && !pt.plogin.needVc) {
pt.plogin.lastCheckAccount = '';
pt.plogin.check();
window.setTimeout(function () {
pt.plogin.submit()
}, 1000)
} else {
$.http.loadScript(b);
pt.plogin.isdTime['7808-7-2-0'] = new Date().getTime()
}
return false
},
getEncryption(password,salt,vcode,isMd 5)의 네 가지 인 자 를 되 돌아 봅 니 다.
getEncryption(d, pt.plogin.salt, f.verifycode, pt.plogin.armSafeEdit.isSafe)
password=d 는 원본 암호 값 입 니 다.(보안 컨트롤 이 설치 되 어 있 으 면 암호 의 md5 값 입 니 다.)
salt=pt.plogin.salt 사용자 이름 에 따 른 무 작위 소금 사용자 이름 실행 uin2hex 함수
vcode=f.verifycode 는 cookies 에서 직접 가 져 오 면 됩 니 다.인증 코드
isMd 5=pt.plogin.armSafeEdit.isSafe true 는 보안 컨트롤 을 불 러 오 는 데 성 공 했 음 을 나 타 냅 니 다 false 는 실 패 했 음 을 나 타 냅 니 다.
사실 보안 컨트롤 의 역할 은 암 호 를 md5 암호 화 하 는 것 입 니 다.getEncryption 코드 에서 pt.plogin.armSafeEdit.isSafe 를 통 해 암호 화 여 부 를 판단 하 는 것 입 니 다.
뒤의 기본 적 인 예측 은 모두 가 스스로 분석 할 수 있 을 것 이다.새로운 암호 화 방법 은 RSA 암호 화 를 추 가 했 는데 주로 다음 과 같은 코드 이다.
대응 하 는 함수
getSubmitUrl: function (b) {
var a = pt.plogin.loginUrl + b + '?';
var f = {
};
if (b == 'pt_susp_repush') {
return a += 'appid=' + pt.ptui.appid + '&daid=' + pt.ptui.daid
}
if (b == 'login') {
f.u = encodeURIComponent(pt.plogin.at_account);
f.verifycode = $('verifycode').value;
if (pt.plogin.needShowNewVc) {
f.pt_vcode_v1 = 1
} else {
f.pt_vcode_v1 = 0
}
f.pt_verifysession_v1 = pt.plogin.pt_verifysession || $.cookie.get('verifysession');
var d = $('p').value;
if (pt.plogin.armSafeEdit.isSafe) {
d = pt.plogin.armSafeEdit.safepwd
}
f.p = $.Encryption.getEncryption(d, pt.plogin.salt, f.verifycode, pt.plogin.armSafeEdit.isSafe);
f.pt_randsalt = pt.plogin.isRandSalt || 0
}
if (b == 'login') {
f.u1 = encodeURIComponent(pt.qlogin.getSurl($('u').value))
} else {
f.u1 = encodeURIComponent(pt.qlogin.getSurl())
}
f.ptredirect = pt.ptui.target;
f.h = 1;
f.t = 1;
f.g = 1;
f.from_ui = 1;
f.ptlang = pt.ptui.lang;
f.action = pt.plogin.action.join('-') + '-' + (new Date() - 0);
f.js_ver = pt.ptui.ptui_version;
f.js_type = pt.plogin.js_type;
f.login_sig = pt.ptui.login_sig;
f.pt_uistyle = pt.ptui.style;
if (pt.ptui.low_login == 1 && pt.plogin.low_login_enable && !pt.plogin.isMailLogin) {
f.low_login_enable = 1;
f.low_login_hour = pt.plogin.low_login_hour
}
if (pt.ptui.csimc != '0') {
f.csimc = pt.ptui.csimc;
f.csnum = pt.ptui.csnum;
f.authid = pt.ptui.authid
}
f.aid = pt.ptui.appid;
if (pt.ptui.daid) {
f.daid = pt.ptui.daid
}
if (pt.ptui.pt_3rd_aid != '0') {
f.pt_3rd_aid = pt.ptui.pt_3rd_aid
}
if (pt.ptui.regmaster) {
f.regmaster = pt.ptui.regmaster
}
if (pt.ptui.mibao_css) {
f.mibao_css = pt.ptui.mibao_css
}
if (pt.ptui.pt_qzone_sig == '1') {
f.pt_qzone_sig = 1
}
if (pt.ptui.pt_light == '1') {
f.pt_light = 1
}
for (var c in f) {
a += (c + '=' + f[c] + '&')
}
return a
},
예전 에 js 코드 에 있 던 QQ 의 TEA 함수.
function getEncryption(password, salt, vcode, isMd5) {
vcode = vcode || '';
password = password || '';
var md5Pwd = isMd5 ? password : md5(password),
h1 = hexchar2bin(md5Pwd),
s2 = md5(h1 + salt),
rsaH1 = $pt.RSA.rsa_encrypt(h1),
rsaH1Len = (rsaH1.length / 2).toString(16),
hexVcode = TEA.strToBytes(vcode.toUpperCase(), true),
vcodeLen = Number(hexVcode.length / 2).toString(16);
while (vcodeLen.length < 4) {
vcodeLen = '0' + vcodeLen
}
while (rsaH1Len.length < 4) {
rsaH1Len = '0' + rsaH1Len
}
TEA.initkey(s2);
var saltPwd = TEA.enAsBase64(rsaH1Len + rsaH1 + TEA.strToBytes(salt) + vcodeLen + hexVcode);
TEA.initkey('');
setTimeout(function () {
__monitor(488358, 1)
}, 0);
return saltPwd.replace(/[\/\+=]/g, function (a) {
return {
'/': '-',
'+': '*',
'=': '_'
}
[
a
]
})
}
일단 여기까지 분석 할 게 요.
아마 이 링크 는 여러분 들 이 이해 할 수 있 을 것 입 니 다.http://www.jianshu.com/p/4217d8f3574b
원시 JS:여기 누 르 기
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
[2022.04.19] 자바스크립트 this - 생성자 함수와 이벤트리스너에서의 this18일에 this에 대해 공부하면서 적었던 일반적인 함수나 객체에서의 this가 아닌 오늘은 이벤트리스너와 생성자 함수 안에서의 this를 살펴보기로 했다. new 키워드를 붙여 함수를 생성자로 사용할 때 this는...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.