某edu登录JS逆向

____7n   ·   发表于 2024-03-22 15:05:41   ·   代码审计

首先随便输点东西,抓个包:
发现这里提交了加过密的password,接下来就是找password参数,看看对它怎么处理了:
全局搜索发现了奇怪的东西

_etd2(password.val(),casLoginForm.find("#pwdDefaultEncryptSalt").val());

可以看见,使用了_etd2函数对password进行处理了,传参还有一个盐值(pwdDefaultEncryptSalt)
那就去找找_etd2函数具体写了啥:

function _etd2(_p0, _p1) {
 try {
 var _p2 = encryptAES(_p0, _p1);
 $("#casLoginForm").find("#passwordEncrypt").val(_p2);
 } catch (e) {
 $("#casLoginForm").find("#passwordEncrypt").val(_p0);
 }
}

接着跟进到enc.js中的encryptAES函数:

function encryptAES(data, _p1) {
    if (!_p1) {
        return data;
    }
    var encrypted = _gas(_rds(64) + data, _p1, _rds(16));
    return encrypted;
}

在往上看看_gds和_rds是什么东西:

function _gas(data, key0, iv0) {
 key0 = key0.replace(/(^\\s+)|(\\s+$)/g, "");
 var key = CryptoJS.enc.Utf8.parse(key0);
 var iv = CryptoJS.enc.Utf8.parse(iv0);
 var encrypted = CryptoJS.AES.encrypt(data, key, {
 iv: iv,
 mode: CryptoJS.mode.CBC,
 padding: CryptoJS.pad.Pkcs7
 });
 return encrypted.toString();
}
var $_chars = 'ABCDEFGHJKMNPQRSTWXYZabcdefhijkmnprstwxyz2345678';

var _chars_len = $_chars.length;
function _rds(len) {
 var retStr = '';
 for (i = 0; i 





...

接下来请求了一次


如果这里返回false就不用验证码,反之true就要
最后就post提交登录请求:


浅浅写个脚本模拟一下:

import requests,execjs,re,json

requests=requests.Session()

class SZUauth():
    def __init__(self,username,password):
        self.username=username
        self.password=password
        self.js=open('enc.js','r',encoding='utf-8').read()
        self.js=execjs.compile(self.js)
        print('Started!')
    def first_req(self):
        headers = {
            'Accept': 'image/avif,image/webp,image/apng,image/svg+xml,image/*,*/*;q=0.8',
            'Accept-Encoding': 'gzip, deflate, br',
            'Accept-Language': 'zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6',
            'Connection': 'keep-alive',
            'Host': 'authserver.***.edu.cn',
            'Referer': 'https://authserver.****.edu.cn/authserver/login?service=http%3A%2F%2Fwww1%2Eszu%2Eedu%2Ecn%2Fmanage%2Fcaslogin%2Easp%3Frurl%3D%2F',
            'Sec-Fetch-Dest': 'image',
            'Sec-Fetch-Mode': 'no-cors',
            'Sec-Fetch-Site': 'same-origin',
            'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36 Edg/122.0.0.0',
            'sec-ch-ua': '"Chromium";v="122", "Not(A:Brand";v="24", "Microsoft Edge";v="122"',
            'sec-ch-ua-mobile': '?0',
            'sec-ch-ua-platform': '"Windows"'
        }
        params={
            'service': 'http://www1.***.edu.cn/manage/caslogin.asp'
        }
        url="https://authserver.***.edu.cn/authserver/login"
        requests.get(url,headers=headers,params=params)
        print('GET Cookie OK!')
    def get_salt(self):
        headers = {
            'Accept': 'image/avif,image/webp,image/apng,image/svg+xml,image/*,*/*;q=0.8',
            'Accept-Encoding': 'gzip, deflate, br',
            'Accept-Language': 'zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6',
            'Connection': 'keep-alive',
            'Host': 'authserver.***.edu.cn',
            'Referer': 'https://authserver.**.edu.cn/authserver/login?service=http%3A%2F%2Fwww1%2Eszu%2Eedu%2Ecn%2Fmanage%2Fcaslogin%2Easp%3Frurl%3D%2F',
            'Sec-Fetch-Dest': 'image',
            'Sec-Fetch-Mode': 'no-cors',
            'Sec-Fetch-Site': 'same-origin',
            'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36 Edg/122.0.0.0',
            'sec-ch-ua': '"Chromium";v="122", "Not(A:Brand";v="24", "Microsoft Edge";v="122"',
            'sec-ch-ua-mobile': '?0',
            'sec-ch-ua-platform': '"Windows"'
        }
        params = {
            'service': 'http://www1.***.edu.cn/manage/caslogin.asp'
        }
        url = "https://authserver.**.edu.cn/authserver/login"
        res=requests.get(url, headers=headers, params=params)
        salt=re.findall('var pwdDefaultEncryptSalt = "(.*?)";',res.text)[0]
        lt=re.findall('',res.text)[0]
        return salt,lt
    def captcha(self):
        headers = {
            'Accept': 'image/avif,image/webp,image/apng,image/svg+xml,image/*,*/*;q=0.8',
            'Accept-Encoding': 'gzip, deflate, br',
            'Accept-Language': 'zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6',
            'Connection': 'keep-alive',
            'Host': 'authserver.***.edu.cn',
            'Referer': 'https://authserver.***.edu.cn/authserver/login?service=http%3A%2F%2Fwww1%2E***%2Eedu%2Ecn%2Fmanage%2Fcaslogin%2Easp%3Frurl%3D%2F',
            'Sec-Fetch-Dest': 'image',
            'Sec-Fetch-Mode': 'no-cors',
            'Sec-Fetch-Site': 'same-origin',
            'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36 Edg/122.0.0.0',
            'sec-ch-ua': '"Chromium";v="122", "Not(A:Brand";v="24", "Microsoft Edge";v="122"',
            'sec-ch-ua-mobile': '?0',
            'sec-ch-ua-platform': '"Windows"'
        }
        params={
            'username': '*********',
            'pwdEncrypt2': 'pwdEncryptSalt',
            '_': '1710940015117'
        }
        url="https://authserver.***.edu.cn/authserver/needCaptcha.html"
        res=requests.get(url,headers=headers,params=params)
        print("Captcha--->>>"+res.text)
    def login(self,salt,lt,password,username):
        headers = {
            'Accept': 'image/avif,image/webp,image/apng,image/svg+xml,image/*,*/*;q=0.8',
            'Accept-Encoding': 'gzip, deflate, br',
            'Accept-Language': 'zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6',
            'Connection': 'keep-alive',
            'Host': 'authserver.***.edu.cn',
            'Referer': 'https://authserver.***.edu.cn/authserver/login?service=http%3A%2F%2Fwww1%2E***%2Eedu%2Ecn%2Fmanage%2Fcaslogin%2Easp%3Frurl%3D%2F',
            'Sec-Fetch-Dest': 'image',
            'Sec-Fetch-Mode': 'no-cors',
            'Sec-Fetch-Site': 'same-origin',
            'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36 Edg/122.0.0.0',
            'sec-ch-ua': '"Chromium";v="122", "Not(A:Brand";v="24", "Microsoft Edge";v="122"',
            'sec-ch-ua-mobile': '?0',
            'sec-ch-ua-platform': '"Windows"'
        }
        pwd=self.js.call('encryptAES',password,salt)
        data= {
            'username': username,
            'password':pwd,
            'lt': lt,
            'dllt': 'userNamePasswordLogin',
            'execution': 'e2s1',
            '_eventId': 'submit',
            'rmShown': '1'
        }
        params = {
            'service': 'http://www1.***.edu.cn/manage/caslogin.asp'
        }
        url="https://authserver.****.edu.cn/authserver/login"
        res=requests.post(url=url,params=params,data=data,headers=headers)
        return res.text,res.status_code
    def check(self):
        self.first_req()
        salt,lt=self.get_salt()
        self.captcha()
        return self.login(salt,lt,self.password,self.username)



def check_pwd(username,password):
    s=***auth(username,password)
    output,code=s.check()
    if code==302:
        return True
    else:
        return False

这个由于验证码还在,所以同一个账号只能测三次,可以拿来测测默认密码啥的
很多学校的auth都是用的这套系统

用户名金币积分时间理由
Track-魔方 100.00 0 2024-05-11 14:02:12 本月有效投稿一篇文章奖励 100
Track-魔方 700.00 0 2024-05-11 14:02:55 深度 200 普适 300 可读 200

打赏我,让我更有动力~

6 条回复   |  直到 6天前 | 758 次浏览

小瑟斯
发表于 7个月前

666

评论列表

  • 加载数据中...

编写评论内容

st2021
发表于 7个月前

666

评论列表

  • 加载数据中...

编写评论内容

syxh
发表于 7个月前

666

评论列表

  • 加载数据中...

编写评论内容

zangmeng
发表于 7个月前

666

评论列表

  • 加载数据中...

编写评论内容

st2021
发表于 7个月前

楼主,图片中码没打全,好像是可以看到具体域名的

评论列表

  • 加载数据中...

编写评论内容

极限
发表于 6天前

《简简单单写个脚本模拟一下》

评论列表

  • 加载数据中...

编写评论内容
登录后才可发表内容
返回顶部 投诉反馈

© 2016 - 2025 掌控者 All Rights Reserved.