0x2 微信API接口概述

一、獲取接口調用憑據

  1. 功能描述

image

  1. 淺談獲取access_token
    獲取接口調用憑證實質就是獲取access_token。在微信接口開發中,許多服務的使用都離不開Access Token,Access Token相當于打開這些服務的鑰匙,正常情況下會在7200秒內失效,重復獲取將導致上次獲取的Token失效,本文將首先介紹如何獲取Access Token。按微信官方的說明,access_token是公眾號的全局唯一接口調用憑據,公眾號調用各接口時都需使用access_token。開發者需要進行妥善保存。access_token的存儲至少要保留512個字符空間。access_token的有效期目前為2個小時,需定時刷新,重復獲取將導致上次獲取的access_token失效。

  2. 公眾平臺的API調用所需的access_token的使用及生成方式說明

二、如何獲取access_token值?

  1. tips注意

  2. 獲取Access Token
    獲取Access Token接口的網址如下:

    https請求方式: GET
    https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=[APPID]&secret=[APPSECRET]

    給師傅們看下在一些站點的網頁源代碼泄露的appid和appsecret參數值,長什么樣子。

image

  1. 請求參數
    我們需要使用上面的獲取Access Token接口的網址,然后分別填入上面的兩個appid和appsecret參數,如下詳情:

    屬性 類型 必填 說明
    grant_type string 填寫 client_credential
    appid string 小程序唯一憑證,即 AppID,可在「微信公眾平臺 – 設置 – 開發設置」頁中獲得。(需要已經成為開發者,且帳號沒有異常狀態)
    secret string 小程序唯一憑證密鑰,即 AppSecret,獲取方式同 appid
  2. 返回參數
    成功之后,師傅們就可以看到GET傳參請求成功的回顯結果,回顯得到的參數如下:

    屬性 類型 說明
    access_token string 獲取到的憑證
    expires_in number 憑證有效時間,單位:秒。目前是7200秒之內的值。
  3. 返回數據示例
    正常情況下,微信會返回下述JSON數據包給公眾號:

    {
       "access_token":"ACCESS_TOKEN",
       "expires_in":7200
    }

image

錯誤時微信會返回錯誤碼信息,JSON數據包實示例如下(該示例為AppID無效錯誤):

   {
       "errcode":40013,
       "errmsg":"invalid appid"
   }

image

  1. 常見的錯誤碼

    錯誤碼 錯誤描述 解決方案
    -1 system error 系統繁忙,此時請開發者稍候再試
    40001 invalid credential access_token isinvalid or not latest 獲取 access_token 時 AppSecret 錯誤,或者 access_token 無效。請開發者認真比對 AppSecret 的正確性,或查看是否正在為恰當的公眾號調用接口
    40013 invalid appid 不合法的 AppID ,請開發者檢查 AppID 的正確性,避免異常字符,注意大小寫
    40002 invalid grant_type 不合法的憑證類型
    40125 不合法的 secret 請檢查 secret 的正確性,避免異常字符,注意大小寫
    40164 調用接口的IP地址不在白名單中 請在接口IP白名單中進行設置
    41004 appsecret missing 缺少 secret 參數
    50004 禁止使用 token 接口
    50007 賬號已凍結
    61024 第三方平臺 API 需要使用第三方平臺專用 token
    40243 AppSecret已被凍結,請登錄小程序平臺解凍后再次調用

image

三、實現方法

下面的代碼我們封裝了企業訂閱號、媒體訂閱號、個人訂閱號、測試號的憑證調用。同時使用的Senparc.WeiXin SDK接口直接獲取憑證的方式,大家可供參考,得到的憑證我是存在了數據庫中,同時支持多公眾號統一維護。

List<KeyValuePair> parmeters = new List<KeyValuePair>
{
    new KeyValuePair(WeixinOfficialAccountTable.FieldDeleteMark, 0)
};
var listOfficialAccount = BaseEntity.GetList(RDIFrameworkService.Instance.WeixinBasicService.GetOfficialAccountDTByValues(parmeters));
if(listOfficialAccount != null && listOfficialAccount.Count() > 0)
{
    foreach(WeixinOfficialAccountEntity entity in listOfficialAccount)
    {
        try
        {
            if(entity.Category == (int)WeChatSubscriberEnum.EnterpriseSubscriber)
            {
                if(!string.IsNullOrEmpty(entity.AppId) && !string.IsNullOrEmpty(entity.AppSecret))
                {
                    //方法一:使用Senparc.WeiXin SDK的方法
                    entity.AccessToken = Senparc.Weixin.QY.CommonAPIs.CommonApi.GetToken(entity.AppId, entity.AppSecret).access_token;
                    //方式二,直接調用微信的接口方法
                    //var url = string.Format("https://api.weixin.qq.com/cgi-bin/token?grant_type={0}&appid={1}&secret={2}", "client_credential".AsUrlData(), entity.AppId.AsUrlData(), entity.AppSecret.AsUrlData());
                    //AccessTokenResult result = Get.GetJson(url);
                    //entity.AccessToken = result.access_token;
                    entity.ModifiedOn = DateTime.Now;
                    returnValue += RDIFrameworkService.Instance.WeixinBasicService.UpdateOfficialAccount(entity);
                }
            }
            else
            {
                if(!string.IsNullOrEmpty(entity.AppId) && !string.IsNullOrEmpty(entity.AppSecret))
                {
                    //方法一:使用Senparc.WeiXin SDK的方法
                    entity.AccessToken = Senparc.Weixin.MP.CommonAPIs.CommonApi.GetToken(entity.AppId, entity.AppSecret).access_token;
                    //方式二,直接調用微信的接口方法
                    //var url = string.Format("https://api.weixin.qq.com/cgi-bin/token?grant_type={0}&appid={1}&secret={2}", "client_credential".AsUrlData(), entity.AppId.AsUrlData(), entity.AppSecret.AsUrlData());
                    //AccessTokenResult result = Get.GetJson(url);
                    //entity.AccessToken = result.access_token;
                    entity.ModifiedOn = DateTime.Now;
                    returnValue += RDIFrameworkService.Instance.WeixinBasicService.UpdateOfficialAccount(entity);
                }
            }
        }
        catch(Exception ex)
        {
        }
    }
}

參考文章如下:

四、獲取微信服務器IP地址

1. 淺談

  1. 如果公眾號基于安全等考慮,需要獲知微信服務器的IP地址列表,以便進行相關限制,可以通過該接口獲得微信服務器IP地址列表或者IP網段信息。
  2. 由于出口IP及入口IP可能存在變動,建議用戶每天請求接口1次,以便于及時更新IP列表。為了避免造成單點故障,強烈建議用戶不要長期使用舊的IP列表作為api.weixin.qq.com的訪問入口。

2. 獲取微信API接口 IP地址

使用固定IP訪問api.weixin.qq.com時,請開發者注意運營商適配,跨運營商訪問可能會存在高峰期丟包問題。

image

API接口IP即api.weixin.qq.com的解析地址,由開發者調用微信側的接入IP接口調用請求說明。

http請求方式: GET
https://api.weixin.qq.com/cgi-bin/get_api_domain_ip?access_token=ACCESS_TOKEN

參數說明

參數 是否必須 說明
access_token 公眾號的access_token

返回說明

正常情況下,微信會返回下述JSON數據包給公眾號:

{
    "ip_list":[
        "IP1",
        "IP2",
        "IP3",
        "IP4",
        ......
    ]
}

image

參數說明

錯誤時微信會返回錯誤碼等信息,JSON數據包示例如下(該示例為AppID無效錯誤):

{
    "errcode":40013,
    "errmsg":"invalid appid rid: 66dbb72e-7529f8ad-47f1afb9"
}

image

2. 獲取微信callback IP地址

請開發者確保防火墻、ddos攻擊白名單IP內已添加回調IP,以避免誤攔截的情況出現。

callback IP即微信調用開發者服務器所使用的出口IP接口調用請求說明。

http請求方式: GET
https://api.weixin.qq.com/cgi-bin/getcallbackip?access_token=ACCESS_TOKEN

參數說明

參數 是否必須 說明
access_token 公眾號的access_token

五、在線測試接口的地址

下面這個在線的測試接口的地址是微信公眾和小程序的官方測試使用的網址,相比上面的需要記住GET傳參的url,下面的在線的測試接口的地址更加方便,且功能點也全。

https://mp.weixin.qq.com/debug

image

比如我之前挖edu找到的這個body請求包,里面有appid和appsecret參數,那么就可以直接放到上面的在線網址使用了。

image

image

0x4 某EDU站點實測

一、信息收集+資產收集

針對于去找微信API接口相關APPid和appSecret泄露,然后可以成功獲取access_token值的目標資產,這里簡單給師傅們演示下使用FOFA進行相關資產和目標的檢索。

FOFA使用下面的檢索語法如下:

(body="appId"&& body="appSecret")&& body="access_token"

使用fofa檢索,可以看到可以匹配到127個獨立的IP,當然這個語法不是固定的,師傅們可以去自己完善相關語法,有好的語法的師傅們也可以在評論區進行相互交流學習。

image

然后在fofa里面找到了一個edu的站點,后面也是對該edu的站點進行一個測試。

image

二、滲透測試

通過上面對fofa的測繪,然后找到的上面的這個edu的站點,像這樣的直接右擊網頁源代碼,然后在源代碼里面檢索appid參數,可以看到下面的源代碼中找到了相關參數。

image

然后就是先獲取接口調用憑證(access_token)。

https請求方式: GET
https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=[APPID]&secret=[APPSECRET]

使用上面的參數直接調用,發現顯示40164狀態碼,意思是調用接口的IP地址不在白名單中,那就說明這個appid存在,但是被限制了。

image

這個時候我就在想了,既然這個edu的站點存在appid和appSecret參數值泄露,且這個是微信小程序的相關API接口,那么有沒有可能這個學校的微信小程序可以找到別的appid參數,且沒有做限制,畢竟不同的小程序,做的防護也不一樣。

我這里直接使用微信小程序去挨個找這個學校的微信小程序的接口,看看有沒有接口可以找到相關泄露appid和appSecret值的接口,然后去獲取access_token值。

image

后面在小程序拿到這個GET傳參的接口,/mobile/serve/wechat/getConfig,里面可以獲取到一個微信小程序的appid和appSecret值。

image

然后直接再次使用上面的獲取接口調用憑證(access_token)

https請求方式:GET
https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=[APPID]&secret=[APPSECRET]
  1. 這里成功獲取到了access_token值。

image

  1. 下面就再嘗試使用剛才獲取到的access_token值,去獲取微信服務器IP地址
http請求方式: GET
https://api.weixin.qq.com/cgi-bin/get_api_domain_ip?access_token=ACCESS_TOKEN

image

參考文檔:https://developer.work.weixin.qq.com/document/path/92520

0x4 總結

這篇文章讀到這里就已經結束了,希望上面的文章對師傅們有幫助。師傅們可以多去找找相關站點漏洞,然后去看看我寫的的相關傳參使用的接口,然后去試試能不能成功打出相關API漏洞的泄露。可以嘗試去微信小程序去找找相關的appid泄露值,然后去使用我們的傳參,然后先去獲取token值,然后再去利用微信開發者文章去獲取別的對于的泄露的敏感信息,其中還有一個在線的使用站點,上面的文章中也給師傅們了,那個使用起來比較方便。歡迎師傅們在評論區多交流學習!

文章中涉及的敏感信息均已做打碼處理,文章僅做經驗分享用途,切勿當真,未授權的攻擊屬于非法行為!文章中敏感信息均已做多層打碼處理。傳播、利用本文章所提供的信息而造成的任何直接或者間接的后果及損失,均由使用者本人負責,作者不為此承擔任何責任,一旦造成后果請自行承擔。

申明:本公眾號所分享內容僅用于網絡安全技術討論,切勿用于違法途徑,所有滲透都需獲取授權,違者后果自行承擔,與本號及作者無關,請謹記守法。

image

歡迎加入星球一起交流,券后價僅40元!!!即將滿100人漲價長期更新,更多的0day/1day漏洞POC/EXP

原文轉載自:https://mp.weixin.qq.com/s/neunfzjm77Fo8StlLcYcZg

上一篇:

快速接入騰訊地圖MCP Server
最后一篇
#你可能也喜歡這些API文章!

我們有何不同?

API服務商零注冊

多API并行試用

數據驅動選型,提升決策效率

查看全部API→
??

熱門場景實測,選對API

#AI文本生成大模型API

對比大模型API的內容創意新穎性、情感共鳴力、商業轉化潛力

25個渠道
一鍵對比試用API 限時免費

#AI深度推理大模型API

對比大模型API的邏輯推理準確性、分析深度、可視化建議合理性

10個渠道
一鍵對比試用API 限時免費