疫情在校学生之——用python对某校园热水服务app进行测试,实现自动免费用水(仅供参考)
写在前面的过场话:
本文只是对某校园热水服务app做个测试,其实本人并没有做大坏事,并未传播相关技术,文章以下内容的敏感部分会打码,并且相关厂商已经正在进行漏洞修复,大家看看就好。文章后会提供“Python简易搭建代理服务器”的关键代码,代码简单而且开源,我自己也加了点注释。最后的exp只针对本app,感兴趣的朋友可以看看。以下内容包含个人见解,轻喷。若有误导恳请指出。
利用fd分析与实战
要对这app做测试,首先了解下app的运作流程。
登录后,app主界面如下
逻辑简单,步骤如下:
1.app使用蓝牙连接水表。
2.先扣你10块余额,转到预扣款里(不够10元扣除所有)
3.水表上显示10块钱,也就是你的预扣款(我只有6元所有会显示6元),水表出水
4.用水,水表上的金额随着用水量而减少
5.停止用水,水表上显示的金额就是余额,将返还给余额
这样分析还不够,我们利用fiddler看看app向服务器的HTTP请求内容
怎么抓手机包看这,讲的比我好我就不多说了:如何用Fiddler对Android应用进行抓包
app启动时的HTTP数据请求截图:
一共请求了5次,没发现什么地方有问题。要想知道这些请求都是做什么的,可以看看请求的get的内容以及post的内容,还可以看看网站的响应内容。从截图中fiddler右下角的“Message=未发现版本”就可以猜想这个http请求可能是检查更新的请求。
我们用的是“fiddler”,大家都知道的,许多利用都是改金额,现在还没用水,还没发生金额的变化,咱们现在用水试试。
点击“点击开始用水”按钮,看看app截图以及fiddler的http请求
app扣除了6块,转到了预扣款里,水表上显示6.00元,假装有水表照片.jpg
看fiddler截图,一共有4个http请求,注意红框,“00A3AAAF”是本次用水的订单号,之后会用到。
看了下这些http请求,发现并未和服务器发生有关金额的信息交互。
我们进行下个步骤,停止用水让它退还余额。
app截图,以及fiddler抓取到的金额数据截图:
可以看到之前红框框起来的订单号在结账返还金额的时候用到了,不用改。bal的值明显就是退还金额,将他改为6,也就是我的预扣款试试。成功退还所有预扣款!(这app有两次http请求返回的余额,内容都相同,都需要改为6,另一次就不贴截图了)
点击确认结账就余额就能变回6元了,这个“确认结账”按钮实际上是个刷新命令。
Python+burp简易搭建代理服务器
之前已经用fd实现漏洞利用,但是每次都需要手动改,如果写个脚本会比较快一些。正巧我在某同性交友网看到了“Python搭建代理服务器”的代码,就想试试能不能通过这个代码稍加更改实现自动化Exp。
贴出源代码:
#coding:utf-8
import socket
import thread
import urlparse
import select
BUFLEN = 8192
class Proxy(object):
def __init__(self, conn, addr):
self.source = conn
self.request = ""
self.headers = {}
self.destnation = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
self.run()
#用来构造header
def get_headers(self):
header = ''
while True:
header += self.source.recv(BUFLEN)
index = header.find('\n')
if index > 0:
break
# firstLine,self.request=header.split('\r\n',1)
firstLine = header[:index]
self.request = header[index + 1:]
self.headers['method'], self.headers['path'], self.headers['protocol'] = firstLine.split()
#用来发送请求
def conn_destnation(self):
url = urlparse.urlparse(self.headers['path'])
hostname = url[1]
port = "80"
if hostname.find(':') > 0:
addr, port = hostname.split(':')
else:
addr = hostname
port = int(port)
ip = socket.gethostbyname(addr)
print ip, port
self.destnation.connect(('127.0.0.1', 8080)) #可以填burpsuite的代理
data = "%s %s %s\r\n" % (self.headers['method'], self.headers['path'], self.headers['protocol'])
self.destnation.send(data + self.request) #发送请求
print data + self.request
#发送响应的结果
def renderto(self):
readsocket = [self.destnation]
while True:
data = ''
(rlist, wlist, elist) = select.select(readsocket, [], [], 3)
if rlist:
data = rlist[0].recv(BUFLEN)
if len(data) > 0:
self.source.send(data)#发送响应的结果
else:
break
# readsocket[0].close();
def run(self):
self.get_headers()
self.conn_destnation()
self.renderto()
class Server(object):
def __init__(self, host, port, handler=Proxy):
self.host = host
self.port = port
self.server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
self.server.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
self.server.bind((host, port))
self.server.listen(5)
self.handler = handler
def start(self):
while True:
try:
conn, addr = self.server.accept()
thread.start_new_thread(self.handler, (conn, addr))
except:
pass
if __name__ == '__main__':
s = Server('127.0.0.1', 6666) #这里写本地ip,监听的端口。
s.start()
关键部分我写了注释,还有代码不清楚格式是否会乱,我在文后以附件的形式贴出来吧
这次配合burpsuite来使用,使用方法:第90行(倒数第二行)写入之前用fiddler改包时手机wifi设置的代理,以及端口号,用来监听手机发出的http请求。第44行写burpsuite监听的地址,从手机上获取的http请求都会转发给burpsuite,burpsuite设置我也贴出来吧:
设置好后,只要运行代码,就可以实现代理服务。虽然想要代理直接连burp就好,但是这提供了一个可以使用PY代码进行一定程度的中间人操作的环境。
实现自动化exp
PS:看到这里就可以不看了,因无法提供app与蓝牙水表,以下内容多半无法看明白。。
之前实现了代理,那么现在就要开始改代码了,将代码改成漏洞app的漏洞利用工具。
因为这个不是通用型漏洞,漏洞利用工具也只能针对这个app,所以以下内容不存在干货,感兴趣的可以看下去。
思路:通过这个代理,将停止用水后“结账”请求中返还的金额替换为预扣款的金额,即返还所有金额。
还有个:对app的http请求分析的越透彻,exp就可能写的越简单思路越清晰。
漏洞利用程序方法众多,以下将按我自己的思路
从之前的fd测试可以知道,“用水”与“结账返还金额”是两个独立的http请求部分,根据常识“结账”肯定要在“用水”之后,那我们可以在app执行“用水”之后就马上向服务器请求伪造的“结账”http请求,因伪造的“结账”请求只是PC机跳过app与服务器交互,所以执行结账后不会影响蓝牙水表的供水。这种思路有个前提,就是能成功伪造“结账”请求,如果无法伪造,也可以在“结账”请求发出时拦截并改包,这样理论上是不会出问题的。
伪造“结账”需要在“用水”之后,那怎么判断“用水”请求?
用 if 判断数据的特征,简单明了。因为只是判断,不是拦截,所以只需要在conn_destnation函数的结尾,也就是destnation.send() 执行后,添加 if 判断即可,如果是“用水”便开始伪造“结账”。因为结账需要订单号,所以可以用re模块正则表达式匹配“用水”请求的特征时顺带取出订单号,见截图:
订单号正好包含在URL中,真方便。
用if判断不为空就可以刚刚获取的订单号进行伪造的“结账”了
伪造“结账”请求需要类似cookies的凭证,凭证存在header里,可以直接使用“用水”请求的header。
可是!!我发现用水、结账、查余额等一系列操作是使用的header中的凭证永不过期,若重登会给予新的凭证,但旧凭证依旧可以使用!所以就可以偷懒直接贴一份header使用。
有了凭证就可以为所欲为了,伪造“结账”请求除了订单号还需要知道预扣款,前面提到过,预扣款一般为10元,但有时候余额不足预扣款就不足10元,所以为了程序兼容性,还需要获取下预扣款。既然有了凭证为所欲为,那么可以再伪造下一个能让服务器返回预扣款的请求即可。
见上图:有了凭证,并且正好服务器返回的是json形式的,直接用Python 的 eval,再获取对应键值就行。
然后就是执行伪造的“结账”请求:
结束语
终于结束了,感谢看我这篇文章的人,更感谢从头到尾看完的人,不枉我写这篇文章,毕竟对于你们来说是没见过的app,这太抽象了,并且文章内容无聊,而且读代码远比写代码困难,遗憾的是不能提供实验环境。要是有人看完我会很开心,谢谢啦QAQ
PS:感觉今晚丞相的支持
更多Python视频、源码、资料加群531509025免费获取
转载至:https://bbs.ichunqiu.com/thread-38980-1-1.html
疫情在校学生之——用python对某校园热水服务app进行测试,实现自动免费用水(仅供参考)的更多相关文章
- Python建代理配合burp实现自动免费用水
i春秋作家:凉风有信 Hi , 我是凉风 半年不见了啊,我又回来了因为太菜都不好意思发文章了 0×00 目录 0×01 前言0×02 利用fd分析与实战0×03 Python+burp简易搭建代理服务 ...
- python读取ini配置文件的示例代码(仅供参考)
这篇文章主要介绍了python读取ini配置文件过程示范,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 安装 pip install configp ...
- Python爬虫实战三之实现山东大学无线网络掉线自动重连
综述 最近山大软件园校区QLSC_STU无线网掉线掉的厉害,连上之后平均十分钟左右掉线一次,很是让人心烦,还能不能愉快地上自习了?能忍吗?反正我是不能忍了,嗯,自己动手,丰衣足食!写个程序解决掉它! ...
- Python程序设计(第3版)PDF高清完整版免费下载|百度网盘
百度网盘:Python程序设计(第3版)PDF高清完整版免费下载 提取码:48u4 内容简介 本书是面向大学计算机科学专业第一门程的教材.本书以Python语言为工具,采用相当传统的方法,强调解决问题 ...
- python的高性能web应用的开发与测试实验
python的高性能web应用的开发与测试实验 tornado“同步和异步”网络IO模型实验 引言 python语言一直以开发效率高著称,被广泛地应用于自动化领域: 测试自动化 运维自动化 构建发布自 ...
- 使用python/casperjs编写终极爬虫-客户端App的抓取-ZOL技术频道
使用python/casperjs编写终极爬虫-客户端App的抓取-ZOL技术频道 使用python/casperjs编写终极爬虫-客户端App的抓取
- Python学习系列:PyCharm CE 安装与测试
开坑啦开坑啦~最近比赛要用Python了,开始强行学习. Mac下PyCharm CE 安装 先去百度PyCharm,一个很好用IDE,下载免费版的就够用啦: https://www.jetbrain ...
- Python接口测试实战3(下)- unittest测试框架
如有任何学习问题,可以添加作者微信:lockingfree 课程目录 Python接口测试实战1(上)- 接口测试理论 Python接口测试实战1(下)- 接口测试工具的使用 Python接口测试实战 ...
- Appium+python自动化20-查看iOS上app元素属性
前言 学UI自动化首先就是定位页面元素,玩过android版的appium小伙伴应该都知道,appium的windows版自带的Inspector可以定位app上的元素 Mac版的appium1.6的 ...
随机推荐
- 使用 VS Code 撰写 Markdown 文档
众所周知, VS Code 是微软和社区一起开发的一款很优秀的高级代码编辑器.它不仅可以写出一手好代码,还能写出一篇好文章.利用 Markdown 就可以写出一篇排版美观的技术文章了. 而 Markd ...
- Vite2+Vue3+ts的eslint设置踩坑
目录 新项目了 Vite搭建 eslint 先安装eslint 创建.eslintrc.js 引入规则 Airbnb 配合prettier 对ts的支持 .eslintrc.js 在页面上查看esli ...
- GraphScope v0.12.0 版本发布
GraphScope 每月进行常规版本的迭代与发布,GraphScope v0.12.0 全新版本在四月如期而至.v0.12.0 为交互式图查询 GAIA 引入全新的 IR 层以及新增 Giraph ...
- hashMap、ConcurrentHashMap、hashTable、TreeMap、LinkedHashMap用法区别详解
Java集合中设计了一个接口Java.util.Map,它实现类中hashMap.hashTable.TreeMap.ConcurrentHashMap.LinkedHashMap. Map类型的集合 ...
- RAID5加热备盘
RAID 5加热备盘 RAID 10磁盘阵列中最多允许50%的硬盘设备发生故障,但是存在这样一种极端情况,即同一RAID 1磁盘阵列中的硬盘设备若全部损坏,也会导致数据丢失.换句话说,在RAID 10 ...
- python学习-Day17
目录 今日内容详细 生成器对象(自定义迭代器) 小总结 自定义range方法 通过生成器模拟range方法 先以两个参数的range方法为例 针对一个参数情况 针对三个参数情况 自定义的range方法 ...
- 解决学校在线评测系统不支持C++11的问题
如图,我们老师搞的这个评测系统它不支持C++11.但分析错误信息可知GCC本身版本是支持C++11的,只不过没开开.平时的时候我们可以对"g++"后使用"-std=c++ ...
- Python3获取5000个元素的单字符表
技术背景 此前考虑过一个问题,有没有办法获取到python里面所有定义好的单字符的表,比如我们获取5000个不一样的单字符,但是常用的chr(number)的方法里面包含了太多的非字母条目,比如缩进换 ...
- Mqtt入门:在线调试连接阿里云
近期课设需要做个东西,我想要做个上位机更好的显示. 但是一开始学习一样东西,听没头绪的,不知道从哪里入手,尝试过去B站找视频看,但是感觉视频讲的都是基础的东西,不是说人家up主讲的不好,只是对于入门, ...
- vue大型电商项目尚品汇(前台篇)day01
学完vue2还是决定先做一个比较经典,也比较大的项目来练练手好一点,vue3的知识不用那么着急,先把vue2用熟练了,vue3随时都能学. 这个项目确实很经典包含了登录注册.购物车电商网站该有的都有, ...