Ce diaporama a bien été signalé.
Nous utilisons votre profil LinkedIn et vos données d’activité pour vous proposer des publicités personnalisées et pertinentes. Vous pouvez changer vos préférences de publicités à tout moment.
Tips
for
Building
Third-Party School Service
開發學校雲端服務的奇技淫巧
aaaddress1@gmail.com
Ma Sheng-Hao (aaaddress1, aka adr)
TDOHacker 資安社群核⼼心成員
Debug Guy
Speaker
‣ TDOHConf 2016 議程組長
‣ HITCON CMT 2015
‣ SITCON 2...
Sorry, Node.js 要攻佔天下惹
例如說本來我標題叫做奇淫技巧
什麼 CoC 原則的啦
什麼不該說的啦
都忘惹吧 O__Q
murmur
聲控表情
身為⼀個靠北⼯程師....
各種奇技淫巧
當然以上都是屁話
只是合理化
「想要記錄所有同學密碼」
的需求
HTTP 網⾴流量分析
HTTP 網⾴流量分析
你的⽬目標?
User Application Browser Mobile Apps
HTTP 網⾴流量分析
User Application Browser Mobile Apps
今天談論的主軸是瀏覽器
HTTP 網⾴流量分析
Browser
HTTP 網⾴流量分析
瀏覽器
瀏覽器的作⽤用⼀一般來來說:
1. 跟伺服器取得網⾴頁原始碼
2. 分析原始碼,建立出物件樹
3. 物件佈局位置分析
4. 將每⼀一個物件樹的物件渲染顯⽰示在⾴頁
⾯面上
5. 主流瀏覽器現在⼀一...
Browser
分析⼿手段
1. 閱讀網⾴頁原始碼(靜態)
2. 監聽網路路流量量,分析
Cookie、Header、Body
…等(動態分析)
HTTP 網⾴流量分析
瀏覽器
HTTP 網⾴流量分析
瀏覽器(靜態)
Browser
HTTP Traffic Analytics
Browser (Static)
HTTP 網⾴流量分析
瀏覽器(靜態)
HTTP 網⾴流量分析
瀏覽器(靜態)
HTTP 網⾴流量分析
瀏覽器(動態)
HTTP 網⾴流量分析
瀏覽器(動態)
HTTP 網⾴流量分析
瀏覽器(動態)
1. 學校網⾴寫得太美我不敢看
2. 不是很通熟網⾴怎麼撰寫的
HTTP 網⾴流量分析
瀏覽器(動態)
HTTP 網⾴流量分析
瀏覽器(動態)
⼀般第三⽅服務 BOT
(應⽤程式)
⼀般第三⽅服務 BOT
Application
模擬⼀一般使⽤用者的瀏覽器⾏行行為
去對伺服器收發 POST/GET
要求
Application School Server
POST /Login HTTP/1.1

usr=adr&pass=handsome
HTTP/1.1 200 OK
Set-Cookie: gg=ininder;
…
⼀般第三⽅服務 BOT
Application School Server
GET /helloWorld HTTP/1.1
Cookie: gg=ininder;

HTTP/1.1 200 OK
<p>hello world! adr<p>
Cookie: gg=...
Application School Server
GET /helloWorld HTTP/1.1
Cookie: gg=ininder;

HTTP/1.1 200 OK
<p>hello world! adr<p>
Cookie: gg=...
Application School Server
GET /timeTable HTTP/1.1
Cookie: gg=ininder;

HTTP/1.1 200 OK
<table><tr><td>english</td>
…
Cooki...
Application School Server
請求
回應
Cookie: gg=ininder;
⼀般第三⽅服務 BOT
Application School Server
Cookie: gg=ininder;
⼀般第三⽅服務 BOT
請求
回應
Android Windows iOS
Android Windows iOS
App.java App.cpp App.swift
如果我們能把這樣功能的機器⼈人寫成
雲端服務,我們就可以更更多時間去陪
女朋友惹(不對,我沒有女朋友...)
建⽴⼀個
第三⽅雲端服務
建⽴⼀個第三⽅服務
Application
(User Side)
School Server
Cookie: gg=ininder;
請求
回應
Application
User Side
School Server
請求
回應
Cookie: gg=ininder;
回應
請求
Cookie: gg=ininder;
建⽴⼀個第三⽅服務
透過
Node.js + Express
建⽴服務
建⽴
雲端服務
Application
User Side
Cookie: gg=ininder;
回應
請求
HTTP Basic
POST /?act=InInDer HTTP/1.1
HOST: big.gg.com
girls=will&love=it
HTTP Basic
POST /?act=InInDer HTTP/1.1
HOST: big.gg.com
adr=have&cat=dog
Header
HTTP Basic
POST /?act=InInDer HTTP/1.1
HOST: big.gg.com
adr=have&cat=dog
Query
HTTP Basic
POST /?act=InInDer HTTP/1.1
HOST: big.gg.com
adr=have&cat=dog Body (POST)
Node.js + Request
模擬使⽤者瀏覽器⾏為
BOT ⾏為
School Server
請求
回應
Cookie: gg=ininder;
傳遞
使⽤者的連線身份
連線身份資訊保存
由單⼀應⽤程式記憶
Application
(User Side)
School Server
Cookie: gg=ininder;
請求
回應
變成針對不同使⽤者須使⽤不同的
連線身份去請求學校伺服器
Application School Server
請求
回應
Cookie: gg=ininder;
回應
請求
Cookie: gg=ininder;
⽅法⼀
後端使⽤ Session 的⽅式
記憶使⽤者的身份資訊
雲端服務架構
Application School Server
請求
回應
Cookie: gg=ininder;
回應
請求
Cookie: gg=ininder;
雲端服務架構
Application School Server
請求
回應
Cookie: key=9487;
回應
請求
Cookie: gg=SESSION[9487];
SESSION 會把你所有需要的資料
保存在 RAM 裡⾯面
⼀一旦同時連線⼈人數過多、
來來不及釋放、
忘記釋放
然後就...
SESSION 會把你所有需要的資料
保存在 RAM 裡⾯面
⼀一旦同時連線⼈人數過多、
來來不及釋放、
忘記釋放
然後就...
HTTP Status 500
爆炸啦
⽅法⼆
使⽤者登入後把身份資訊存回
使⽤者瀏覽器的 Cookie 中
⽅法⼆
需要時再從使⽤者 Cookie 中領回
身份資訊並以此向學校伺服器請求
將登入成功的身份資訊
保存入使⽤者端的 Cookie 中
從使⽤者瀏覽器取出上⼀次身份資訊
從網⾴原始碼
取出關鍵資訊
從網⾴原始碼中取出關鍵資訊
1. JS ⽂文字處理理函數: substr, split, charAt, slice, …
2. 正規表達法: ^123([d]+)$
3. Cheerio.js
JS ⽂字處理函數
var Str = ‘<title>Hello world</title>’
> Str = Str.slice(Str.indexOf('>') + 1)
> Str = Str.slice(0, Str.indexOf(...
正規表達法
var Str = ‘<title>Hello world</title>’
> Str.match(/<title>[^x20]+([^<]+)/)[1]
' world'
Cheerio.js
var Str = ‘<title>Hello world</title>’
> Str = require(‘cheerio’).load(Str)('title').text()
> Str.split(‘x20')[...
aaaddress1/m00d1e.js
學校電算中⼼
常玩的檢測機制
請求 Header 分析
表單中按鈕的⽂字
表單中按鈕的⽂字
封包請求時間
CAPTCHA
教育部青年發展協署
教育部青年發展協署
CAPTCHA
商⽤驗證碼辨識套件
30cm.tw/?p=512
CAPTCHA
CAPTCHA
CAPTCHA
CAPTCHA
CAPTCHA
CAPTCHA
CAPTCHA
CAPTCHA
aaaddress1/easyChptchaOCR
當然,還有更智障的⽅法
當然,還有更智障的⽅法
當然,還有更智障的⽅法
✖
✖
✖
當然,還有更智障的⽅法
✖
✖
✖
✖
✖
當然,還有更智障的⽅法
✖
✖
✖
✖
✖
✖
✖
當然,還有更智障的⽅法
✖
✖
✖
✖
✖
✖
✖ ✖
感謝被⼤同⼤學退學的丹尼同學
提供如此寶貴的建議
奇技淫巧(⼀)
跨域名登入Moodle
Browser
User Side
School Server
請求
回應
Cookie: gg=ininder;
回應
請求
Cookie: gg=ininder;
第三⽅方服務
Browser
User Side
School Server
請求
Cookie: gg=ininder;
請求
Cookie: gg=ininder;
第三⽅方服務
Browser
User Side
School Server
請求
Cookie: gg=ininder;
第三⽅方服務
Cookie: gg=ininder;
Cross-site
request
forgery
Content Security Policy
(CSP)
沒有任何解決辦法?
有ㄛ蒸蚌!
isu.30cm.tw/isuMoodle
isu.30cm.tw/isuMoodle
Cross Domain Login Moodle
Browser
User Side
School Server
Cookie: gg=ininder;
第三⽅方服務
回應
Browser
User Side
Cookie: gg=ininder;
第三⽅方服務
回應
在使⽤用者⾴頁⾯面上建立起⼀一個 iframe
在內部寫入 moodle 登入畫⾯面的帳號密碼欄欄位
最後以 Javascript 模擬點擊登入
IFRAME
User Side
Moodle
請求
USERNAME = usr & PASSWORD = pass
IFRAME
User Side
Moodle
回應
Cookie: gg=ininder;
Browser
User Side
Moodle
回應
Cookie: gg=ininder;
Browser
User Side
Moodle
請求
Cookie: gg=ininder;
回應
github.com/aaaddress1/isuMaster-NodeJS
奇技淫巧(⼆)
無痕模式下記憶帳密
github.com/Valve/fingerprintjs
github.com/aaaddress1/isuMaster-NodeJS
莫風徵伴侶
QA
aaaddress1@gmail.com
開發學校雲端服務的奇技淫巧(Tips for Building  Third-Party School Service)
開發學校雲端服務的奇技淫巧(Tips for Building  Third-Party School Service)
開發學校雲端服務的奇技淫巧(Tips for Building  Third-Party School Service)
開發學校雲端服務的奇技淫巧(Tips for Building  Third-Party School Service)
開發學校雲端服務的奇技淫巧(Tips for Building  Third-Party School Service)
開發學校雲端服務的奇技淫巧(Tips for Building  Third-Party School Service)
開發學校雲端服務的奇技淫巧(Tips for Building  Third-Party School Service)
開發學校雲端服務的奇技淫巧(Tips for Building  Third-Party School Service)
開發學校雲端服務的奇技淫巧(Tips for Building  Third-Party School Service)
開發學校雲端服務的奇技淫巧(Tips for Building  Third-Party School Service)
開發學校雲端服務的奇技淫巧(Tips for Building  Third-Party School Service)
開發學校雲端服務的奇技淫巧(Tips for Building  Third-Party School Service)
開發學校雲端服務的奇技淫巧(Tips for Building  Third-Party School Service)
開發學校雲端服務的奇技淫巧(Tips for Building  Third-Party School Service)
開發學校雲端服務的奇技淫巧(Tips for Building  Third-Party School Service)
開發學校雲端服務的奇技淫巧(Tips for Building  Third-Party School Service)
開發學校雲端服務的奇技淫巧(Tips for Building  Third-Party School Service)
開發學校雲端服務的奇技淫巧(Tips for Building  Third-Party School Service)
開發學校雲端服務的奇技淫巧(Tips for Building  Third-Party School Service)
開發學校雲端服務的奇技淫巧(Tips for Building  Third-Party School Service)
開發學校雲端服務的奇技淫巧(Tips for Building  Third-Party School Service)
開發學校雲端服務的奇技淫巧(Tips for Building  Third-Party School Service)
開發學校雲端服務的奇技淫巧(Tips for Building  Third-Party School Service)
開發學校雲端服務的奇技淫巧(Tips for Building  Third-Party School Service)
開發學校雲端服務的奇技淫巧(Tips for Building  Third-Party School Service)
開發學校雲端服務的奇技淫巧(Tips for Building  Third-Party School Service)
Prochain SlideShare
Chargement dans…5
×

開發學校雲端服務的奇技淫巧(Tips for Building Third-Party School Service)

3 675 vues

Publié le

想替自己學校開發雲端服務卻無從上手起嗎?議程教學如何在學校電算中心未開放任何 API 下實作出屬於自己的學校雲端服務。本議程將演示一個義守大學廣獲好評第三方熱門服務,並解釋如何實作同步學生當天課程、Moodle 課程、Moodle作業狀況,並且在前端即可實作跨域名繞過 CSP 瀏覽器安全限制替學校 Moodle 登入,議程末將釋出整份專案開源於 Github 上。
議程內容涉及外掛開發、資訊安全相關領域的技術內容、電算中心防外掛偵測點與應對技術。

Publié dans : Logiciels
  • Soyez le premier à commenter

開發學校雲端服務的奇技淫巧(Tips for Building Third-Party School Service)

  1. 1. Tips for Building Third-Party School Service 開發學校雲端服務的奇技淫巧 aaaddress1@gmail.com
  2. 2. Ma Sheng-Hao (aaaddress1, aka adr) TDOHacker 資安社群核⼼心成員 Debug Guy Speaker ‣ TDOHConf 2016 議程組長 ‣ HITCON CMT 2015 ‣ SITCON 2016 ‣ HITCON CMT 2016 Lightning Talk ‣ 台灣科技⼤大學新型態資安實務課程 ‣ BSidesLV ‣ ICNC ‣ MC2015 ‣ 全國資安會議 C/C++, C#, VB, MASM, Python, Swift, Node.js, Java 專研於 Windows 上平台特性與程式弱點與逆向⼯工程分析 知名作品涉及楓之⾕谷外掛, 神魔之塔外掛, 義守管家, cuteRansomware, Adr'sFB
  3. 3. Sorry, Node.js 要攻佔天下惹
  4. 4. 例如說本來我標題叫做奇淫技巧
  5. 5. 什麼 CoC 原則的啦 什麼不該說的啦 都忘惹吧 O__Q
  6. 6. murmur
  7. 7. 聲控表情
  8. 8. 身為⼀個靠北⼯程師....
  9. 9. 各種奇技淫巧
  10. 10. 當然以上都是屁話 只是合理化 「想要記錄所有同學密碼」 的需求
  11. 11. HTTP 網⾴流量分析
  12. 12. HTTP 網⾴流量分析 你的⽬目標?
  13. 13. User Application Browser Mobile Apps HTTP 網⾴流量分析
  14. 14. User Application Browser Mobile Apps 今天談論的主軸是瀏覽器 HTTP 網⾴流量分析
  15. 15. Browser HTTP 網⾴流量分析 瀏覽器 瀏覽器的作⽤用⼀一般來來說: 1. 跟伺服器取得網⾴頁原始碼 2. 分析原始碼,建立出物件樹 3. 物件佈局位置分析 4. 將每⼀一個物件樹的物件渲染顯⽰示在⾴頁 ⾯面上 5. 主流瀏覽器現在⼀一般都⾃自帶有流量量分 析⼯工具 e.g. Chrome, Firefox, Safari
  16. 16. Browser 分析⼿手段 1. 閱讀網⾴頁原始碼(靜態) 2. 監聽網路路流量量,分析 Cookie、Header、Body …等(動態分析) HTTP 網⾴流量分析 瀏覽器
  17. 17. HTTP 網⾴流量分析 瀏覽器(靜態)
  18. 18. Browser HTTP Traffic Analytics Browser (Static)
  19. 19. HTTP 網⾴流量分析 瀏覽器(靜態)
  20. 20. HTTP 網⾴流量分析 瀏覽器(靜態)
  21. 21. HTTP 網⾴流量分析 瀏覽器(動態)
  22. 22. HTTP 網⾴流量分析 瀏覽器(動態)
  23. 23. HTTP 網⾴流量分析 瀏覽器(動態)
  24. 24. 1. 學校網⾴寫得太美我不敢看 2. 不是很通熟網⾴怎麼撰寫的
  25. 25. HTTP 網⾴流量分析 瀏覽器(動態)
  26. 26. HTTP 網⾴流量分析 瀏覽器(動態)
  27. 27. ⼀般第三⽅服務 BOT (應⽤程式)
  28. 28. ⼀般第三⽅服務 BOT Application 模擬⼀一般使⽤用者的瀏覽器⾏行行為 去對伺服器收發 POST/GET 要求
  29. 29. Application School Server POST /Login HTTP/1.1
 usr=adr&pass=handsome HTTP/1.1 200 OK Set-Cookie: gg=ininder; … ⼀般第三⽅服務 BOT
  30. 30. Application School Server GET /helloWorld HTTP/1.1 Cookie: gg=ininder;
 HTTP/1.1 200 OK <p>hello world! adr<p> Cookie: gg=ininder; (⾝身份資訊) ⼀般第三⽅服務 BOT
  31. 31. Application School Server GET /helloWorld HTTP/1.1 Cookie: gg=ininder;
 HTTP/1.1 200 OK <p>hello world! adr<p> Cookie: gg=ininder; 收到伺服器回應的網⾴頁原始碼, 分析並更更新 UI 顯⽰示給使⽤用者 ⼀般第三⽅服務 BOT
  32. 32. Application School Server GET /timeTable HTTP/1.1 Cookie: gg=ininder;
 HTTP/1.1 200 OK <table><tr><td>english</td> … Cookie: gg=ininder; 收到伺服器回應課表原始碼, 分析課程內容並顯⽰示 ⼀般第三⽅服務 BOT
  33. 33. Application School Server 請求 回應 Cookie: gg=ininder; ⼀般第三⽅服務 BOT
  34. 34. Application School Server Cookie: gg=ininder; ⼀般第三⽅服務 BOT 請求 回應
  35. 35. Android Windows iOS
  36. 36. Android Windows iOS App.java App.cpp App.swift
  37. 37. 如果我們能把這樣功能的機器⼈人寫成 雲端服務,我們就可以更更多時間去陪 女朋友惹(不對,我沒有女朋友...)
  38. 38. 建⽴⼀個 第三⽅雲端服務
  39. 39. 建⽴⼀個第三⽅服務 Application (User Side) School Server Cookie: gg=ininder; 請求 回應
  40. 40. Application User Side School Server 請求 回應 Cookie: gg=ininder; 回應 請求 Cookie: gg=ininder; 建⽴⼀個第三⽅服務
  41. 41. 透過 Node.js + Express 建⽴服務
  42. 42. 建⽴ 雲端服務 Application User Side Cookie: gg=ininder; 回應 請求
  43. 43. HTTP Basic POST /?act=InInDer HTTP/1.1 HOST: big.gg.com girls=will&love=it
  44. 44. HTTP Basic POST /?act=InInDer HTTP/1.1 HOST: big.gg.com adr=have&cat=dog Header
  45. 45. HTTP Basic POST /?act=InInDer HTTP/1.1 HOST: big.gg.com adr=have&cat=dog Query
  46. 46. HTTP Basic POST /?act=InInDer HTTP/1.1 HOST: big.gg.com adr=have&cat=dog Body (POST)
  47. 47. Node.js + Request 模擬使⽤者瀏覽器⾏為
  48. 48. BOT ⾏為 School Server 請求 回應 Cookie: gg=ininder;
  49. 49. 傳遞 使⽤者的連線身份
  50. 50. 連線身份資訊保存 由單⼀應⽤程式記憶 Application (User Side) School Server Cookie: gg=ininder; 請求 回應
  51. 51. 變成針對不同使⽤者須使⽤不同的 連線身份去請求學校伺服器 Application School Server 請求 回應 Cookie: gg=ininder; 回應 請求 Cookie: gg=ininder;
  52. 52. ⽅法⼀ 後端使⽤ Session 的⽅式 記憶使⽤者的身份資訊
  53. 53. 雲端服務架構 Application School Server 請求 回應 Cookie: gg=ininder; 回應 請求 Cookie: gg=ininder;
  54. 54. 雲端服務架構 Application School Server 請求 回應 Cookie: key=9487; 回應 請求 Cookie: gg=SESSION[9487];
  55. 55. SESSION 會把你所有需要的資料 保存在 RAM 裡⾯面 ⼀一旦同時連線⼈人數過多、 來來不及釋放、 忘記釋放 然後就...
  56. 56. SESSION 會把你所有需要的資料 保存在 RAM 裡⾯面 ⼀一旦同時連線⼈人數過多、 來來不及釋放、 忘記釋放 然後就... HTTP Status 500 爆炸啦
  57. 57. ⽅法⼆ 使⽤者登入後把身份資訊存回 使⽤者瀏覽器的 Cookie 中
  58. 58. ⽅法⼆ 需要時再從使⽤者 Cookie 中領回 身份資訊並以此向學校伺服器請求
  59. 59. 將登入成功的身份資訊 保存入使⽤者端的 Cookie 中
  60. 60. 從使⽤者瀏覽器取出上⼀次身份資訊
  61. 61. 從網⾴原始碼 取出關鍵資訊
  62. 62. 從網⾴原始碼中取出關鍵資訊 1. JS ⽂文字處理理函數: substr, split, charAt, slice, … 2. 正規表達法: ^123([d]+)$ 3. Cheerio.js
  63. 63. JS ⽂字處理函數 var Str = ‘<title>Hello world</title>’ > Str = Str.slice(Str.indexOf('>') + 1) > Str = Str.slice(0, Str.indexOf(‘<')) > Str.split(' ')[1] 'world'
  64. 64. 正規表達法 var Str = ‘<title>Hello world</title>’ > Str.match(/<title>[^x20]+([^<]+)/)[1] ' world'
  65. 65. Cheerio.js var Str = ‘<title>Hello world</title>’ > Str = require(‘cheerio’).load(Str)('title').text() > Str.split(‘x20')[1] 'world'
  66. 66. aaaddress1/m00d1e.js
  67. 67. 學校電算中⼼ 常玩的檢測機制
  68. 68. 請求 Header 分析
  69. 69. 表單中按鈕的⽂字
  70. 70. 表單中按鈕的⽂字
  71. 71. 封包請求時間
  72. 72. CAPTCHA
  73. 73. 教育部青年發展協署
  74. 74. 教育部青年發展協署
  75. 75. CAPTCHA
  76. 76. 商⽤驗證碼辨識套件
  77. 77. 30cm.tw/?p=512
  78. 78. CAPTCHA
  79. 79. CAPTCHA
  80. 80. CAPTCHA
  81. 81. CAPTCHA
  82. 82. CAPTCHA
  83. 83. CAPTCHA
  84. 84. CAPTCHA
  85. 85. CAPTCHA
  86. 86. aaaddress1/easyChptchaOCR
  87. 87. 當然,還有更智障的⽅法
  88. 88. 當然,還有更智障的⽅法
  89. 89. 當然,還有更智障的⽅法 ✖ ✖ ✖
  90. 90. 當然,還有更智障的⽅法 ✖ ✖ ✖ ✖ ✖
  91. 91. 當然,還有更智障的⽅法 ✖ ✖ ✖ ✖ ✖ ✖ ✖
  92. 92. 當然,還有更智障的⽅法 ✖ ✖ ✖ ✖ ✖ ✖ ✖ ✖
  93. 93. 感謝被⼤同⼤學退學的丹尼同學 提供如此寶貴的建議
  94. 94. 奇技淫巧(⼀) 跨域名登入Moodle
  95. 95. Browser User Side School Server 請求 回應 Cookie: gg=ininder; 回應 請求 Cookie: gg=ininder; 第三⽅方服務
  96. 96. Browser User Side School Server 請求 Cookie: gg=ininder; 請求 Cookie: gg=ininder; 第三⽅方服務
  97. 97. Browser User Side School Server 請求 Cookie: gg=ininder; 第三⽅方服務 Cookie: gg=ininder; Cross-site request forgery
  98. 98. Content Security Policy (CSP)
  99. 99. 沒有任何解決辦法? 有ㄛ蒸蚌!
  100. 100. isu.30cm.tw/isuMoodle
  101. 101. isu.30cm.tw/isuMoodle
  102. 102. Cross Domain Login Moodle
  103. 103. Browser User Side School Server Cookie: gg=ininder; 第三⽅方服務 回應
  104. 104. Browser User Side Cookie: gg=ininder; 第三⽅方服務 回應 在使⽤用者⾴頁⾯面上建立起⼀一個 iframe 在內部寫入 moodle 登入畫⾯面的帳號密碼欄欄位 最後以 Javascript 模擬點擊登入
  105. 105. IFRAME User Side Moodle 請求 USERNAME = usr & PASSWORD = pass
  106. 106. IFRAME User Side Moodle 回應 Cookie: gg=ininder;
  107. 107. Browser User Side Moodle 回應 Cookie: gg=ininder;
  108. 108. Browser User Side Moodle 請求 Cookie: gg=ininder; 回應
  109. 109. github.com/aaaddress1/isuMaster-NodeJS
  110. 110. 奇技淫巧(⼆) 無痕模式下記憶帳密
  111. 111. github.com/Valve/fingerprintjs
  112. 112. github.com/aaaddress1/isuMaster-NodeJS
  113. 113. 莫風徵伴侶
  114. 114. QA aaaddress1@gmail.com

×