jjjzw 发表于 2021-3-23 19:51

记一次设计自动签到脚本的探索过程

本帖最后由 jjjzw 于 2021-3-23 21:14 编辑

去年疫情爆发后,学校要求每日上报位置、体温等信息,虽然填一下也不麻烦,但是经常忘记被辅导员点名:'(weeqw,这次借着学python爬虫的机会写一个自动上报的程序

1、进行一次正常的填报,并抓包:


2、直奔最关心的post包,看看里面有哪些东西:


重要的东西有两个:带有身份信息的Cookie、上传位置信息的字符串


3、如果是自己使用,直接保留原有的Cookie即可,如果要其他的人使用,就要搞清楚Cookie里面真正有用的数据是哪些
在加载页面时发现了一个get-info的包:


注重这个包,是因为它不仅带有一样的Cookie,而且在返回的json中携带了身份信息和上次填报的地理位置
用python进行测试:
import requests
from bs4 import BeautifulSoup
# 取消https的warnings
requests.packages.urllib3.disable_warnings()

# 照搬抓到的包的headers
headers = {
    "Host": "zlapp.*****.edu.cn",
    "Accept": "application/json, text/plain, */*",
    "Connection": "keep-alive",
    "Accept-Language": "zh-cn",
    "Accept-Encoding": "br, gzip, deflate",
    # 修改Cookie测试
   "Cookie": "eai-sess=2k34n5bbf8di0s9lm2u3g4vs8eu2i40d",
    "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/605.1.15 (KHTML, like Gecko) "
                  "Version/11.1.2 Safari/605.1.15",
    "Referer": "https://zlapp.edu.cn/site/ncov/Daily",
    "X-Requested-With": "XMLHttpRequest"
}
url = "https://zlapp*****.cn/ncov/wap/get-info"
r = requests.get(url, headers=headers, verify=False)
b = BeautifulSoup(r.content, "lxml")
print(b)
经过测试,Cookie只需要eai-sess就可以获取个人信息
(小白对于Cookie的生成不太了解,不知道是不是通过md5加密的数据)

4、伪造上传数据
选取一段:
address=%E4%B8%8A%E6%B5%B7%E5%B8%82%E6%9D%A8%E6%B5%A6%E5%8C%BA%E4%BA%94%E8%A7%92%E5%9C%BA%E8%A1%97%E9%81%93%E6%AD%A6%E5%B7%9D%E8%B7%AF78%E5%BC%8448%E5%8F%B7%E5%A4%8D%E6%97%A6%E5%A4%A7%E5%AD%A6%E9%82%AF%E9%83%B8%E6%A0%A1%E5%8C%BA
发现将中文进行了urlencode编码
了解了编码方式,可以继续分析数据。解码后,发现字符串携带的信息很少,很容易伪造!
# 很眼熟的时间戳,可以使int(time.time() * 1000)获得
now_time=1616169823968

# 一卡通号码
number=183****

# 名字,可以使用quote函数进行编码
realname=***

# 日期,使用time.strftime("%Y%m%d", time.localtime())可以获得
date=20210319

还有三个未知的数据:id、uid、created
想起来在观察get-info包的时候见过这几个值
于是想出了解决办法:请求get-info,并通过正则提取这些变量:
headers1 = {
      "Host": "zlapp.edu.cn",
      "Accept": "application/json, text/plain, */*",
      "Connection": "keep-alive",
      "Accept-Language": "zh-cn",
      "Accept-Encoding": "br, gzip, deflate",
      "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/605.1.15 (KHTML, like Gecko) "
                      "Version/11.1.2 Safari/605.1.15",
      "Referer": "https://zlapp.edu.cn/site/ncov/Daily",
      "X-Requested-With": "XMLHttpRequest"
    }
headers1.update({"Cookie": cookie})
url1 = "https://zlapp.edu.cn/ncov/wap/get-info"
info1 = requests.get(url1, headers=headers1, verify=False)
b1 = str(BeautifulSoup(info1.content, "lxml"))
created_raw = re.search('"created":{10}', b1).group(0)
created = str(created_raw)
uid_raw = re.search('"uid":"{5}"', b1).group(0)
uid = str(uid_raw)
id_raw = re.search('"id":{8}', b1).group(0)
id_ = str(id_raw)
number_raw = re.search('"number":"{11}"', b1).group(0)
number = str(number_raw)
realname_raw = re.search('"realname":"[\u4e00-\u9fa5]{3}"', b1).group(0)
realname = str(realname_raw)
name = quote(realname)

5、组合字符串并post:(理论上将地理位置改成奇怪的名字也没问题,但是不敢···)
# data="now_time="+now_time+"&``````"+``````
post_ = requests.post(url, headers=headers, data=data)
b = BeautifulSoup(post_.content, "lxml")
print(b)

6、得到返回结果:{"e":0,"m":"操作成功","d":{}}
成功完成上报!

7、总结
一个完整的上报过程还有很多可以探究、学习的知识点,比如Cookie的生成规则、json_text的处理方式等
但由于我水平太差:'(weeqw,还无法作出解析

Tips:由于不了解学校的信息安全条例,这篇帖子隐藏了与学校有关的完整url,也无法给出完整的python代码,但不影响阅读,希望大佬们理解!
其他网站、app类似签到等操作也可以用这种思路来分析

jjjzw 发表于 2021-3-23 21:09

Pandolar 发表于 2021-3-23 21:02
人在牢里,刚下jing车。
劝楼主抱着练习技术的目的去看待健康系统,千万别盈利和大规模扩散呀

hhhh谢谢提醒:lol

jjjzw 发表于 2021-3-23 22:44

不负韶华 发表于 2021-3-23 21:49
headers挺多数据没用

是有很多没用,我是习惯了把整个headers写上去

Cacarot 发表于 2021-3-23 20:02

学习了,正在研究python中……

沉心云 发表于 2021-3-23 20:19

楼主是钉钉吗?

Pandolar 发表于 2021-3-23 21:02

人在牢里,刚下jing车。
劝楼主抱着练习技术的目的去看待健康系统,千万别盈利和大规模扩散呀{:301_971:}

VICK168 发表于 2021-3-23 21:15

真不错,注意别让辅导员和学校知道,以免吃警告或处分,

飞飞小飞侠 发表于 2021-3-23 21:30

找了几天这东西了,post包已经拿到了就是不知道下一步,现在知道了,谢谢楼主

不负韶华 发表于 2021-3-23 21:49

headers挺多数据没用

spawn_fly 发表于 2021-3-24 14:54

思路不错,学习 python 还是有用的
页: [1] 2
查看完整版本: 记一次设计自动签到脚本的探索过程