吾爱破解 - LCG - LSG |安卓破解|病毒分析|www.52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 2093|回复: 9
收起左侧

[Android 原创] 某视频app图片,视频上传分析

  [复制链接]
xiqing 发表于 2024-3-7 22:03
本帖最后由 xiqing 于 2024-3-8 16:06 编辑

[md]# 先抓包看上传流程如图


大致上传流程

  1. 图1用自己cookie 或者token拿到authorization  access_key_id   secret_access_key,等参数
  2. 图2   通过图1返回的参数请求地址 拿到一个图片地址
  3. 图3 请求图2返回地址进行上传

目标

图二有个Signature经测试是上传所需要的必须签名,下面我们来看下是怎么生成的。

拖进jadx查看代码

搜索关键字AWS4-HMAC-SHA256找到关键代码

    public Map<String, String> getHeaders() {
        ChangeQuickRedirect changeQuickRedirect2 = changeQuickRedirect;
        if (PatchProxy.isEnable(changeQuickRedirect2)) {
            PatchProxyResult proxy = PatchProxy.proxy(PatchProxy.getEmptyArgs(), this, changeQuickRedirect2, false, 4);
            if (proxy.isSupported) {
                return (Map) proxy.result;
            }
        }
        String calculateSignature = calculateSignature(prepareStringToSign(prepareCanonicalRequest()));
        if (calculateSignature == null) {
            if (this.debug) {
                System.out.println(O.C("##Signature:\n", calculateSignature));
                return null;
            }
            return null;
        }
        HashMap hashMap = new HashMap(0);
        for (Map.Entry<String, String> entry : this.awsHeaders.entrySet()) {
            hashMap.put(entry.getKey(), entry.getValue());
        }
        hashMap.put("Authorization", buildAuthorizationString(calculateSignature));
        if (this.debug) {
            System.out.println(O.C("##Signature:\n", calculateSignature));
            System.out.println("##Header:");
            for (Map.Entry entry2 : hashMap.entrySet()) {
                PrintStream printStream = System.out;
                new StringBuilder();
                printStream.println(O.C((String) entry2.getKey(), " = ", (String) entry2.getValue()));
            }
            System.out.println("================================");
        }
        return hashMap;
    }

    private String calculateSignature(String str) {
        ChangeQuickRedirect changeQuickRedirect2 = changeQuickRedirect;
        if (PatchProxy.isEnable(changeQuickRedirect2)) {
            PatchProxyResult proxy = PatchProxy.proxy(new Object[]{str}, this, changeQuickRedirect2, false, 3);
            if (proxy.isSupported) {
                return (String) proxy.result;
            }
        }
        try {
            return bytesToHex(SHA256UseMac(getSignatureKey(this.secretAccessKey, this.currentDate, this.regionName, this.serviceName), str));
        } catch (Exception unused) {
            return null;
        }
    }

    private String prepareStringToSign(String str) {
        ChangeQuickRedirect changeQuickRedirect2 = changeQuickRedirect;
        if (PatchProxy.isEnable(changeQuickRedirect2)) {
            PatchProxyResult proxy = PatchProxy.proxy(new Object[]{str}, this, changeQuickRedirect2, false, 2);
            if (proxy.isSupported) {
                return (String) proxy.result;
            }
        }
        new StringBuilder();
        String C = O.C("AWS4-HMAC-SHA256\n", this.xAmzDate, "\n");
        new StringBuilder();
        String C2 = O.C(C, this.currentDate, "/", this.regionName, "/", this.serviceName, "/aws4_request", "\n");
        new StringBuilder();
        String C3 = O.C(C2, generateHex(str));
        if (this.debug) {
            System.out.println(O.C("##String to sign:\n", C3));
        }
        return C3;
    }

    private String calculateSignature(String str) {
        ChangeQuickRedirect changeQuickRedirect2 = changeQuickRedirect;
        if (PatchProxy.isEnable(changeQuickRedirect2)) {
            PatchProxyResult proxy = PatchProxy.proxy(new Object[]{str}, this, changeQuickRedirect2, false, 3);
            if (proxy.isSupported) {
                return (String) proxy.result;
            }
        }
        try {
            return bytesToHex(SHA256UseMac(getSignatureKey(this.secretAccessKey, this.currentDate, this.regionName, this.serviceName), str));
        } catch (Exception unused) {
            return null;
        }
    }

通过查看代码可以了解流程
prepareCanonicalRequest方法用于构建规范请求字符串。
prepareStringToSign方法用于生成待签名字符串。
calculateSignature方法内部调用了SHA256UseMac
getHeaders方法最终将生成的签名加入到请求头中,并返回。

总结

1准备签名信息:包括请求方法(GET、POST等)、请求URI、查询字符串参数、请求头部信息(如Host、x-amz-date等),以及请求体(对于POST请求)。
2创建规范请求:将上述信息按照AWS的规定格式组合成一个规范请求字符串。
3构造待签名字符串:这一步涉及到将规范请求的哈希值、请求日期、服务区域、服务名称等信息按照特定格式组合,形成待签名字符串。
4计算签名:
使用AWS的密钥生成算法(HMAC-SHA256)计算派生签名密钥。
使用派生的签名密钥对待签名字符串进行签名,生成最终的签名值。
添加签名到请求:将生成的签名值添加到请求的授权头部或查询字符串参数中,完成请求的签名过程。

结果

python复现一下

侵权删!


免费评分

参与人数 4威望 +1 吾爱币 +21 热心值 +4 收起 理由
interested + 1 我很赞同!
daihailiang2024 + 1 谢谢@Thanks!
skiss + 1 + 1 谢谢@Thanks!
正己 + 1 + 20 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

 楼主| xiqing 发表于 2024-3-10 16:26
本帖最后由 xiqing 于 2024-3-10 16:27 编辑
bhwxha 发表于 2024-3-10 16:22
有点奇怪,第一步请求拿key,我看请求头里面有X-Medusa等签名请求头,这个不需要提供吗?
他家如果获取重 ...

X-Medusa 之前已经逆过了, 这个文章是分析核心是的图片上传  ,签名是附带 ,图片上传和视频上传是一样的 可以做到自动发视频,发文图。
bhwxha 发表于 2024-3-10 16:22
有点奇怪,第一步请求拿key,我看请求头里面有X-Medusa等签名请求头,这个不需要提供吗?
他家如果获取重要数据,这个签名请求头是必须的;
而且分析这个图片上传有什么用吗?
sadbye2017 发表于 2024-3-10 17:24
amouer 发表于 2024-3-11 10:01
谢谢分享
月清晖 发表于 2024-3-11 10:51
挺厉害的,如果有受害者练习下可能更容易理解

免费评分

参与人数 1吾爱币 +1 热心值 +1 收起 理由
xiqing + 1 + 1 热心回复!

查看全部评分

zstyyds 发表于 2024-3-11 22:46
mark学习一下
qq2380 发表于 2024-3-12 23:11
感谢分享!!!
prince小君 发表于 2024-3-13 18:54
感谢楼主分享
sanxia2001 发表于 2024-3-19 13:33
学习一下,很有用
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则 警告:本版块禁止灌水或回复与主题无关内容,违者重罚!

快速回复 收藏帖子 返回列表 搜索

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-4-29 08:53

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表