浅谈微信小程序渗透
奇安信攻防社區(qū)-淺談微信小程序滲透
0x0前言
最近好多小伙伴都在問怎么對微信小程序進(jìn)行滲透,遂寫篇文章拋磚引玉。
0x1環(huán)境準(zhǔn)備
我使用的是夜神模擬器配合 burpsuite 進(jìn)行抓包。夜神模擬器我使用的是6.6.1.1的版本,算是很老的版本了,內(nèi)設(shè)系統(tǒng)為Android5.0。新的版本中安卓似乎都是7.0以上了,抓取 HTTPS 包會比較麻煩,所以我就一直沒有換版本。如果有需要的朋友可以自取,后面會打包云盤在文章底部。
首先我們需要設(shè)置好抓包環(huán)境,先通過ipconfig查看我們當(dāng)前 ip,這里我用的是以太網(wǎng),也就是插著網(wǎng)線;如果是連著 WIFI,則找對應(yīng)的即可
在 burpsuite 添加上,這里我設(shè)置端口為8888,可以按照自己需求更改
打開夜神模擬器,在 WLAN 選擇手動代理,并設(shè)置代理地址和代理端口,和 burpsuite 對應(yīng)
保存后,打開瀏覽器訪問ip:port,這里的話為192.168.1.102:8888,點(diǎn)擊CA Certificate下載證書
打開文件管理器,在sdcard->Download目錄中可以看到下載下來的證書
將cacert.der更名為cacert.cer,也就是將后綴改成cer,然后到手機(jī)設(shè)置->安全中,選擇從 SD 卡安裝
安裝證書
測試一下,瀏覽器訪問百度,burpsuite 能正常抓包說明已經(jīng)設(shè)置環(huán)境成功
0x2反編譯微信小程序代碼
我們在模擬器里登錄微信,然后隨便選擇一個微信小程序打開
打開文件管理器,在data/data/com.tencent.mm/MicroMsg會生成一個md5加密命名的文件夾(如果打開微信小程序過多,同時有多個文件夾不容易識別的情況,可以選擇把MicroMsg文件夾所有內(nèi)容刪除掉,再去重新打開微信小程序,就會得到唯一一個MD5加密命名的文件夾啦)
在該文件夾下的appbrand/pkg目錄下找到.wxapkg后綴結(jié)尾的文件,其中只有幾MB大小的為剛剛打開的小程序的文件
點(diǎn)擊勾選之后,來到根目錄下的mnt/shared/App目錄,打開右上角三個.的功能菜單選擇粘貼選擇項(xiàng),將文件復(fù)制到該文件夾
這里的文件夾就是電腦共享的文件夾,點(diǎn)擊打開電腦文件夾
可以找到小程序的文件
這里推薦有 GUI 界面的反編譯工具:Releases · ezshine/wxapkg-convertor · GitHub
直接將文件鼠標(biāo)拖拽到 GUI 界面即可開始反編譯,在拖入文件的當(dāng)前目錄得到反編譯生成的文件夾
然后就可以開始舒服的看看 js 代碼啦
0x3反編譯源碼代碼審計(jì)
舉例某小程序?qū)徲?jì),在登錄界面爆破無關(guān)之后,直接反編譯拖源碼審計(jì)一下,反編譯出來的源碼,我們著重看 js 文件及其配置文件即可。第一想法就是先找一些接口,嘗試是否有未授權(quán)之類的漏洞,下面就是找到的一處路由user/getUserInfoByUsername
可以看到發(fā)送數(shù)據(jù)類型為 json 格式,并且參數(shù)為username和school,于是嘗試構(gòu)造請求發(fā)送
成功獲取系統(tǒng)管理員詳細(xì)信息,其中包括關(guān)鍵的密碼。獲取到 md5 加密形式的密碼密文后,本來還想去 cmd5 去解一下, 但是接下來注意到一個登錄路由user/loginByUsernameAndPassword
從源碼中都看得出來就是通過賬號密碼去登錄,剛剛未授權(quán)得到的密碼存儲為 md5 加密形式,想來登錄應(yīng)該也是進(jìn)行 md5 加密的形式,所以直接發(fā)送加密形式的密碼即可,構(gòu)造請求發(fā)送
驗(yàn)證登錄成功。這類常常出現(xiàn)未授權(quán)漏洞的路由命名方式大抵都是
xxxByXXXId xxxByUsername xxxbyphone ......審計(jì)的時候我們可以做一個規(guī)則去全局搜索源碼匹配這類命名方式的路由
0x4其他類型漏洞案例
下面舉例其他類型的漏洞審計(jì)案例,這里目的是為了說明小程序有哪些漏洞可以挖
信息泄露
反編譯出來的源碼泄露登錄賬號密碼,這里是因?yàn)樵?js 文件中寫死了賬號密碼,只做了前端驗(yàn)證導(dǎo)致的漏洞,從下面貼的兩個小程序源碼中可以看到
在時間稍稍往前的小程序中,還經(jīng)常會有泄露小程序secret的情況,簡直就是把打開保險(xiǎn)箱的密碼放在你面前
未授權(quán)接口
仔細(xì)翻找 js 文件能找到不少未鑒權(quán)的 api 接口(可以著重注意配置文件,不少配置文件都會寫上路由列表),例如該 api 返回大量用戶敏感信息
測試未授權(quán)時,有一些小技巧:例如當(dāng)在 GET 或者 POST 傳參中有token等鑒權(quán)參數(shù),例如
GET /api/GetUserInfo?id=xxx&token=xxxx HTTP/1.1可以嘗試將token參數(shù)的值置空或者刪除token參數(shù),往往能 bypass 鑒權(quán),我已經(jīng)遇見好多次這種情況了。舉例一個案例:
該微信小程序可以注冊用戶,注冊賬號登錄之后抓包,我的賬號數(shù)據(jù)包如下
當(dāng)我嘗試將uid參數(shù)改成其他用戶時,返回權(quán)限不足,嘗試將token刪除
GET /wx/queryOrders?orderState=&serviceUid=&pageNum=1&pageSize=200&uid=2000除此之外,測試一些參數(shù),比如手機(jī)號,不知道該系統(tǒng)用戶手機(jī)號時,可以試試像上面說的將其置空,往往運(yùn)氣好能碰上系統(tǒng)后端查詢使用的模糊查詢?yōu)榭諘r返回所有信息,下面貼圖的案例就是將手機(jī)號參數(shù)置空后,成功獲取到賬號詳細(xì)信息
越權(quán)漏洞
下面案例舉例一個通過 Cookie 中的參數(shù)進(jìn)行鑒權(quán)的漏洞,可以通過修改NetId中的值來遍歷獲取用戶信息。此類漏洞的挖掘在鑒權(quán)處的源碼,審計(jì)時可以著重審計(jì)其驗(yàn)證流程
當(dāng)時也是依靠這個漏洞獲取到 VPN 賬號密碼,得以進(jìn)入內(nèi)網(wǎng)滲透
邏輯漏洞
使用 burpsuite 抓取管理員登錄數(shù)據(jù)包,獲取返回包
該處在login.js文件登錄判斷條件中,源碼判斷返回為 0 時登錄成功,所以我們將返回包從 1 改成 0 即可登錄成功。
還有?任意密碼重置?,該處漏洞倒也是在黑盒中無意發(fā)現(xiàn),在修改密碼處需要驗(yàn)證對應(yīng)賬號接收到的短信驗(yàn)證碼。但懷著嘗試的心態(tài)通過 buspsuite 抓包繞過 js 限制,隨意填寫驗(yàn)證碼便可以重置任意用戶密碼,不細(xì)心就會很容易忽視的點(diǎn)
appid和secret的利用
當(dāng)時測試數(shù)據(jù)的時候,發(fā)現(xiàn)添加字符%%會導(dǎo)致其后端報(bào)錯,返回appid和secret
獲取到的appid和secret可以到微信的官方接口去自由生成微信小程序的命脈AccessToken
拿到 AccessToken,相當(dāng)于可以控制整個小程序了,并且 AccessToken 微信每天只能生成20次,不斷請求滿20次的話可以使小程序崩潰無法使用。
其次利用AccessToken可以執(zhí)行相當(dāng)多的其他操作,見微信官方文檔,這里就不畫蛇添足了。
工具自取鏈接:
鏈接:https://pan.baidu.com/s/1vMVvmm2n2wyr3vhzp91iqA 提取碼:jpho0x5總結(jié)
總的來說,微信小程序的滲透我覺得最重要的還是仔細(xì)審計(jì)一下反編譯得到的源碼,常常會有意想不到的驚喜噢~
總結(jié)
- 上一篇: 浅谈OSPF
- 下一篇: 少年Pi的奇幻漂流-我们的后台自动化发布