js获取post请求参数_百度登陆POST参数分析,password及其
他字段的js处理
⾸先F12填个登陆信息,抓个包看看有些什么收获;在发出post之前后台Ajax加了了两个数据,如下
1.返回as、ts、tk三个字段
jsonpCallbackb770({code: 0, data: {tk: "8016Kzycp+GQ3kI/uAoVvVOz/kiwN3UrRnrmtz/22RuUQ58=", as: "6e8eb328",…}})
code:0
data:{tk: "8016Kzycp+GQ3kI/uAoVvVOz/kiwN3UrRnrmtz/22RuUQ58=", as: "6e8eb328",…}
as:"6e8eb328"
ds:"JcXUIDsjOM2GBUMUbkaht+BXxcoiU2xXWpyUkjTvVI+fDmy6BUpiKtfN7q/Uq6spgnEn+Fd1zi8hou5pdCKGk8egB6+Yj2lIYBXkN6clSmAmGdq6O9zhbmmJWOO tk:"8016Kzycp+GQ3kI/uAoVvVOz/kiwN3UrRnrmtz/22RuUQ58="
发出这个get请求需要携带的参数如下:
ak:1e3f2dd1c81f2075171a547893391274
as:6e8eb328
fs:fpypRBX8u9Np5BnKjpqxf8CDddYtri+t5vKBcCCtAuzEnvE+/o7x5ophYGMSNDLgsErrSHaRFaok3Ye4AhC8h9dvmgTCFfk2WulgJZopGLPPFpPUh6HJs4YOMVnV callback:jsonpCallbackb770
js获取json的key和valuev:6633
也就是说我们需要分析出ak、as、fs、v、callback这⼏个字段的来源
2.返回key、pubkey
errno:"0"
key:"oqeFiMtTJkyE7rhXq04bEE0xjX3sR09A"
msg:""
pubkey:"-----BEGIN PUBLIC KEY-----↵MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDNnGNrfFkygOeBatSz8A2bDyIG↵i0DonH36pzjQF10gnI/1flW+Q521 traceid:""
要得到这两个参数看请求携带了什么东西
token:cfde53efbe26bdef8ad3b2147eb10417
tpl:mn
apiver:v3
tt:1546826783617
gid:EE2ED1E-E4A5-4ABC-9E13-9972E89AE472
loginversion:v4
traceid:
callback:bd__cbs__8sabl9
需要的字段还挺多看样⼦有点棘⼿.
再看post请求所需的参数
staticpage:www.baidu/cache/user/html/v3Jump.html
charset:UTF-8
token:cfde53efbe26bdef8ad3b2147eb10417
tpl:mn
subpro:
apiver:v3
tt:1546826812217
codestring:
safeflg:0
u:www.baidu/s?ie=utf8&oe=utf8&wd=%E7%99%BE%E5%AE%B6%E5%8F%B7&tn=98012088_6_dg&ch=9
isPhone:false
detect:1
gid:EE2ED1E-E4A5-4ABC-9E13-9972E89AE472
quick_user:0
logintype:dialogLogin
logLoginType:pc_loginDialog
idc:
loginmerge:true
splogin:rate
username:183********
password:fQ99xuV0uzmnEciyYZYOUYHWIJhh6ttVYy3IkwWfhdgnCaQNCMUVgbr42SKSqOF7evv27tHdHK0SLHQfoodNDVg4g7skCR8qKMX1LYCwXcxxwhqwnab mem_pass:on
rsakey:oqeFiMtTJkyE7rhXq04bEE0xjX3sR09A
crypttype:12
ppui_logintime:40718
countrycode:
fp_uid:
fp_info:
loginversion:v4
ds:wfHjARADdpfQhbI+jByC0wNU1p6S2oHEJEmVtSteNLIkXjTbCf6QEAcrj/g+J5WBB1P9WF+yrXZ0BeNi95/F50mSj7s6GvbQd9FPVT10CpVr/aaDtTxJI6rKhv0FgeW tk:8016Kzycp+GQ3kI/uAoVvVOz/kiwN3UrRnrmtz/22RuUQ58=
dv:tk0.425039906558432931546826771927@eel0j-sAqy7kqZn0oD8UvhAnwJHo64Gb0lGUwlCG6bSzwyFmlXsbBys2lXskpZsmXH4Hc2HBo6GUw4HUhJsAhJG~h traceid:44622A01
callback:parent.bd__pcbs__jf1wx1
上⾯标红的就是我们要重点关照的字段
然后搜索token的值,发现在⼀个js⽂件⾥⾯,然后提取js⽂件url出来分析
然后搜索token的值
URL
passport.baidu/v2/api/?
getapi&tpl=mn&apiver=v3&
tt=1546834671350
&class=login&
gid=E7C72FB-C518-4030-BB7E-555DD8046BE6
&loginversion=v4
&logintype=dialogLogin&traceid=&
callback=bd__cbs__600yh6:formatted
多次测试结果情况就是这个get请求返回的结果之和gid相关,其他参数都可以使⽤固定值,即使不懈怠tt、callback参数也能返回正常的
token并且,不懈怠callback参数请求返回的是标准json格式。
看⼀下git⽣成
搜索⼀下gid=的⽣成到下⾯⼀段代码
<("hide", function() {
var o = document.LowerCase()
, e = n.guideRandom ? n.guideRandom : "";
if ("http:" == o)
var t = "nsclick.baidu/v.gif?pid=111&url=&logintype=hide&merge=1&gid=" + e + "&tpl=" + i.apiOpt.tpl + "&tt=" + (new Date).getTime();
else if ("https:" == o)
var t = "passport.baidu/img/v.gif?pid=111&url=&logintype=hide&merge=1&gid=" + e + "&tpl=" + i.apiOpt.tpl + "&tt=" + (new Date).getTime( gid = e= n.guideRandom ? n.guideRandom : "",顺藤摸⽠到⽣成gid的js
this.guideRandom = function() {
return "xxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g, function(e) {
var t = 16 * Math.random() | 0
, n = "x" === e ? t : 3 & t | 8;
String(16)
}).toUpperCase()
}(),那就应该是这样的了
callback
这个参数和返回来的相应⽂件开头相同,猜想应该是可以⾃定义的,可以⽤固定值,不过还是看看他
的来源;多请求⼏次发现固定部分是parent.bd__pcbs__,然后全局搜索相关到两条js
var l = r.timeOut || 0
, d = !1
, u = c.getUniqueId("bd__pcbs__");
return e + Math.floor(2147483648 * Math.random()).toString(36)
}
可见核⼼代码:e + Math.floor(2147483648 * Math.random()).toString(36)
接着看tt
tt参数是时间戳*1000取前13位
gid
请求token的gid和post请求的gid是同⼀个,可以⽣成,也可以使⽤⼀个固定值
password
重点的加密字段,查对应来源js代码如下
o.password = baidu.url.escapeSymbol(pt(a)
很明显是RSA 加密,pubkey是在发送post请求之前的⼀个get请求⽽来,进⼀步简化这个get请求,只需要携带gid、token就可以返回pubkey
passport.baidu/v2/getpublickey?token=cfde53efbe26bdef8ad3b2147eb10417&gid=EE2ED1E-E4A5-4ABC-9E13-9972E89AE472
对于完整的js实现留在第⼆篇分析
针对password可以直接使⽤Python实现RSA加密,然后使⽤Base64编码结果,对于完整的js实现留在第⼆篇分析
rsa
rsa是请求pubkey⼀同返回的key字段
tk、ds
⽂章开头的⼀个get请求返回的数据
dv
⼀长串字符看样⼦有点难度,尚不知道这个参数的作⽤,那么有三种解决⽅案,复制⼀个固定值、留空⽩值、破解⽣成函数,不到最后是不愿意去js的。下⾯看看这个参数⽣成的js出处
var a = ElementById("dv_Input")
, c = {
gid: n.guideRandom || "",
username: n._SBCtoDBC(i.value),
countrycode: s,
bdstoken: n.bdPsWtoken,
tpl: n.config.product ? n.config.product : "",
vcodestr: n.getElement("smsHiddenFields_smsVcodestr").value,
vcodesign: n.getElement("smsHiddenFields_smsVcodesign").value,
verifycode: n._Element("confirmVerifyCode").value),
flag_code: n.config.voice_sms_flag,
dv: a ? a.value : window.LG_DV_ARG && window.LG_DV_ARG.dvjsInput || ""
}
dv: a ? a.value : window.LG_DV_ARG && window.LG_DV_ARG.dvjsInput || ""
调试时在打开页⾯的同时就⽣成了这个值,那么可以考虑是⼀个固定值或者使⽤固定值,还不确定需要在看看js
function d(e) {
M && (x = e.token + "@" + S(e, e.token),
(1 & F.SendMethod) > 0 && c(x))
}
function c(n) {
var r = t.getElementById("dv_Input");
r && (r.value = n),
e.LG_DV_ARG.dvjsInput = n
}
在c函数上⾯到d函数,看样⼦应该⼋九不离⼗了,在调试⼀下看什么情况,继续查S函数

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。