V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
strikehht
V2EX  ›  问与答

能否通过文件特征码欺骗百度云客户端来达到分享文件?

  •  
  •   strikehht · 2014-09-12 11:37:17 +08:00 via iPad · 9982 次点击
    这是一个创建于 3720 天前的主题,其中的信息可能已经有所发展或是发生改变。
    RT,百度云客户端在上传文件时应该是先校验文件特征码,看云端是否有匹配,若有则“极速妙传”,若没有则上传新文件。能否在这一步做手脚,直接给百度云自己需要的文件的特征码来获得该文件的“所有权”?这样,不管分享链接如何也可以保证能够下载到资源?个人感觉理论上肯定是可行的。实际如何操作有可能吗?
    37 条回复    2015-07-27 10:26:20 +08:00
    imn1
        1
    imn1  
       2014-09-12 12:10:29 +08:00
    不太明白
    上传可以提交特征码,但下载时特征码应该是服务器端从数据库提取的,不涉及客户端提交的问题
    takato
        2
    takato  
       2014-09-12 12:16:08 +08:00
    从设计上讲,这个接口肯定放在应用内部,除非你能知道他们内部通信的协议来模拟,否则不太可能。
    sandotsan
        3
    sandotsan  
       2014-09-12 12:22:13 +08:00
    理论上可行,不过万一百度做特征码时加盐了,就没搞了,不可能你能搞到你想要的文件+盐后的特征码撒。
    sandotsan
        4
    sandotsan  
       2014-09-12 12:30:34 +08:00
    又想到,如果百度仅仅是做文件特征码的对比,那么协议破解的话,可以穷举文件
    如果baidu除开文件特征码,还对比了文件的前3个字节或者前5个字节,那基本就没搞了,
    nybux
        5
    nybux  
       2014-09-12 12:47:12 +08:00
    这个思路非常不错
    lvye
        6
    lvye  
       2014-09-12 12:51:40 +08:00
    通过md5修改器我觉得应该可以,http://www.97world.com/archives/701
    ZzFoo
        7
    ZzFoo  
       2014-09-12 12:52:50 +08:00
    流程应该是:

    客户端扫描要上传的文件——生成特征码——把特征码传递给百度云服务器——服务器对比已有特征码——获得文件所有权

    如果是这样的话,只要能截取生成的特征码并且修改成一个已知的特征码。就能分享一个文件,而不用生成一个分享的链接,也就不怕被和谐了...
    ksc010
        8
    ksc010  
       2014-09-12 12:56:38 +08:00
    即时不用找这种欺骗的方式
    你和别人分享“同一份文件”的链接应该也不是一样的啊
    oott123
        9
    oott123  
       2014-09-12 13:12:35 +08:00 via Android
    用百度网盘的 API 吧,有秒传接口。
    你需要知道这个文件的哈希值,好像还要知道大小和前512字节。
    秒传上传之后,就能下载了…
    csx163
        10
    csx163  
       2014-09-12 14:07:44 +08:00
    记得qq邮箱被此人搞出个秒传,可以去请教下 hloli.net
    strikehht
        11
    strikehht  
    OP
       2014-09-12 14:08:21 +08:00 via iPad
    「流程应该是:

    客户端扫描要上传的文件——生成特征码——把特征码传递给百度云服务器——服务器对比已有特征码——获得文件所有权

    如果是这样的话,只要能截取生成的特征码并且修改成一个已知的特征码。就能分享一个文件,而不用生成一个分享的链接,也就不怕被和谐了...』


    恩,我想的就是这样,可惜只知道理论完全不会实践,不知道有没哪个高人可以验证一下。。
    anheiyouxia
        12
    anheiyouxia  
       2014-09-12 14:31:14 +08:00 via Android
    @oott123 百度api有返回这个哈希值给你的,你用api上传后,会返回一个文件大小和哈希值给你
    akfish
        13
    akfish  
       2014-09-12 15:00:24 +08:00
    简单的分析下概率就知道可行性有多低了。
    文件的特征码本质上就是hash,hash空间是相当稀疏的。
    以git用40位sha1编码文件对象为例,不考虑碰撞的话,整个hash空间能编码16^40=1.46*10^48个文件。
    全球人口不过才7*10^9,就算每人上传一个hash完全不同的文件,也还连hash空间的零头都占不到。

    想用hash碰撞到任意一个文件?除非你恰好有一份一模一样的文件,否则别想了。不过你都有一样的文件了,还碰撞神马。
    dorentus
        14
    dorentus  
       2014-09-12 16:04:54 +08:00   ❤️ 1
    @akfish 楼主想做的似乎不是去碰撞试。而是这样(假如我想分享一个文件给别人):

    1. 我先通过某些方式获得百度云内部使用的、该文件的特征数据(文件大小、哈希值之类)
    2. 我把这个文件的特征数据给你
    3. 你拿到这个文件的特征数据之后,通过某些方式欺骗百度的客户端,把这个文件添加到自己的账号下

    如果像上面说的百度是直接提供了那些接口的话,倒是可以简单实现……
    strikehht
        15
    strikehht  
    OP
       2014-09-12 16:22:37 +08:00 via iPad
    @dorentus 正解
    ayang23
        16
    ayang23  
       2014-09-12 17:08:39 +08:00
    @dorentus
    @strikehht 逆向一下客户端不就有了
    zmj1316
        17
    zmj1316  
       2014-09-12 17:16:00 +08:00
    当初115封分享的时候大家不就是这么干的么
    ZzFoo
        18
    ZzFoo  
       2014-09-12 17:42:12 +08:00
    这是我用百度云上传时抓取到的request。
    POST /api/rapidupload?clienttype=8&devuid=BDIMXV2%2DO%5F328CCC7C9BAE4DC8B3C1D118284819FE%2DC%5F0%2DD%5F101118PBN406X7GJGSJL%2DM%5F60EB69B81D44%2DV%5F10E697A0&channel=00000000000000000000000000000000&version=4.5.0.7&logid=JwAxADQAMQAwADUAMQAyADAAMgAxACwAMQA5ADIALgAxADYAOAAuADEALgAzACwANQA2ADUA%0AJwA%3D HTTP/1.1..Host: pan.baidu.com..Accept: */*..Cookie:BDUSS=TZ5SHd0TEhQSjlyRVZhWklyYkstdk1HbWpmQmlrQVQ2ci1vSkJXLTRlSGxQVHBVQVFBQUFBJCQAAAAAAAAAAAEAAADP5xAXxcLR9LnitcTDqAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOWwElTlsB..User-Agent: netdisk;4.5.0.7;PC;PC-Windows;6.1.7601;WindowsBaiduYunGuanJia..Content-Length: 187..Content-Type: application/x-www-form-urlencoded....path=/Friends.S01E01.UNCUT.DVDRip.XviD-SAiNTS.avi&content-length=245096448&content-md5=f50c85023b19adca96996d77ac640ba8&slice-md5=53aff60319468c7fcdd1f166073ab92e&content-crc32=3088105606

    所以每次只要把除了cookie之外的request告诉别人是不是就行了..
    ZzFoo
        19
    ZzFoo  
       2014-09-12 17:45:48 +08:00
    有没有比较简单的方法模拟一个post请求呢。。。。
    ZzFoo
        20
    ZzFoo  
       2014-09-12 18:29:39 +08:00
    上传成功了。。
    regmach
        21
    regmach  
       2014-09-12 18:53:07 +08:00
    @ZzFoo 然后?
    uuhp2009
        22
    uuhp2009  
       2014-09-12 19:22:11 +08:00
    @ZzFoo
    @strikehht
    然后你们俩想干啥啊 有什么用
    ZzFoo
        23
    ZzFoo  
       2014-09-12 19:23:46 +08:00
    @regmach 然后就可以不需要通过分享链接来分享文件了
    regmach
        24
    regmach  
       2014-09-12 19:27:28 +08:00
    @ZzFoo nice....
    ZzFoo
        25
    ZzFoo  
       2014-09-12 19:28:56 +08:00
    @uuhp2009 已经说的很清楚了吧..
    Automan
        26
    Automan  
       2014-09-12 20:27:50 +08:00
    @akfish MD5的文件哈希还是很容易碰撞的,现成的工具很多
    akfish
        27
    akfish  
       2014-09-12 20:34:25 +08:00
    @Automan 那不同,前提是你已知要碰撞的文件,然后找个hash一样的文件,而不是随便猜一个已经被用到的hash。
    Anyway,之前也没理解请lz的意思。
    takato
        28
    takato  
       2014-09-12 20:42:02 +08:00
    @ZzFoo 研究的方向是不是应该反一下?因为上传的文件的MD5我们随时都可以算出来,你应该研究一下下载API里面都需要些什么,我把Parameter都抓下来了:

    xcode:3d15375f303751525d53953779032e191f4f5f9bc8fd50d6837047dfb5e85c39
    fid:369186934-250528-648359378707291
    time:1410525386
    sign:FDTAXER-DCb740ccc5511e5e8fedcff06b081203-YN48O3OWZ2ZsZvN/nI9rLTvtdqQ=
    to:cb
    fm:Nin,B,T,t
    sta_dx:25
    sta_cs:20
    sta_ft:dmg
    sta_ct:1
    newver:1
    newfm:1
    flow_ver:3
    expires:8h
    rt:sh
    r:346770198
    mlogid:4234836019
    vuk:-
    vbdid:3385041692
    fn:Lyn153.dmg
    wshc_tag:0
    wsts_tag:5412e8ca
    wsid_tag:da5197fd
    wsiphost:ipdbm

    看起来似乎可行的可能性不大。。。
    takato
        29
    takato  
       2014-09-12 20:44:28 +08:00
    @ZzFoo Post请求分分钟就能造出来,比如chrome下的插件Postman,但是问题在于这些参数你弄不懂是啥意思。。。甚至有些参数你很难伪造。

    试想一下,如果伪造很容易,百度不就会被直接盗链么?
    akfish
        30
    akfish  
       2014-09-12 20:58:59 +08:00
    @ZzFoo
    @takato

    从这个请求里看参数的含义很显而易见吧,并没什么防护措施。
    URL query string里就是正常的客户端版本信息、设备id和登陆信息
    Post payload里都是文件的信息:
    * path 网盘上的存储路径
    * content-length 文件长度
    * content-md5 整个文件的md5
    * slice-md5 文件里某块的md5
    * content-crc32 文件的crc32

    所以基本上就是伪造下客户端的登陆请求,只有payload里后4个参数是需要分享的。
    takato
        31
    takato  
       2014-09-12 21:35:12 +08:00
    @akfish 请注意,我们要的是调用下载,那么要调用我的那个API,而不是上传API,那么我问你,那个sign你如何确定?显然这里是个签名信息。还有一些其他字段的含义呢?
    akfish
        32
    akfish  
       2014-09-12 21:38:48 +08:00
    @takato 你显然没搞清楚这个漏洞的利用途径,我伪造一次上传,在我的网盘里就会有那个文件,然后我正常的从我的网盘上把那个文件拖下来就行了。
    strikehht
        33
    strikehht  
    OP
       2014-09-12 23:00:31 +08:00 via iPhone
    感谢楼上各位达人~
    该方法还是不要过于广泛传播为妙。
    此帖应尽快沉没,以防不测
    ProfFan
        34
    ProfFan  
       2014-09-13 02:54:42 +08:00
    看起来很不错啊。。。可惜magnet用的是sha-1。。。
    uuhp2009
        35
    uuhp2009  
       2014-09-13 10:00:14 +08:00
    @strikehht lz 为啥要沉没啊。自己想做个网站独吞。其实我早就想到了没有做的。让给你算了
    lentrody
        36
    lentrody  
       2015-07-27 10:14:05 +08:00
    刚看到个类似115提取式的东西
    C2A2BAFCF86548AC5758916B3E2955C6#D220DCCA4EC34E7E9A413B7391740A85#463584555#COMIC Shingeki 2015-07.rar
    前部分有两段HASH,第一段是整个文件的MD5,感觉像是用在百度盘之类的地方,但找不到有相关工具,有没有人知道详情?
    lentrody
        37
    lentrody  
       2015-07-27 10:26:20 +08:00
    哈找到了,http://jixun.org/p/3232 也就跟楼主所说的东西一样了
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3921 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 33ms · UTC 10:24 · PVG 18:24 · LAX 02:24 · JFK 05:24
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.