本帖最后由 jjjzw 于 2021-3-23 21:14 编辑
去年疫情爆发后,学校要求每日上报位置、体温等信息,虽然填一下也不麻烦,但是经常忘记被辅导员点名,这次借着学python爬虫的机会写一个自动上报的程序
1、进行一次正常的填报,并抓包:
2、直奔最关心的post包,看看里面有哪些东西:
重要的东西有两个:带有身份信息的Cookie、上传位置信息的字符串
3、如果是自己使用,直接保留原有的Cookie即可,如果要其他的人使用,就要搞清楚Cookie里面真正有用的数据是哪些
在加载页面时发现了一个get-info的包:
注重这个包,是因为它不仅带有一样的Cookie,而且在返回的json中携带了身份信息和上次填报的地理位置
用python进行测试:
[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、伪造上传数据
选取一段:
[Python] 纯文本查看 复制代码 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编码
了解了编码方式,可以继续分析数据。解码后,发现字符串携带的信息很少,很容易伪造!
[Python] 纯文本查看 复制代码 # 很眼熟的时间戳,可以使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,并通过正则提取这些变量:
[Python] 纯文本查看 复制代码 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":[0-9]{10}', b1).group(0)
created = str(created_raw)[10:]
uid_raw = re.search('"uid":"[0-9]{5}"', b1).group(0)
uid = str(uid_raw)[7:-1]
id_raw = re.search('"id":[0-9]{8}', b1).group(0)
id_ = str(id_raw)[5:]
number_raw = re.search('"number":"[0-9]{11}"', b1).group(0)
number = str(number_raw)[10:-1]
realname_raw = re.search('"realname":"[\u4e00-\u9fa5]{3}"', b1).group(0)
realname = str(realname_raw)[12:-1]
name = quote(realname)
5、组合字符串并post:(理论上将地理位置改成奇怪的名字也没问题,但是不敢···)
[Python] 纯文本查看 复制代码 # 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的处理方式等
但由于我水平太差,还无法作出解析
Tips:由于不了解学校的信息安全条例,这篇帖子隐藏了与学校有关的完整url,也无法给出完整的python代码,但不影响阅读,希望大佬们理解!
其他网站、app类似签到等操作也可以用这种思路来分析 |