ในหลายสถานที่แอปพลิเคชันเช่นการใช้รหัส QR เพื่อเข้าสู่ระบบการชำระเงินรหัส QR, บัญชีรหัส QR (ฉันจะไม่พูดถึงรหัส QR Stallion ที่นี่การฉ้อโกง) การตรวจสอบรหัส QR แอปพลิเคชันการอนุญาตเสริมหลายขั้วเพิ่มขึ้น มาพูดคุยกันว่ารหัส QR คืออะไร ในความเป็นจริงรหัส QR เป็นภาพขาวดำของข้อมูลไบนารีที่เก็บไว้ เมื่อจำเป็นต้องมีรหัส QR ในการเข้าสู่ระบบเซิร์ฟเวอร์จะสร้างข้อมูลรหัส QR ที่ไม่ซ้ำกันชั่วคราวซึ่งจะถูกส่งไปยังไคลเอนต์และเขียนไปยังหน้าเว็บในรูปแบบของรหัส QR (รูปภาพ) จากนั้นคุณจะเห็นรหัส QR สี่ตาราง หากคุณทำได้ดีข้อมูลรหัส QR นี้ควรประหยัดเวลา ฉันจะไม่พิจารณาสิ่งเหล่านี้ในขณะนี้ ลองใช้การเข้าสู่ระบบ WeChat อย่างง่าย ๆ เป็นตัวอย่าง:
มาพูดคุยเกี่ยวกับกระบวนการอนุญาตทั้งหมด:
หน้าเว็บหน้าไคลเอนต์จะส่งการเชื่อมต่อ HTTPS ไปยังเซิร์ฟเวอร์อย่างต่อเนื่องและหลังจากส่งข้อมูลน้อยมากการเชื่อมต่อจะถูกตัดการเชื่อมต่อ มาดูไฟล์ login1c709c.js ในหน้าเว็บ WeChat:
(ฟังก์ชั่น ($, _aowin) {_aowin.qrlogin = {}; _aowin.loginlog = ""; var _sbasehost = "", _ologinqrcodeimg = document.getElementById ("loginqrcode"); "weixin.qq.com"; _OdetActWebmmInterval = setInterval (ฟังก์ชัน () {ถ้า (_aowin.webmm) {clearinterval (_odetactwebmminterval); var callback; ในขณะที่ (callback = _awebmmcallbacks.shift () _loginpage (_aslog) {_aowin.loginlog = loginlog + _aslog + "/n"; _reportnow (ข้อความ) {_loginpage (ข้อความ); ClearInterval (LoadQrimgWatchDog); SRC: " + img.src +", เวลา: " + (วันที่ใหม่ (). getTime () - loadQrCodeTime) +" MS ");}, loadQrimGwatchDog = null; ฟังก์ชั่น _loadqrimg (uuid) {_poll (uuid); วันที่ (). getTime (); "https: // login."+_sbasehost+"/qrcode/"+uuid+"? t = webwx"; _img.onload = function () {ถ้า (! _img.src = _ologinqrcodeimg.src + "& r =" + วันที่ใหม่ (). getTime ();}, 5000); อาร์กิวเมนต์. callee, _ntime = 0; _scuruuid = _asuuid; "/cgi-bin/mmwebwx-bin/เข้าสู่ระบบ? uuid =" + _asuuid + "& tip =" + show_tip, datatype: "สคริปต์", แคช: เท็จ, หมดเวลา: _najaxtimeout, ความสำเร็จ: ฟังก์ชั่น (ข้อมูล, textstatus, jqxhr) + วันที่ใหม่ (). getTime () - _ntime) + "MS"); _fNewLogInFunc = function () {$ .ajax ({url: _aowin.redirect_uri + "& fun = new", // หน้าเข้าสู่ระบบใหม่: "รับ", ความสำเร็จ: ฟังก์ชั่น (msg) {_loginpage ("ใหม่ msg.match (/<script> (.*) <// script>/); webmm.model ("บัญชี"). setskey (skey [1]); return; _reportnow ("/cgi-bin/mmwebwx-bin/ล็อกอิน, ความสำเร็จครั้งที่สอง, uuid:" + _asuuid + ", เวลา: + _ssecondrequesttime +" MS "); $ ('. normldesc'). ซ่อน (); _asuuid); _afterloadwebmmdo (ฟังก์ชั่น () {_aowin.log.d ("500, การสำรวจความคิดเห็น SVR");}); else {settimeout (function () {_self (_asuuid);}, 5000); 0, _getuuidwatchdog, _bgetuuidsuccess = false; // ajax success ִ function _getuuid () {getuuidcount ++; getUuidCount = " + getUuidCount); ถ้า (getUuidCount> 5) {ถ้า (ยืนยัน (" โหลดข้อผิดพลาด uuid. รีเฟรช? ")) {location.reload ();}} settimeout (ฟังก์ชั่น () {_self ();}, 500);}; settimeout (function () {ถ้า (! _ aowin.qrlogin.code) {_loginpage ("หมดเวลา getuuid, watchdog run"); _self ();}}, 10,000); "/jslogin?appid=wx782c26e4c19acffb&redirect_uri="+encodeuricomponent(location.protocol+"//"+location.host+"/cgi-bin/mmwebwx-bin/webwxnewloginpageง "สคริปต์", แคช: เท็จ, ความสำเร็จ: function () {ClearTimeout (_getuuidwatchdog); _bgetuuidsuccess = true; _loadqrimg (qrlogin.uuid); _loaderror ("qrlogin.code =" + qrlogincode); } if ($ ("#LOGIN_CONTAINER"). (": มองเห็นได้")) {_getuuid ();} var _bhadlog = false; ) "+" webwxuvid "+" = ([^;]*) (; | $) ")); ถ้า (! _ suvid || _suvid.length <3) return; _suvid = _suvid [2]; "/cgi-bin/mmwebwx-bin/webwxstatreport? funkey = indexdemo & uvid ="+_ suvid+"& uuid ="+_ scuruuid; $ (" #guidetrigger, #tiptrigger"), _omask $ = $ (". mask"); ฟังก์ชั่น _back () {_ntimer = settimeout (ฟังก์ชั่น () {_omask $ .stop () _oguide $ .stop (). animate ({marginleft: "-120px", opacity: 0}, "400", "swing", function () {_oguide $ .hide ();}; _oguidetrigger $ .css ({"BackgroundColor": "White", "Opacity": "0"}); "block"). stop (). animate ({marginleft: "+168px", opacity: 1}, 900, "swing", function () {_oguide $. _oguide $ .mouseover (function () {ClearTimeOut (_ntimer);}). Mouseout (_back);}}) (jQuery, หน้าต่าง);หลังจากอ่าน JS อย่างระมัดระวังคุณจะเห็นด้านเข้าสู่ระบบจากเว็บไคลเอนต์ เว็บไคลเอนต์เริ่มต้นคำขอ SSL ไปยังเซิร์ฟเวอร์ทุก ๆ 500 มิลลิวินาทีโดยขอให้รหัส QR ปัจจุบันได้รับอนุญาตจากลูกค้ารายอื่น (โทรศัพท์มือถือ) หรือไม่ หากผลการส่งคืนคือ 201 หมายความว่าคุณได้รับบัญชีเดียวกันกับขั้วรหัส Scan QR เพื่อเข้าสู่ระบบหากเป็นสถานการณ์อื่นให้ส่งคำขออีกครั้งหลังจาก 500 มิลลิวินาที กระบวนการนี้จะดำเนินต่อไปจนกว่ารหัส QR จะถูกสแกนหรือรหัส QR หมดเวลา (ไม่ถูกต้อง)
เครื่องมือที่ใช้คือ: เครื่องมือจับแพ็คเกจ Fidller, เครื่องมือนักพัฒนา Chrome F12 โปรดทราบว่าโดยบังเอิญลูกค้าของ WeChat มี min-webmm1cba21.js min-webmm1cba21.js ซึ่งสามารถมองเห็นได้ชัดเจนในข้อกำหนดของตัวกรอง XSS นี่คือความหวังที่จะได้รับ Q สำหรับผู้ที่ต้องการทดสอบ XSS ในกล่องสีขาว! - -
บทความนี้ได้รวบรวมไว้ใน "สรุปทักษะการพัฒนา JavaScript WeChat" และทุกคนยินดีที่จะเรียนรู้และอ่าน
ฉันขอแนะนำบทช่วยสอนเกี่ยวกับ WeChat Applets ที่มีความกังวลอย่างมากในขณะนี้: บรรณาธิการของ "การสอนการพัฒนาโปรแกรม WeChat Mini" ได้รวบรวมไว้อย่างระมัดระวังสำหรับทุกคนฉันหวังว่าคุณจะชอบ
ข้างต้นเป็นเนื้อหาทั้งหมดของบทความนี้ ฉันหวังว่ามันจะเป็นประโยชน์ต่อการเรียนรู้ของทุกคนและฉันหวังว่าทุกคนจะสนับสนุน wulin.com มากขึ้น