← 返回文章列表

instgram登录协议分析

instgram登录协议分析

分析登录数据包

  • 值得关注的字段有header中的X-CSRFToken , cookie中的mid , 以及enc_password字段
  • 优先排查csrftokenmid的值对正常请求是否有影响

  • 删除mid后登陆结果正常返回
  • 删除csrftoken后返回页面异常
  • 后续可以关注csrftoken的生成方式 , 优先分析enc_password提交参数

分析enc_password加密流程

  • 查看堆栈后 , 函数名无明显混淆
  • 尝试在e.login异步这里断下
return r(d[0]).post("/accounts/login/ajax/", {
            ...await r(d[6]).getEncryptedParam('password', n, _),
            username: t,
            queryParams: o,
            optIntoOneTap: s,
            stopDeletionNonce: c,
            trustedDeviceRecords: u
        }, {
            loggingData: _,
            timeout: P
        })

// 关注 r(d[6]).getEncryptedParam('password', n, _)
n密码
_uuid

  • 进入enc函数进行查看分析
e.getEncryptedParam = async function(n, c, o, f="enc_") {
        let u = {}
          , l = {};
        if (!i(d[0])._("540a27c9b465b678b75a387cf050e8d8"))
            return Object.freeze({
                [n]: c
            });
        const s = await t(c, o);
        null != s && (u = {
            [`${f}${n}`]: s
        });
        return i(d[0])._("d35655349616aa247b37d45a4f8ef432") || (l = {
            [n]: c
        }),
        Object.freeze({
            ...u,
            ...l
        })
    }

  • 进入t函数

  • 生成了一份时间戳
  • 同时出现了一个success 与 failure 的通知函数
  • 先推测成功后将结果推送到send函数处 , 那么 l 大概率为加密结果
l = await r(d[3]).encryptAndFormat(t, c)
"#PWD_INSTAGRAM_BROWSER:10:1659591100:AYtQALyxojdD2/dr+2vaJTJ7E1qKXpPtIh3hwsrpTltn87QIOSVbD1BFL4+kGf5wuNTqg5GJ351PC0NpzZio5hGYbqYk2BR5FPcjMIzkcXZDW+XMtk6x/7qMDBgBIpHFoLOWeUDK8xDWO2RA/mThxYYDFtw="
  • 实际推测没错 , 尝试进入encryptandformat 函数

  • 此时大概推断为hex的key , 于昨天分析时的facebook大同小异

  • 与昨天facebook加密时算法一致 , AES-GCM-256算法 , 调用了浏览器自带加密库