前言

本文只是对某校园热水服务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元,<img>假装有水表照片.jpg</img>
看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 selectBUFLEN = 8192class Proxy(object):def __init__(self, conn, addr):self.source = connself.request = ""self.headers = {}self.destnation = socket.socket(socket.AF_INET, socket.SOCK_STREAM)self.run()#用来构造headerdef 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 = hostnameport = int(port)ip = socket.gethostbyname(addr)print ip, portself.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 = hostself.port = portself.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 = handlerdef start(self):while True:try:conn, addr = self.server.accept()thread.start_new_thread(self.handler, (conn, addr))except:passif __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进行测试,实现自动免费用水(仅供参考)相关推荐

  1. 高考志愿填报APP靠谱吗?大数据仅供参考不能依赖

    6月24日,在众多考生的等待中,陕西2019年高考分数线公布.分数线公布后,对于考生和家长来说,最重要的事情就是填报高考志愿了.针对这种需求,一些指导高考志愿填报的APP应运而生.今天南京软件开发公司 ...

  2. springboot+mysql+基于Android的校园综合服务App平台的设计 毕业设计-附源码181042

    摘  要 随着现在网络的快速发展,网络的应用在各行各业当中它很快融入到了许多学校的眼球之中,他们利用网络来做这个校园评教的网站,随之就产生了"校园综合服务App平台 ",这样就让用 ...

  3. 基于Android的校园综合服务App平台毕业设计源码181042

    摘  要 随着现在网络的快速发展,网络的应用在各行各业当中它很快融入到了许多学校的眼球之中,他们利用网络来做这个校园评教的网站,随之就产生了"校园综合服务App平台 ",这样就让用 ...

  4. springboot基于Android的校园综合服务App平台的设计毕业设计源码181040

    摘  要 随着现在网络的快速发展,网络的应用在各行各业当中它很快融入到了许多学校的眼球之中,他们利用网络来做这个校园评教的网站,随之就产生了"校园综合服务App平台 ",这样就让用 ...

  5. (附源码)基于Android的校园综合服务App平台的设计 毕业设计181042

    摘 要 随着现在网络的快速发展,网络的应用在各行各业当中它很快融入到了许多学校的眼球之中,他们利用网络来做这个校园评教的网站,随之就产生了"校园综合服务App平台 ",这样就让用户 ...

  6. python自动化运维脚本(仅供参考)

    1.生成磁盘使用情况的日志文件 #!/usr/bin/env python#!coding=utf-8import timeimport osnew_time = time.strftime('%Y- ...

  7. GrowingIO服务端开发面试、以及对测试开发、趣头条的一点个人看法。仅供参考

    1.简历是一位老哥推荐的,都是网易在实习的,他也知道我后来转Scala了,刚好这家公司是全Scala公司,所以就问了有没有兴趣,此时我在趣头条实习,干的是测试开发,所以也想试试. 我大概是去年2017 ...

  8. 黑莓BlackBerry App World的应用数据(仅供参考)

    早晨花了几分钟查了一下黑莓BlackBerry App World,用Excel做了个简单的加法,得到的数据如下: BlackBerry App World上面有29879个应用,3870个游戏,13 ...

  9. Python学习路线推荐 仅供参考

    Python基础 web开发 网络爬虫 自动化运维 机器学习 相关数学知识:高数.线性代数.概率论

最新文章

  1. 广东深圳计算机学校排名2015年,2015年深圳小学综合排名 各区小学最新排名
  2. 银行java多线程例子_Java 多线程 之 银行ATM实例
  3. apply,call,bind区别
  4. mysql的用户和密码
  5. VMware VI4的界面和操作介绍
  6. vscode新建html中文乱码,vscode中html中文乱码 怎么办
  7. 基于JAVA+SpringMVC+MYSQL的网上选课系统
  8. 设计模式学习笔记(十八:模板方法模式)
  9. 融合·生态·实践 中国卫生信息大会新华三再秀领航者实力
  10. IntelliJ IDEA 新版本又来了,修复严重 bug!
  11. 视频教程-思科设备管理(CCNA魔鬼训练营系列)-思科认证
  12. 交换机常用配置命令(华为)
  13. C#中属性PropertyInfo的setvalue方法
  14. 数据结构 09-链表概念及常见链表结构
  15. The Apostle's Creed
  16. OpenGL学习---高级光照---法线贴图
  17. AI三大主义:符号主义、联结主义、行为主义
  18. 将HTML5封装成android应用APK文件的几种方法
  19. java8 GC日志分析
  20. maven lastUpdated 文件清理脚本

热门文章

  1. Android解码视频每一帧,Android 获取视频缩略图(获取视频每帧数据)的优化方案
  2. python如何增加字符串_在python中增加字符的方法
  3. 解决谷歌浏览器不显示翻译此页按钮(网页自动翻译)
  4. 优思学院|利用Excel进行双样本t检验
  5. @Transactional子事务单独提交
  6. 山东大学软件学院2022数据库期末考试回忆版
  7. 让顶部系统状态栏跟随APP背景色
  8. 推荐顶级色彩网站-灵感,调色板,工具和其他色彩资源
  9. Jeesite4本地及服务器上传文件、图片详解
  10. 自己写的忽略大小写查找字符串的子串的函数