0x0前言


最近好多小伙伴都在問怎么對微信小程序進行滲透,遂寫篇文章拋磚引玉。

0x1環境準備


    我使用的是夜神模擬器配合 burpsuite 進行抓包。夜神模擬器我使用的是6.6.1.1的版本,算是很老的版本了,內設系統為Android5.0。新的版本中安卓似乎都是7.0以上了,抓取 HTTPS 包會比較麻煩,所以我就一直沒有換版本。如果有需要的朋友可以自取,后面會打包云盤在文章底部。

    首先我們需要設置好抓包環境,先通過ipconfig查看我們當前 ip,這里我用的是以太網,也就是插著網線;如果是連著 WIFI,則找對應的即可

    在 burpsuite 添加上,這里我設置端口為8888,可以按照自己需求更改

    打開夜神模擬器,在 WLAN 選擇手動代理,并設置代理地址和代理端口,和 burpsuite 對應

    保存后,打開瀏覽器訪問ip:port,這里的話為192.168.1.102:8888,點擊CA Certificate下載證書

    打開文件管理器,在sdcard->Download目錄中可以看到下載下來的證書

    將cacert.der更名為cacert.cer,也就是將后綴改成cer,然后到手機設置->安全中,選擇從 SD 卡安裝

    安裝證書

    測試一下,瀏覽器訪問百度,burpsuite 能正常抓包說明已經設置環境成功

0x2反編譯微信小程序代碼


    我們在模擬器里登錄微信,然后隨便選擇一個微信小程序打開

    打開文件管理器,在data/data/com.tencent.mm/MicroMsg會生成一個md5加密命名的文件夾(如果打開微信小程序過多,同時有多個文件夾不容易識別的情況,可以選擇把MicroMsg文件夾所有內容刪除掉,再去重新打開微信小程序,就會得到唯一一個MD5加密命名的文件夾啦)

    在該文件夾下的appbrand/pkg目錄下找到.wxapkg后綴結尾的文件,其中只有幾MB大小的為剛剛打開的小程序的文件

    點擊勾選之后,來到根目錄下的mnt/shared/App目錄,打開右上角三個.的功能菜單選擇粘貼選擇項,將文件復制到該文件夾

    這里的文件夾就是電腦共享的文件夾,點擊打開電腦文件夾

    可以找到小程序的文件

    這里推薦有 GUI 界面的反編譯工具:https://github.com/ezshine/wxapkg-convertor/releases

    直接將文件鼠標拖拽到 GUI 界面即可開始反編譯,在拖入文件的當前目錄得到反編譯生成的文件夾

    然后就可以開始舒服的看看 js 代碼啦

0x3反編譯源碼代碼審計


    舉例某小程序審計,在登錄界面爆破無關之后,直接反編譯拖源碼審計一下,反編譯出來的源碼,我們著重看 js 文件及其配置文件即可。第一想法就是先找一些接口,嘗試是否有未授權之類的漏洞,下面就是找到的一處路由user/getUserInfoByUsername

    可以看到發送數據類型為 json 格式,并且參數為usernameschool,于是嘗試構造請求發送

    成功獲取系統管理員詳細信息,其中包括關鍵的密碼。獲取到 md5 加密形式的密碼密文后,本來還想去 cmd5 去解一下, 但是接下來注意到一個登錄路由user/loginByUsernameAndPassword

    從源碼中都看得出來就是通過賬號密碼去登錄,剛剛未授權得到的密碼存儲為 md5 加密形式,想來登錄應該也是進行 md5 加密的形式,所以直接發送加密形式的密碼即可,構造請求發送

    驗證登錄成功。這類常常出現未授權漏洞的路由命名方式大抵都是


xxxByXXXId
xxxByUsername
xxxbyphone
......

    審計的時候我們可以做一個規則去全局搜索源碼匹配這類命名方式的路由

0x4其他類型漏洞案例


    下面舉例其他類型的漏洞審計案例,這里目的是為了說明小程序有哪些漏洞可以挖

信息泄露


    反編譯出來的源碼泄露登錄賬號密碼,這里是因為在 js 文件中寫死了賬號密碼,只做了前端驗證導致的漏洞,從下面貼的兩個小程序源碼中可以看到

    在時間稍稍往前的小程序中,還經常會有泄露小程序secret的情況,簡直就是把打開保險箱的密碼放在你面前

未授權接口


    仔細翻找 js 文件能找到不少未鑒權的 api 接口(可以著重注意配置文件,不少配置文件都會寫上路由列表),例如該 api 返回大量用戶敏感信息

    測試未授權時,有一些小技巧:例如當在 GET 或者 POST 傳參中有token等鑒權參數,例如


GET /api/GetUserInfo?id=xxx&token=xxxx HTTP/1.1
    可以嘗試將token參數的值置空或者刪除token參數,往往能 bypass 鑒權,我已經遇見好多次這種情況了。舉例一個案例:
該微信小程序可以注冊用戶,注冊賬號登錄之后抓包,我的賬號數據包如下
GET /wx/queryOrders?orderState=&serviceUid=&repairUid=6864&pageNum=1&pageSize=20&uid=6864&token=9938C366-XXXX-XXXX-XXXX-9C7709D8C9E8


    當我嘗試將uid參數改成其他用戶時,返回權限不足,嘗試將token刪除


GET /wx/queryOrders?orderState=&serviceUid=&pageNum=1&pageSize=200&uid=2000

    除此之外,測試一些參數,比如手機號,不知道該系統用戶手機號時,可以試試像上面說的將其置空,往往運氣好能碰上系統后端查詢使用的模糊查詢為空時返回所有信息,下面貼圖的案例就是將手機號參數置空后,成功獲取到賬號詳細信息

越權漏洞


    下面案例舉例一個通過 Cookie 中的參數進行鑒權的漏洞,可以通過修改NetId中的值來遍歷獲取用戶信息。此類漏洞的挖掘在鑒權處的源碼,審計時可以著重審計其驗證流程

    當時也是依靠這個漏洞獲取到 VPN 賬號密碼,得以進入內網滲透

邏輯漏洞


    使用 burpsuite 抓取管理員登錄數據包,獲取返回包

    該處在login.js文件登錄判斷條件中,源碼判斷返回為 0 時登錄成功,所以我們將返回包從 1 改成 0 即可登錄成功。

    還有 任意密碼重置 ,該處漏洞倒也是在黑盒中無意發現,在修改密碼處需要驗證對應賬號接收到的短信驗證碼。但懷著嘗試的心態通過 buspsuite 抓包繞過 js 限制,隨意填寫驗證碼便可以重置任意用戶密碼,不細心就會很容易忽視的點

appid和secret的利用


    當時測試數據的時候,發現添加字符%%會導致其后端報錯,返回appidsecret

    獲取到的appid和secret可以到微信的官方接口去自由生成微信小程序的命脈AccessToken

    拿到 AccessToken,相當于可以控制整個小程序了,并且 AccessToken 微信每天只能生成20次,不斷請求滿20次的話可以使小程序崩潰無法使用。

    其次利用AccessToken可以執行相當多的其他操作,見微信官方文檔,這里就不畫蛇添足了。

    工具自取鏈接:


    鏈接:https://pan.baidu.com/s/1vMVvmm2n2wyr3vhzp91iqA 
    提取碼:jpho

0x5總結


    總的來說,微信小程序的滲透我覺得最重要的還是仔細審計一下反編譯得到的源碼,常常會有意想不到的驚喜噢~

反編譯源碼那里可以直接在客戶端微信實現,自動的工具。https://github.com/DC3x6/Unpack