鍵.png)
REST API 基礎(chǔ):定義、示例及使用方法
淺談獲取access_token
獲取接口調(diào)用憑證實質(zhì)就是獲取access_token。在微信接口開發(fā)中,許多服務(wù)的使用都離不開Access Token,Access Token相當(dāng)于打開這些服務(wù)的鑰匙,正常情況下會在7200秒內(nèi)失效,重復(fù)獲取將導(dǎo)致上次獲取的Token失效,本文將首先介紹如何獲取Access Token。按微信官方的說明,access_token是公眾號的全局唯一接口調(diào)用憑據(jù),公眾號調(diào)用各接口時都需使用access_token。開發(fā)者需要進(jìn)行妥善保存。access_token的存儲至少要保留512個字符空間。access_token的有效期目前為2個小時,需定時刷新,重復(fù)獲取將導(dǎo)致上次獲取的access_token失效。
公眾平臺的API調(diào)用所需的access_token的使用及生成方式說明
tips注意
獲取Access Token
獲取Access Token接口的網(wǎng)址如下:
https請求方式: GET
https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=[APPID]&secret=[APPSECRET]
給師傅們看下在一些站點的網(wǎng)頁源代碼泄露的appid和appsecret參數(shù)值,長什么樣子。
請求參數(shù)
我們需要使用上面的獲取Access Token接口的網(wǎng)址,然后分別填入上面的兩個appid和appsecret參數(shù),如下詳情:
屬性 | 類型 | 必填 | 說明 |
---|---|---|---|
grant_type | string | 是 | 填寫 client_credential |
appid | string | 是 | 小程序唯一憑證,即 AppID,可在「微信公眾平臺 – 設(shè)置 – 開發(fā)設(shè)置」頁中獲得。(需要已經(jīng)成為開發(fā)者,且?guī)ぬ枦]有異常狀態(tài)) |
secret | string | 是 | 小程序唯一憑證密鑰,即 AppSecret,獲取方式同 appid |
返回參數(shù)
成功之后,師傅們就可以看到GET傳參請求成功的回顯結(jié)果,回顯得到的參數(shù)如下:
屬性 | 類型 | 說明 |
---|---|---|
access_token | string | 獲取到的憑證 |
expires_in | number | 憑證有效時間,單位:秒。目前是7200秒之內(nèi)的值。 |
返回數(shù)據(jù)示例
正常情況下,微信會返回下述JSON數(shù)據(jù)包給公眾號:
{
"access_token":"ACCESS_TOKEN",
"expires_in":7200
}
錯誤時微信會返回錯誤碼信息,JSON數(shù)據(jù)包實示例如下(該示例為AppID無效錯誤):
{
"errcode":40013,
"errmsg":"invalid appid"
}
常見的錯誤碼
錯誤碼 | 錯誤描述 | 解決方案 |
---|---|---|
-1 | system error | 系統(tǒng)繁忙,此時請開發(fā)者稍候再試 |
40001 | invalid credential access_token isinvalid or not latest | 獲取 access_token 時 AppSecret 錯誤,或者 access_token 無效。請開發(fā)者認(rèn)真比對 AppSecret 的正確性,或查看是否正在為恰當(dāng)?shù)墓娞栒{(diào)用接口 |
40013 | invalid appid | 不合法的 AppID ,請開發(fā)者檢查 AppID 的正確性,避免異常字符,注意大小寫 |
40002 | invalid grant_type | 不合法的憑證類型 |
40125 | 不合法的 secret | 請檢查 secret 的正確性,避免異常字符,注意大小寫 |
40164 | 調(diào)用接口的IP地址不在白名單中 | 請在接口IP白名單中進(jìn)行設(shè)置 |
41004 | appsecret missing | 缺少 secret 參數(shù) |
50004 | 禁止使用 token 接口 | |
50007 | 賬號已凍結(jié) | |
61024 | 第三方平臺 API 需要使用第三方平臺專用 token | |
40243 | AppSecret已被凍結(jié),請登錄小程序平臺解凍后再次調(diào)用 |
下面的代碼我們封裝了企業(yè)訂閱號、媒體訂閱號、個人訂閱號、測試號的憑證調(diào)用。同時使用的Senparc.WeiXin SDK接口直接獲取憑證的方式,大家可供參考,得到的憑證我是存在了數(shù)據(jù)庫中,同時支持多公眾號統(tǒng)一維護(hù)。
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;
//方式二,直接調(diào)用微信的接口方法
//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;
//方式二,直接調(diào)用微信的接口方法
//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訪問api.weixin.qq.com時,請開發(fā)者注意運(yùn)營商適配,跨運(yùn)營商訪問可能會存在高峰期丟包問題。
API接口IP即api.weixin.qq.com的解析地址,由開發(fā)者調(diào)用微信側(cè)的接入IP接口調(diào)用請求說明。
http請求方式: GET
https://api.weixin.qq.com/cgi-bin/get_api_domain_ip?access_token=ACCESS_TOKEN
參數(shù)說明
參數(shù) | 是否必須 | 說明 |
---|---|---|
access_token | 是 | 公眾號的access_token |
返回說明
正常情況下,微信會返回下述JSON數(shù)據(jù)包給公眾號:
{
"ip_list":[
"IP1",
"IP2",
"IP3",
"IP4",
......
]
}
參數(shù)說明
錯誤時微信會返回錯誤碼等信息,JSON數(shù)據(jù)包示例如下(該示例為AppID無效錯誤):
{
"errcode":40013,
"errmsg":"invalid appid rid: 66dbb72e-7529f8ad-47f1afb9"
}
請開發(fā)者確保防火墻、ddos攻擊白名單IP內(nèi)已添加回調(diào)IP,以避免誤攔截的情況出現(xiàn)。
callback IP即微信調(diào)用開發(fā)者服務(wù)器所使用的出口IP接口調(diào)用請求說明。
http請求方式: GET
https://api.weixin.qq.com/cgi-bin/getcallbackip?access_token=ACCESS_TOKEN
參數(shù)說明
參數(shù) | 是否必須 | 說明 |
---|---|---|
access_token | 是 | 公眾號的access_token |
下面這個在線的測試接口的地址是微信公眾和小程序的官方測試使用的網(wǎng)址,相比上面的需要記住GET傳參的url,下面的在線的測試接口的地址更加方便,且功能點也全。
https://mp.weixin.qq.com/debug
比如我之前挖edu找到的這個body請求包,里面有appid和appsecret參數(shù),那么就可以直接放到上面的在線網(wǎng)址使用了。
針對于去找微信API接口相關(guān)APPid和appSecret泄露,然后可以成功獲取access_token值的目標(biāo)資產(chǎn),這里簡單給師傅們演示下使用FOFA進(jìn)行相關(guān)資產(chǎn)和目標(biāo)的檢索。
FOFA使用下面的檢索語法如下:
(body="appId"&& body="appSecret")&& body="access_token"
使用fofa檢索,可以看到可以匹配到127個獨立的IP,當(dāng)然這個語法不是固定的,師傅們可以去自己完善相關(guān)語法,有好的語法的師傅們也可以在評論區(qū)進(jìn)行相互交流學(xué)習(xí)。
然后在fofa里面找到了一個edu的站點,后面也是對該edu的站點進(jìn)行一個測試。
通過上面對fofa的測繪,然后找到的上面的這個edu的站點,像這樣的直接右擊網(wǎng)頁源代碼,然后在源代碼里面檢索appid參數(shù),可以看到下面的源代碼中找到了相關(guān)參數(shù)。
然后就是先獲取接口調(diào)用憑證(access_token)。
https請求方式: GET
https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=[APPID]&secret=[APPSECRET]
使用上面的參數(shù)直接調(diào)用,發(fā)現(xiàn)顯示40164狀態(tài)碼,意思是調(diào)用接口的IP地址不在白名單中,那就說明這個appid存在,但是被限制了。
這個時候我就在想了,既然這個edu的站點存在appid和appSecret參數(shù)值泄露,且這個是微信小程序的相關(guān)API接口,那么有沒有可能這個學(xué)校的微信小程序可以找到別的appid參數(shù),且沒有做限制,畢竟不同的小程序,做的防護(hù)也不一樣。
我這里直接使用微信小程序去挨個找這個學(xué)校的微信小程序的接口,看看有沒有接口可以找到相關(guān)泄露appid和appSecret值的接口,然后去獲取access_token值。
后面在小程序拿到這個GET傳參的接口,/mobile/serve/wechat/getConfig,里面可以獲取到一個微信小程序的appid和appSecret值。
然后直接再次使用上面的獲取接口調(diào)用憑證(access_token)
https請求方式:GET
https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=[APPID]&secret=[APPSECRET]
http請求方式: GET
https://api.weixin.qq.com/cgi-bin/get_api_domain_ip?access_token=ACCESS_TOKEN
參考文檔:https://developer.work.weixin.qq.com/document/path/92520
這篇文章讀到這里就已經(jīng)結(jié)束了,希望上面的文章對師傅們有幫助。師傅們可以多去找找相關(guān)站點漏洞,然后去看看我寫的的相關(guān)傳參使用的接口,然后去試試能不能成功打出相關(guān)API漏洞的泄露。可以嘗試去微信小程序去找找相關(guān)的appid泄露值,然后去使用我們的傳參,然后先去獲取token值,然后再去利用微信開發(fā)者文章去獲取別的對于的泄露的敏感信息,其中還有一個在線的使用站點,上面的文章中也給師傅們了,那個使用起來比較方便。歡迎師傅們在評論區(qū)多交流學(xué)習(xí)!
文章中涉及的敏感信息均已做打碼處理,文章僅做經(jīng)驗分享用途,切勿當(dāng)真,未授權(quán)的攻擊屬于非法行為!文章中敏感信息均已做多層打碼處理。傳播、利用本文章所提供的信息而造成的任何直接或者間接的后果及損失,均由使用者本人負(fù)責(zé),作者不為此承擔(dān)任何責(zé)任,一旦造成后果請自行承擔(dān)。
申明:本公眾號所分享內(nèi)容僅用于網(wǎng)絡(luò)安全技術(shù)討論,切勿用于違法途徑,所有滲透都需獲取授權(quán),違者后果自行承擔(dān),與本號及作者無關(guān),請謹(jǐn)記守法。
歡迎加入星球一起交流,券后價僅40元!!!即將滿100人漲價長期更新,更多的0day/1day漏洞POC/EXP
原文轉(zhuǎn)載自:https://mp.weixin.qq.com/s/neunfzjm77Fo8StlLcYcZg