Reverse-Engineering-for-CUHK-Online-School
所属分类:项目开发与运营
开发工具:Python
文件大小:0KB
下载次数:0
上传日期:2024-03-25 12:09:36
上 传 者:
sh-1993
说明: 对中大网校的逆向工程(含自动登录)
(Reverse engineering for CUHK Online School (including automatic login))
文件列表:
CASE.py
加密分析报告.pdf
# 加密分析(逆向)
陈梓轩
对中大网校登录的安全认证、加密过程分析
中大网校登录url:https://user.wangxiao.cn/login
拟利用F12,并进行登录,抓取在登录过程中传输的包,设置断点并反复提交登录,确定前端加密程序的具体位置,对其进行逆向工程完成加密分析
## 实验流程
### 登录界面抓包
对中大网校登录页面F12抓包
![](https://notes.sjtu.edu.cn/uploads/upload_50d2a79d23bf2d9a7d6f863cd0bd69eb.png)
----
![](https://notes.sjtu.edu.cn/uploads/upload_d69e1b72607579fa0a240d9d57ab38d6.png)
观察捕获的包,其中一包ID名为passwordLogin,猜测大概率为所需包,
在passwordLogin包中涉及许多程序,从上往下进行分析,容易知道jquery.js文件不为所需,尝试bl.js:1文件无所需加密信息,查看utils.min/js:1文件(堆栈window.zdAjax),通过后续过程发现加密程序确实在该文件中,进行逆向。
### 设置断点定位加密位置
----
![](https://notes.sjtu.edu.cn/uploads/upload_b2bfd38ff55e91b8e72c8f446ab3af55.png)
通过设置断点并观察password是否是已加密的状态,层层向上寻找,找到令password加密的位置,定位加密程序
![](https://notes.sjtu.edu.cn/uploads/upload_8674adecd8ebcc68190c9db18a6db840.png)
----
![](https://notes.sjtu.edu.cn/uploads/upload_4abdcf75e4c6281de45e02ebb3881879.png)
最终找到加密程序位置
由程序可知该加密过程:
对password+ress.data一同进行encrypt(加密程序)
其中ress为 url: '/common/getTime' 的json响应
![](https://notes.sjtu.edu.cn/uploads/upload_1f674133357f0f16e2fbf93a5fb0af66.png)
---
### 进入加密程序encrypt
加密程序encryptFn如图:
![](https://notes.sjtu.edu.cn/uploads/upload_4e1daff6b078f8dc7b3b2c60031af5d9.png)
根据该程序,并进入JSEncrypt查看,可以知道中大网校登录利用了RSA公钥加密算法对登录过程的密码(准确地说,被加密的不只是密钥,还有gettime.data)在传输前进行了加密,并且该程序中我们可以看到给定的公钥,所以后续我们可以利用该公钥并通过requests包输入指定data,登陆中大网校。
### 实现登录程序
完成登录过程需要四步
1. 进入登录页面
2. 验证码
3. 对密码进行加密
4. 进行登录
#### 进入登录页面
```
url = "https://user.wangxiao.cn/login"
sess = requests.session()
resp = sess.get(url)
```
#### 验证码
我们可以从登录页面的cookies中获取图片,利用图像处理api获取验证码。
在抓包过程可知验证码图片来源于/getImageCaptcha页面,并可在包中获取其url。
```
verify_code_url = "https://user.wangxiao.cn/apis//common/getImageCaptcha"
verify_resp = sess.post(verify_code_url,headers = headers)
verify_dic = verify_resp.json()
verify_b64_img = verify_dic["data"].split(",")[-1]
# 图像处理利用图片获取验证码程序
def base64_api(img):
data = {"username":username,"password":password,"typeid"=typeid,"image":img}
result = json.loads(
requests.post("http://api.ttshitu.com/predict",json=data).text
)
if resule['success']:
return result["data"]["result"]
else:
return result["message"]
verify_code = base64_api(verify_b64_img)
```
#### 对密码进行加密
通过逆向工程,利用源程序中提供的公钥和RSA公钥加密算法,对密码进行加密。
```
gettime_url = "https://user.wangxiao.cn/apis//common/getTime"
gettime_resp = sess.post(gettime_url,headers = headers)
gettime_data = gettime_resp.json()["data"]
public_key = "-----BEGIN RSA PUBLIC KEY-----
\nZ0Cg7opDNYJM/lFDbRIILRx3pp0HMEkY5Cc/39s8CxDsNVeMw3A+TYi+4bsHyJajR9st/6ib4
KGa9+rCS98JM/z8oOLIMAMQVCJ2ehV2fr17SjLdUH3pDlN1A3idTK7crUdd/UUUhJee9pDTI6LI
0OX7wH0hBpMb85TUs1aDteE=\n-----END PUBLIC KEY-----"
key = RSA.import_key(public_key)
rsa = PKCS1_v1_5.new(key)
# 加密 encryptFn(pwd + '' + ress.data)
password = password +str(gettime_data)
miwen = rsa.encrypt(password.encode("utf-8"))
miwen = base64.b64encode(miwen).decode("utf-8")
```
### 进行登录
获取登录页面的响应,并提供所需的数据(用户名,密码,验证码),完成登录
```
login_url = "https://user.wangxiao.cn/passwordLogin"
login_data = {
"imageCaptchaCode": verify_code
"password":miwen
"userName":username
}
login_resp = sess.post(login_url, data = json.dumps(login_data), headers = headers)
print(login_resp.text)
```
* 可以见到返回成功的响应:
![](https://notes.sjtu.edu.cn/uploads/upload_13e0e58017beefffe51ff47e81907568.png)
## 结论
在抓包及实验分析的过程中,我们知道了中大网校登录的加密程序,是无js混淆的RSA公钥加密算法。
中大网校登录过程中,会在前端对输入的明文密码结合gettime界面上的参数,转换为utf-8编码,并利用给定的公钥进行加密,最后利用base64将字节转换为字符串,并进行utf-8解码然后进行传输。
而在登录验证过程中,会将传输得到的密码密文与数据库中的密码密文进行比对(存储在数据库中的也是密文以保证密码隐私安全)
利用RSA非对称加密算法,并且在加密时加入了对原有密码明文添加了时间参数,RSA基于大素数分解难问题,在前端对密码进行加密,可以很好地保证传输和存储时密码的安全性。
近期下载者:
相关文件:
收藏者: