<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[JUNO_OKYO Blog]]></title><description><![CDATA[Creator of J2TEAM Security and J2TEAM Cookies]]></description><link>https://blog.junookyo.com</link><generator>RSS for Node</generator><lastBuildDate>Wed, 13 May 2026 15:01:57 GMT</lastBuildDate><atom:link href="https://blog.junookyo.com/rss.xml" rel="self" type="application/rss+xml"/><language><![CDATA[en]]></language><ttl>60</ttl><item><title><![CDATA[Phân tích trường hợp bị hack khi chạy code từ GitHub]]></title><description><![CDATA[Mấy hôm trước trên J2TEAM Community có một bài viết đề cập đến vấn đề “bị hack khi chạy code clone từ GitHub”. Bài viết nhanh chóng nhận được sự chú ý của thành viên trong nhóm.

Tóm tắt diễn biến:

Kẻ tấn công liên hệ qua LinkedIn, giới thiệu một cô...]]></description><link>https://blog.junookyo.com/bi-hack-khi-chay-code-github</link><guid isPermaLink="true">https://blog.junookyo.com/bi-hack-khi-chay-code-github</guid><category><![CDATA[Security]]></category><category><![CDATA[GitHub]]></category><category><![CDATA[Developer]]></category><dc:creator><![CDATA[JUNO_OKYO]]></dc:creator><pubDate>Fri, 22 Nov 2024 06:32:52 GMT</pubDate><content:encoded><![CDATA[<p>Mấy hôm trước trên <strong>J2TEAM Community</strong> có một bài viết đề cập đến vấn đề “<a target="_blank" href="https://www.facebook.com/groups/j2team.community/posts/2535166133482158/"><strong>bị hack khi chạy code clone từ GitHub</strong></a>”. Bài viết nhanh chóng nhận được sự chú ý của thành viên trong nhóm.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1732247838766/35df6b78-023b-4415-8a4f-634ebc1d9ab7.png" alt class="image--center mx-auto" /></p>
<p>Tóm tắt diễn biến:</p>
<ul>
<li><p>Kẻ tấn công liên hệ qua LinkedIn, giới thiệu một công việc liên quan đến hỗ trợ phát triển dự án</p>
</li>
<li><p>Sau khi đồng ý, bạn ấy được thêm vào một repository private trên GitHub</p>
</li>
<li><p>Khi clone mã nguồn về và chạy lệnh khởi động, quá trình tấn công sẽ được kích hoạt</p>
</li>
</ul>
<p>Phần dưới đây là những gì mình tìm hiểu thêm được về hình thức tấn công này.</p>
<h3 id="heading-ai-se-la-muc-tieu-cua-ke-tan-cong">Ai sẽ là mục tiêu của kẻ tấn công?</h3>
<p>Bài viết trên J2TEAM Community không phải là trường hợp đầu tiên. Bằng một vài từ khóa tìm kiếm trên Google, mình tìm được <a target="_blank" href="https://www.linkedin.com/posts/jamesruffer_new-scam-linkedin-user-will-message-you-activity-7216648692861161472-16jT/">bài viết sau trên LinkedIn</a>:</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1732248355725/bef1759a-bb24-47e8-99af-b0271b4c66c0.png" alt class="image--center mx-auto" /></p>
<p>Và <a target="_blank" href="https://www.reddit.com/r/webdev/comments/1ddpmiz/beware_of_scammers/">một bài trên Reddit</a>:</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1732248455137/f3a1ff93-ba6b-42a6-9a02-5409cb5b5986.png" alt class="image--center mx-auto" /></p>
<p>Dựa vào những bài viết ở trên, mình nhận thấy một số đặc điểm chung:</p>
<ul>
<li><p>Mục tiêu là <mark>những lập trình viên làm việc trong lĩnh vực web3/blockchain</mark></p>
</li>
<li><p>Nạn nhân được cấp quyền vào một private repo trên GitHub</p>
</li>
<li><p>Nạn nhân được thuyết phục chạy lệnh khởi động dự án hoặc build trên máy tính cá nhân</p>
</li>
</ul>
<p>Bài viết từ Reddit cho thấy những dấu hiệu đặc trưng của <strong>Stealer</strong> - loại mã độc chuyên đánh cắp thông tin. Một vụ việc nổi tiếng gần đây bạn có thể biết là <a target="_blank" href="https://vt.tiktok.com/ZSj9aUPNP/">Stealer giả mạo game WuKong</a>.</p>
<p>Thông tin phổ biến nhất mà Stealer thu thập là tài khoản và mật khẩu được lưu trữ trên trình duyệt. Với đối tượng là lập trình viên web3, mục tiêu chính của kẻ tấn công rất có thể là đánh cắp thông tin ví tiền điện tử, chẳng hạn như <strong>MetaMask</strong>.</p>
<h3 id="heading-ky-thuat-tan-cong">Kỹ thuật tấn công</h3>
<h4 id="heading-tan-cong-thong-qua-git-hook">Tấn công thông qua Git Hook</h4>
<p>Git hook là các tập lệnh tùy chỉnh được kích hoạt khi thực hiện các lệnh Git như <code>commit</code>, <code>rebase</code>, <code>merge</code>, <code>push</code>,… Mặc định, các hook này được lưu trong thư mục <code>.git/hooks</code>. Kẻ tấn công có thể lợi dụng Git hook để thực thi mã độc mỗi khi người dùng thực hiện một lệnh Git. Đây là <a target="_blank" href="https://www.reddit.com/r/git/comments/bk1eco/git_ransomware_anyone_else_been_a_victim/">một ví dụ</a>.</p>
<p>Mặc định thì thư mục <code>.git</code> sẽ được đặt thuộc tính ẩn (Hidden), nên nếu bạn không cài đặt cho máy tính hiển thị thư mục ẩn thì sẽ không để ý đến nó.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1732250940386/1c1ccb5f-41f6-4b60-817a-9623ba497237.png" alt class="image--center mx-auto" /></p>
<p><strong>Tuy nhiên</strong>, trong các trường hợp nạn nhân bị tấn công khi chạy lệnh như <code>start</code> hoặc <code>build</code>, các lệnh này thuộc về NPM chứ không liên quan trực tiếp đến Git. Vì vậy, chúng ta hãy đến với kiểu tấn công tiếp theo. Nhưng hãy nhớ: <mark>Bạn cũng cần cảnh giác với Git Hook!!!</mark></p>
<h4 id="heading-tan-cong-thong-qua-npm-script">Tấn công thông qua NPM Script</h4>
<p>Với các repo GitHub ở trên, điểm chung là sẽ có 1 file <code>package.json</code> như này:</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1732251676989/26828e1f-8b0a-432e-9822-fb97a3c91df1.png" alt class="image--center mx-auto" /></p>
<p><code>package.json</code> là file kê khai thông tin ứng dụng thường thấy trong các ứng dụng NodeJS. Nó cho biết các thông tin cơ bản như tên, phiên bản cho đến những thông tin khác như thư viện phụ thuộc mà ứng dụng của bạn cần sử dụng. Bạn cũng có thể đăng ký các lệnh có thể sử dụng thông qua mục “scripts” trong file này.</p>
<p>Ví dụ, đây là một lệnh độc hại được giả mạo lệnh <code>build</code>:</p>
<pre><code class="lang-json">{
  <span class="hljs-attr">"scripts"</span>: {
    <span class="hljs-attr">"start"</span>: <span class="hljs-string">"node app.js"</span>,
    <span class="hljs-attr">"build"</span>: <span class="hljs-string">"rm -rf / &amp;&amp; echo 'Malicious script executed!'"</span>
  }
}
</code></pre>
<p>Nhưng thế này thì lộ liễu quá! Kẻ tấn công thường sẽ ẩn trong file JS và áp dụng các kỹ thuật <strong>obfuscation</strong>.</p>
<blockquote>
<p>Trong phát triển phần mềm, <strong>obfuscation</strong> (làm rối mã) là hành động tạo ra mã nguồn hoặc mã máy mà con người hoặc máy tính khó hiểu được. Giống như việc làm rối trong ngôn ngữ tự nhiên, nó có thể sử dụng các biểu thức vòng vo không cần thiết để cấu thành các câu lệnh.</p>
<p>Lập trình viên có thể cố ý làm rối mã để che giấu mục đích của nó (bảo mật thông qua sự mơ hồ), logic của nó, hoặc các giá trị ngầm định được nhúng bên trong. Mục đích chính là ngăn chặn việc can thiệp, làm nản lòng các nỗ lực dịch ngược (reverse engineering), hoặc thậm chí tạo ra một câu đố hoặc thử thách mang tính giải trí cho người đọc mã nguồn.</p>
</blockquote>
<p>Dựa trên mã nguồn của repo GitHub mà thành viên J2TEAM Community chia sẻ, mình mở <code>package.json</code> và thấy được đăng ký lệnh start như sau:</p>
<pre><code class="lang-json"><span class="hljs-string">"scripts"</span>: {
    <span class="hljs-attr">"start"</span>: <span class="hljs-string">"node server/app.js | react-scripts start"</span>,
    <span class="hljs-attr">"build"</span>: <span class="hljs-string">"react-scripts build"</span>,
    <span class="hljs-attr">"test"</span>: <span class="hljs-string">"react-scripts test"</span>,
    <span class="hljs-attr">"eject"</span>: <span class="hljs-string">"react-scripts eject"</span>
  },
</code></pre>
<p>Ta thấy lệnh start này thực hiện 2 lệnh là <code>node server/app.js</code> và <code>react-scripts start</code>. Mình mở tiếp file <code>app.js</code>, thấy code khá bình thường. Mình suy đoán có thể mã độc nằm trong các file được require vào.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1732258907221/9c30f1e3-826b-408d-97a0-4f5529f1c19f.png" alt class="image--center mx-auto" /></p>
<p><code>fs</code>, <code>path</code> hay <code>http</code> đều là các thư viện sẵn có của NodeJS. Không có gì đáng ngờ. <code>express</code>, <code>socket.io</code>, <code>config</code> và <code>mongoose</code> thì là các thư viện phổ biến mình biết, nên có thể loại bỏ. <code>js-chess-engine</code> là một thư viện có 140 sao trên GitHub, không phổ biến, chúng ta cần để ý.</p>
<p>Mình chợt để ý tới dòng 15:</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1732259244089/52a8bc36-4fcd-4d35-83ac-203cd8d997c3.png" alt class="image--center mx-auto" /></p>
<p>Thông thường dev sẽ khai báo hết các câu <code>require</code> ở trên đầu, mình liền kiểm tra file token này.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1732259374454/ba6aa247-9675-4c85-8266-f7bdc571e3b3.png" alt class="image--center mx-auto" /></p>
<p>Nhìn mọi thứ rất bình thường đúng không? Nhưng mình chợt chú ý vào thanh cuộn ngang, có một đoạn code đã được đẩy ra rất xa bằng khoảng trắng (space).</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1732259513979/c3df98b1-7a83-473e-b293-8e637c17d8e5.png" alt class="image--center mx-auto" /></p>
<p>Đây là một đoạn JavaScript đã bị làm rối (obfuscation). Chắc chắn là nó!</p>
<p>Mình sử dụng công cụ <a target="_blank" href="https://beautifier.io/">làm đẹp mã nguồn</a> và kết hợp với ChatGPT để làm code “có thể đọc được” (readable) và diễn giải hành vi:</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1732259681685/36687859-4b6c-47f2-a09d-0edd205678c0.png" alt class="image--center mx-auto" /></p>
<p>Trích đoạn bài viết trong J2TEAM Community:</p>
<blockquote>
<p>- Khi clone về chạy thử thì cũng không thấy gì bất thường, thấy nó tự popup yêu cầu <mark>tải python về máy</mark> thì mình cũng chủ quan nghĩ rằng do bên phần mềm máy ảo yêu cầu nên accept luôn (máy ảo mình dùng là <strong>parallels desktop for Mac</strong>). Chạy source lên thì thấy game cũng khá chỉnh chu và có đầu tư [video 2], càng củng cố niềm tin của mình về ông khách này cho tới khi window báo lỗi</p>
<blockquote>
<p>"<strong>Failed to get data from the clipboard (error-2147221040: OpenClipboard Failed)</strong>" [ảnh 3],</p>
</blockquote>
<p>thì mình cũng bắt đầu nghi ngờ và check task manager - phần <strong>startup app</strong> phát hiện <mark>1 tiến trình lạ</mark> tên là "<strong>Window Update Script</strong>" có status enable [ảnh 4].</p>
</blockquote>
<p>Ta có thể nhận ra đoạn code JavaScript kia chính là code đã thực hiện tải Python, tạo file <strong>Window Update Script</strong> rồi thực thi nó. Đây là ảnh do bạn ấy cung cấp:</p>
<p><img src="https://scontent.fdad3-4.fna.fbcdn.net/v/t39.30808-6/467681377_1978080636043849_8548630210624444558_n.jpg?_nc_cat=104&amp;ccb=1-7&amp;_nc_sid=aa7b47&amp;_nc_eui2=AeENQ9O5giMTzJUiGUybgoMA_KEIKwXMlcv8oQgrBcyVy3H4M9T-kpL1TVJ72wDkYQjuHTwI-GIbbsPJ33vwQPti&amp;_nc_ohc=MkWlFCNpVPoQ7kNvgE0v4el&amp;_nc_zt=23&amp;_nc_ht=scontent.fdad3-4.fna&amp;_nc_gid=Adb8J59ivdWmmR-_g3fE4ST&amp;oh=00_AYB9DeaT59L_vWqi0mPIBlzb5Z0wbOEKI66FI0Ixg3yc6A&amp;oe=6746098C" alt="May be an image of text that says 'Microsoft Wind Task Manager ٣ a ヘ Name AnlaRa inah ballad Type Startup apps name, publisher, or PID ወ O... Windows Update Script Run new task Name Enable 0 Disable 田 nts Cloudflare WARP Publisher ጥ Status Microsoft Teams Last BIOS Startup impact Enabled Microsoft SecurityHealthSystray Not measured Terminal Enabled Not measured Enabled 0 Windows Update Script 2 Xbox Microsoft Corporation Not measured Disabled None Enabled Microsoft Corporation Not measured Disabled None'" /></p>
<p>Theo như chia sẻ từ bạn La Vi Sar trên nhóm:</p>
<blockquote>
<ul>
<li><p>Đoạn Script đã được obfuscation (thủ thuật làm rối code) [ảnh 5] và thực thi bằng đoạn script sau:</p>
</li>
<li><p><em>\= lambda</em> _ : <strong>import</strong>('zlib').decompress(<strong>import</strong>('base64').b64decode(__[::-1]))</p>
</li>
</ul>
</blockquote>
<p>Ta thấy kẻ tấn công sử dụng kết hợp <a target="_blank" href="https://docs.python.org/3/library/zlib.html">Zlib</a> (nén) và <a target="_blank" href="https://docs.python.org/3/library/base64.html">Base64</a> để che giấu.</p>
<p>Mã Python này sẽ làm gì? Dựa theo file bạn La Vi Sar cung cấp (https://codeshare. io/Q8zb1J), ta thấy các hành vi sau:</p>
<p>- Thêm đường dẫn vào danh sách loại trừ của Windows Defender</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1732262489180/22eaa876-01ff-45eb-a1d2-f1802c934139.png" alt class="image--center mx-auto" /></p>
<p>- Đăng ký khởi động cùng Windows, đặt tên “Runtime Broker” để ngụy trang</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1732262556320/94e22d66-c0a4-4a83-8bcb-0332ea3fbdd4.png" alt class="image--center mx-auto" /></p>
<p>- Tải file</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1732262732141/868f3b6a-0879-4959-a3ae-8cecd712783b.png" alt class="image--center mx-auto" /></p>
<p>- Yêu cầu chạy với quyền Admin</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1732262886253/78b4a768-eaed-44de-84ae-baed80a1021c.png" alt class="image--center mx-auto" /></p>
<p>- Các thư mục được truy cập:</p>
<ul>
<li><p>%APPDATA%\Microsoft\Windows\Applications</p>
</li>
<li><p>%LOCALAPPDATA%\Microsoft\Windows\Applications</p>
</li>
<li><p>Thư mục temp</p>
</li>
</ul>
<p>Dựa theo các từ khóa trong mã nguồn python thì mình tìm được nó chính là con malware được phân tích trong video này:</p>
<div class="embed-wrapper"><div class="embed-loading"><div class="loadingRow"></div><div class="loadingRow"></div></div><a class="embed-card" href="https://youtu.be/xoOfxz5w-p0">https://youtu.be/xoOfxz5w-p0</a></div>
<p> </p>
<p>Mã độc mà code python trên sẽ tải về và thực thi trên máy bạn là malware <strong>Tsunami</strong>.</p>
<h4 id="heading-tan-cong-thong-qua-dependency">Tấn công thông qua Dependency</h4>
<p>Ngoài việc chèn mã độc vào script, kẻ tấn công còn có thể khai thác dependency (thư viện phụ thuộc) độc hại. Những thư viện này được thêm vào mục <code>dependencies</code> hoặc <code>devDependencies</code> trong file <code>package.json</code>.</p>
<p>Hình thức tấn công này đặc biệt nguy hiểm bởi nó lợi dụng lòng tin của lập trình viên vào các thư viện bên thứ ba. Thậm chí, kẻ tấn công có thể:</p>
<ol>
<li><p><strong>Sử dụng thư viện phổ biến bị bỏ rơi</strong>: Chiếm quyền kiểm soát từ maintainer không còn duy trì thư viện, rồi chèn mã độc.</p>
</li>
<li><p><strong>Tạo thư viện trùng tên</strong>: Đặt tên gần giống với một thư viện nổi tiếng, khiến lập trình viên vô tình tải nhầm (<a target="_blank" href="https://www.kaspersky.com/resource-center/definitions/what-is-typosquatting">typosquatting</a>).</p>
</li>
</ol>
<h3 id="heading-ket-luan"><strong>Kết luận</strong></h3>
<p>Những hình thức tấn công qua <strong>Git hook</strong>, <strong>NPM script</strong>, hoặc <strong>dependency</strong> đều nhằm khai thác sự chủ quan của lập trình viên. Hãy luôn cẩn trọng khi làm việc với mã nguồn từ các nguồn không đáng tin cậy và duy trì thói quen kiểm tra kỹ lưỡng trước khi chạy bất kỳ lệnh nào trên máy cá nhân.</p>
<p>Khi nhận thấy các dấu hiệu bất thường, bạn nên ngừng ngay việc chạy mã và rà soát lại toàn bộ repository để phát hiện nguy cơ tiềm ẩn. Nếu có thể, hãy sử dụng các môi trường độc lập (sandbox) khi chạy lệnh nào đó.</p>
<p>Chúc mọi người an toàn!</p>
<hr />
<p>Xem thêm video phân tích: <a target="_blank" href="https://vt.tiktok.com/ZSj9wfNTH/">https://vt.tiktok.com/ZSj9wfNTH/</a></p>
<p><a target="_blank" href="https://linktr.ee/j2team">Theo dõi mình</a> để xem thêm các nội dung về công nghệ nhé!</p>
]]></content:encoded></item><item><title><![CDATA[Ai đó sử dụng mã Google Analytics của tui, tui lần theo và hack vào Database của hắn]]></title><description><![CDATA[Ngày hôm qua, trong lúc ngồi ở công ty, mình ngó qua Google Analytics để xem tình hình trang J2TEAM.dev ra sao. Chợt nhận thấy trong số các trang đang có người truy cập có tên là “clone-j2team.html”. Mình nghĩ thầm “haiz, thấy giao diện landing người...]]></description><link>https://blog.junookyo.com/canh-bao-extension-giao-dien-cu</link><guid isPermaLink="true">https://blog.junookyo.com/canh-bao-extension-giao-dien-cu</guid><category><![CDATA[hacking]]></category><category><![CDATA[chrome extension]]></category><dc:creator><![CDATA[JUNO_OKYO]]></dc:creator><pubDate>Sun, 27 Sep 2020 05:00:00 GMT</pubDate><content:encoded><![CDATA[<p>Ngày hôm qua, trong lúc ngồi ở công ty, mình ngó qua Google Analytics để xem tình hình trang J2TEAM.dev ra sao. Chợt nhận thấy trong số các trang đang có người truy cập có tên là “clone-j2team.html”. Mình nghĩ thầm “haiz, thấy giao diện landing người ta đẹp nên chôm đây mà”.</p>
<p><img src="https://j2team.dev/storage/canvas/images/Lj3eGh11NNHISrDoDOTAEb7Plggc6TWJQu7ofOJJ.png" alt="J2TEAM" class="image--center mx-auto" /></p>
<p>Tại sao mình nghĩ vậy? Đơn giản là vì khi ai đó sao chép mã nguồn của một trang web mà vô tình sao chép luôn cả mã theo dõi của Google Analytics (GA) thì khi mở trang đó lên nó sẽ được hiển thị luôn trong Dashboard của chủ mã GA. Điều này khá buồn cười vì lẽ ra Google nên xác minh truy vấn gửi về server có phải là từ tên miền được thiết lập khi tạo mã theo dõi mới.</p>
<p>Nghĩ thầm vậy thôi, do trước đây cũng có ông nào đó chôm giao diện Blog cá nhân của mình và cũng giữ luôn mã theo dõi trong đó nên mình nhanh chóng hiểu ra vấn đề. Điều này cũng chẳng quan trọng lắm, “giao diện mình đẹp thì người ta mới sao chép thôi” – mình nghĩ vậy, tắt tab GA đi rồi làm việc tiếp.</p>
<p>Tối về, ngồi ở nhà mở GA lên xem tình hình, chợt nhận thấy lưu lượng truy cập tăng cao so với mọi khi nhưng các trang hiện ra khá kì lạ. Một loạt các trang có chứa tham số theo dõi do FB thêm vào tự động (?fbclid=xxx) và một trang có tên “tutorial-gc.html” xuất hiện trong bảng báo cáo. Mình đã dùng CloudFlare để loại bỏ tham số theo dõi của FB nên các trang kia dù có đường dẫn là index nhưng chắc chắn không phải index của mình. “Nhiều trang mới xuất hiện thế này hẳn là thanh niên kia đã làm xong trang web và chia sẻ lên đâu đó nên có nhiều người vào rồi đây” – mình nghĩ thầm.</p>
<p>Lần này thì khác với lúc ở công ty, mình bắt đầu thấy khó chịu bởi khi có nhiều lưu lượng truy cập từ trang không phải của mình sẽ làm sai lệch báo cáo lưu lượng hàng tháng trong GA. Ngay lập tức, mình mở tab ẩn danh và tìm thử trên Google xem khi gặp trường hợp người khác sử dụng mã GA của mình trong trang của họ thì nên xử lý như nào.</p>
<p>Quả nhiên, mình không phải là người duy nhất gặp trường hợp này:</p>
<ul>
<li><p><a target="_blank" href="https://www.quora.com/What-happens-if-I-put-someone-elses-Google-Analytics-code-on-my-website">https://www.quora.com/What-happens-if-I-put-someone-elses-Google-Analytics-code-on-my-website</a></p>
</li>
<li><p><a target="_blank" href="https://webmasters.stackexchange.com/questions/28994/someone-else-is-using-our-google-analytics-tracking-code-number-what-do-we-do">https://webmasters.stackexchange.com/questions/28994/someone-else-is-using-our-google-analytics-tracking-code-number-what-do-we-do</a></p>
</li>
</ul>
<p>Nhờ câu trả lời trên Stackexchange, mình biết tới tính năng <a target="_blank" href="https://support.google.com/analytics/answer/1033162?hl=en">tạo bộ lọc trong GA</a>. Ngay lập tức mình làm theo, và đây là lúc câu chuyện thú vị hơn bắt đầu diễn ra.</p>
<p>Khi tạo bộ lọc mới, GA cho phép chúng ta xác nhận thử xem bộ lọc mới hoạt động đúng hay không, mình nhấn thử “Verify this filter” (Kiểm tra bộ lọc này) thì thấy hiện ra các danh sách tên miền bị lọc khỏi kết quả. Phải nói trước là vốn dĩ mình chỉ định lọc đống kết quả sai ra khỏi Dashboard của mình chứ không quan tâm chúng là gì. Nhưng nhờ tính năng xem thử các tên miền bị lọc, mình vô tình phát hiện ra một chiến dịch tấn công người dùng FB đang diễn ra nhắm vào những ai muốn tiếp tục sử dụng giao diện cũ của FB.</p>
<p><img src="https://j2team.dev/storage/canvas/images/FE4VbyjZEoWjEi7yWRm6c75nDCERFynMDJbQqpJX.png" alt="J2TEAM" class="image--center mx-auto" /></p>
<p>Từ bảng trên, mình dễ dàng nhận ra trang đang tạo ra rất nhiều lưu lượng sai về tài khoản GA của mình là 2 trang old-xxx. Nhìn theo sub-domain, ta có thể đoán 2 trang này là 1, được deploy lên netlify và thêm tên miền tùy chỉnh vào.</p>
<p>Vào ngó thử coi, quả nhiên giao diện chôm từ J2TEAM.dev qua, thậm chí cái logo JUNO_OKYO trên góc trái của mình vẫn còn giữ nguyên chưa thay đổi.</p>
<p><img src="https://j2team.dev/storage/canvas/images/5fqIoZqYiR98wUh47k9sUG1HY6GsOeVnflD6FGIM.png" alt="J2TEAM" class="image--center mx-auto" /></p>
<p>Cũng chưa có gì đáng để bàn cho lắm, mình chợt có chút tò mò về cái extension này hoạt động ra sao, bởi trước đó mình đã biết về một extension khác với tên là Old Layout với cùng tính năng chuyển giao diện mới của Facebook về giao diện cũ. Mình biết Old Layout hoạt động bằng cách chuyển đổi User-Agent của trình duyệt rồi, nên tự nhủ trong đầu rằng “cái Old XXX này hoạt động dựa trên cái gì ta?”. Thế là nhấn luôn nút đầu tiên, cái extension này chưa có mặt trên Chrome Store nên tác giả đang để link tải file nén về. Tốt thôi, ta sẽ dễ dàng hơn để ngó qua mã nguồn.</p>
<p>Giải nén xong, mình mở ngay file đầu tiên trong thư mục: “background.js”.</p>
<p>Trời ạ, ra là vậy! Hóa ra không chỉ sao chép giao diện trang web, tới cái extension cũng chỉ là chôm mã nguồn từ Old Layout và đổi tên thành extension mới, dựng trang web mới rồi kiếm người dùng. Mình nhận ra ngay bởi mình đã ngó qua extension Old Layout khi nó mới ra mắt. Để kiểm chứng, đây là hình so sánh 2 file “background.js” (Old Layout ở bên trái).</p>
<p><img src="https://j2team.dev/storage/canvas/images/RjalNZAeEao3PbxJMspj8NyOgPJsuLjWIZN5xhda.png" alt="J2TEAM" class="image--center mx-auto" /></p>
<p>Như các bạn thấy đó, file background.js của cả 2 extension này chẳng có gì khác nhau cả.</p>
<p>Chưa hết!! Khi mở tiếp file manifest.json – nếu bạn chưa biết thì đây là file khai báo thông tin, quyền hạn của extension – mình đã nhận ra có sự khác biệt giữa 2 extension.</p>
<p><img src="https://j2team.dev/storage/canvas/images/qUpiVB7VIVGrESdQN5Jwug95KSYRhFd0bMosgSWp.png" alt="J2TEAM" class="image--center mx-auto" /></p>
<p>Extension “xịn” (Old Layout) chỉ “xin” 3 quyền, trong khi extension “rỏm” thì xin thêm những 6 quyền mới. Để làm chi ta?? Không những vậy, extension rỏm còn yêu cầu được hoạt động ở cả chế độ ẩn danh! “Chết thật, nhỡ người ta coi phim bị lưu lại link thì sao?” – :chim-cánh-cụt:.</p>
<p>Mở tiếp file options.js, mình không thấy có gì lạ, à thì… cũng không có gì khác file options.js của extension xịn. Nhưng tới file popup.js, mình chợt để ý là extension xịn làm quái gì có file này. Hmm… có gì đó hay ho đây.</p>
<p>Mở file lên, đập vào mắt mình là một đống hổ lốn những tên miền gì đó. Nhìn số dòng code, file này lên tới <strong>8420 dòng</strong>. Kéo luôn xuống cuối thì thứ “hay ho” xuất hiện:</p>
<p><img src="https://j2team.dev/storage/canvas/images/PslQyMBAcCWVKultIYLZOWNdX8vjiBXboCaQH3rL.png" alt="J2TEAM" class="image--center mx-auto" /></p>
<p>Giải thích cho bạn nào chưa hiểu, hàm trên sẽ lấy toàn bộ cookies, rồi kiểm tra xem có cookie nào được tạo ra cho tên miền “.facebook.com” hay không, nếu có thì gửi cookie này về Database (cơ sở dữ liệu).</p>
<h3 id="heading-hack-nguoc-vao-database-cua-ke-tan-cong"><strong>Hack ngược vào Database của kẻ tấn công</strong></h3>
<p>Đây là phần hấp dẫn nhất của bài viết, nếu bạn nào còn nhớ thì đây không phải là lần đầu mình làm chuyện này (xem lại <a target="_blank" href="https://j2c.cc/f2dbfafc">bài phân tích và “hack ngược”</a> năm 2017).</p>
<p>File popup.js ở trên được nhúng vào popup.html cùng các thư viện để kết nối với Database (DB), mình hiểu ra là có thể lợi dụng điều này để gửi các truy vấn khác tới DB. Ngay lập tức, mình tạo một hồ sơ mới trên Chrome (để đảm bảo an toàn cho tài khoản của mình thì hồ sơ mới sẽ giống như sandbox vậy). Cài extension kia vào hồ sơ mới rồi nhấn chuột phải vào biểu tượng extension &gt; chọn Inspect popup (tính năng này giống như bạn Inspect element trên các trang web ấy, nhưng cái này thì dành cho việc debug extension).</p>
<p>DevTools thần thánh hiện lên, mình chuyển qua tab Console, gõ hai chữ thân thương “db” &gt; ENTER. Vì sao là “db” thì bạn chú ý xem lại ảnh ở trên mà mình chụp flie popup nhé.</p>
<p><img src="https://j2team.dev/storage/canvas/images/TLxUdZ2leqiwflshuoY3YlUjbAkRKfQNHVKnj37Z.png" alt="J2TEAM" class="image--center mx-auto" /></p>
<p>Đúng như kết quả mình mong đợi, biến này truy cập được từ “global” và mình có thể gọi các phương thức mình muốn bằng DevTools để gửi truy vấn tới DB. Thực ra thì kể cả không như mong đợi chúng ta cũng đang nắm trong tay mã nguồn mà. Có thể sửa <a target="_blank" href="https://vi.wikipedia.org/wiki/T%E1%BA%A7m_v%E1%BB%B1c">tầm vực của biến</a> thoải mái (tầm vực là phạm vi biến hoạt động trong một chương trình).</p>
<p>Giờ thì, dựa trên kinh nghiệm làm việc với loại DB này trước đây (mình từng dùng loại DB này hồi 2014-2015 khi làm trang “get link phim Nhật”), mình nhanh chóng truy vấn thử để kiểm tra xem có thể đọc record từ DB hay không.</p>
<p><img src="https://j2team.dev/storage/canvas/images/Bd18FKok36IGK58NyGO0y75WT9KE6GPNHOqufCdn.png" alt="J2TEAM" class="image--center mx-auto" /></p>
<p>Rồi xong, thanh niên này đã không cấu hình quy tắc bảo mật để phân quyền đọc DB, khiến bất cứ ai cũng có quyền truy cập vào DB này. Mình ngay lập tức mở Sublime lên code nhanh một chương trình để quản lý DB dựa trên thông tin cấu hình nhúng trong extension và các câu truy vấn mà mình đã biết từ ngày xưa khi làm việc với nó. Kết quả:</p>
<p><img src="https://j2team.dev/storage/canvas/images/wV9YFTEl3nFtwp9V3idPZPBxhCZ7xbiHBHXzaBGA.png" alt="J2TEAM" class="image--center mx-auto" /></p>
<p>Đây là toàn bộ cookie mà kẻ xấu đã chôm được của người dùng, mình viết thêm một hàm nhỏ để bóc tách ID người dùng từ cookie để biết ai đang bị tấn công.</p>
<h3 id="heading-ket-luan"><strong>Kết luận</strong></h3>
<p>Qua bài viết sau, mình muốn gửi lời cảnh báo tới mọi người không nên vì muốn sử dụng giao diện cũ của FB mà cài đặt tùy tiện các extension từ những người không đáng tin, đây là nguy cơ cao dẫn đến việc mất tài khoản FB của bạn. Chia sẻ bài viết này tới người thân và bạn bè để cùng cảnh giác nhé!</p>
<p>Trên <a target="_blank" href="https://www.facebook.com/groups/j2team.community/">J2TEAM Community</a> cũng đã có một bài <a target="_blank" href="https://www.facebook.com/groups/j2team.community/permalink/1388065971525519/">hướng dẫn cách chuyển về giao diện cũ</a> mà bạn không cần cài gì cả.</p>
<p>Như vậy là chỉ từ việc bị người khác sử dụng mã Google Analytics, mình đã truy vết và lần ra cả một chiến dịch tấn công người dùng FB dựa trên ham muốn sử dụng giao diện cũ của mọi người. Và mình tin, kẻ tấn công đến từ Việt Nam. Tại sao à? Hãy nhìn nơi tên miền được đăng ký:</p>
<p><img src="https://j2team.dev/storage/canvas/images/aDQyX9R9V4xXPOhXouAuildxUjsRwICuDGfLFIuV.png" alt="J2TEAM" class="image--center mx-auto" /></p>
<p>Và bây giờ thì…</p>
<p><img src="https://j2team.dev/storage/canvas/images/1DLVCqZTSmT8nZ5Nqx7U6ddG3Cjh3UmfHwYKSFRN.png" alt="J2TEAM" class="image--center mx-auto" /></p>
<p>Chào tạm biệt và hẹn gặp lại trong bài tiếp theo!</p>
<p><a target="_blank" href="https://www.facebook.com/groups/364997627165697/">  
</a></p>
]]></content:encoded></item><item><title><![CDATA[Cách "hack" Wifi của Highlands Coffee, CGV và Vincom]]></title><description><![CDATA[Giật tít thế chứ trong bài này mình sẽ chia sẻ với các bạn một mẹo để có thể sử dụng Wifi nhanh, không cần chờ đợi hay nhập thông tin, hoàn toàn không "hack" gì nha!!
Nếu như trước đây chúng ta đi tới đâu thường hay phải hỏi "Bạn ơi, cho mình hỏi mật...]]></description><link>https://blog.junookyo.com/hack-wifi-highlands-coffee-cgv-vincom</link><guid isPermaLink="true">https://blog.junookyo.com/hack-wifi-highlands-coffee-cgv-vincom</guid><category><![CDATA[hacking]]></category><dc:creator><![CDATA[JUNO_OKYO]]></dc:creator><pubDate>Thu, 18 Jun 2020 05:00:00 GMT</pubDate><content:encoded><![CDATA[<p>Giật tít thế chứ trong bài này mình sẽ chia sẻ với các bạn một mẹo để có thể sử dụng Wifi nhanh, không cần chờ đợi hay nhập thông tin, hoàn toàn không "<a target="_blank" href="https://j2team.dev/blog/lo-hong-xss-tren-google-translate-tien-thuong-3133-70">hack</a>" gì nha!!</p>
<p>Nếu như trước đây chúng ta đi tới đâu thường hay phải hỏi "Bạn ơi, cho mình hỏi mật khẩu wifi ở đây với?!", thì giờ đây, ở các quán cafe hay trung tâm thương mại sẽ sử dụng <strong>Wifi Marketing</strong> (tiếp thị Wifi).</p>
<h3 id="heading-wifi-marketing-la-gi"><strong>Wifi Marketing là gì?</strong></h3>
<p>Wifi Marketing hay tiếp thị wifi là cách quảng bá sản phẩm, dịch vụ hoặc thu thập thông tin khách hàng qua mạng lưới wifi được sử dụng miễn phí.</p>
<p><img src="https://j2team.dev/storage/canvas/images/IGJgS5lmG7ePw43nNK3VfkfwvA2cjhIKljoquuaU.png" alt="J2TEAM" /></p>
<p>AWING là công ty đứng sau các hệ thống Wifi Marketing của Vincom, Golden Gate hay Highlands Coffee… Nếu bạn đã ít nhất một lần sử dụng hệ thống Wi-Fi miễn phí tại đây, bạn sẽ không khó nhận ra dòng chữ AWING trên nền đỏ.</p>
<p><img src="https://j2team.dev/storage/canvas/images/PiSYoBew8A1Cxv28MzhqqyR1beHSngroTeCQ4Ftj.png" alt="J2TEAM" /></p>
<p>Để có thể sử dụng Wifi, thay vì phải đi hỏi mật khẩu như trước đây thì giờ bạn chỉ cần nhấn kết nối với Wifi, một trang hiển thị Quảng cáo sẽ hiện lên với nút Kết nối Internet. Thường thì bạn sẽ phải nhập thông tin cá nhân (như hình dưới) hoặc phải xem hết một Quảng cáo nào đó (trong khoảng 15-30 giây chẳng hạn).</p>
<p>Nếu bạn là người ghét sự phiền toái của sự chờ đợi hay phải cung cấp thông tin cá nhân giống như mình. Thì đây chính là lý do của bài viết này!</p>
<h3 id="heading-hack-wifi-cua-highlands-coffee-cgv-va-vincom-nhu-the-nao"><strong>“Hack” Wifi của Highlands Coffee, CGV và Vincom như thế nào?</strong></h3>
<p>Trong trường hợp này, mình sử dụng từ “hack” với hàm ý là vượt qua việc chờ đợi, nhập thông tin hay phải xem quảng cáo của trang kết nối Wifi. Cách thực hiện rất đơn giản:</p>
<p><strong>Bước 1:</strong> Nhấn F12 để mở Dev Tools &gt; chuyển qua tab Console (nếu chưa).</p>
<p><strong>Bước 2:</strong> Sao chép và dán vào đoạn mã sau và nhấn ENTER: <code>document.querySelector('form').submit();</code></p>
<p>Xong! Bạn đã <strong>kết nối Internet</strong> mà không cần nhập thông tin cá nhân.</p>
<h3 id="heading-bookmarklet"><strong>Bookmarklet</strong></h3>
<p>Để tối ưu thao tác, mình sẽ hướng dẫn các bạn tạo bookmarklet để dùng trong các lần sau:</p>
<p><strong>Bước 1:</strong> Nhấn chuột phải vào thanh bookmark (đánh dấu trang) &gt; Thêm trang mới (Add page).</p>
<p><strong>Bước 2:</strong> Đặt tên bất kỳ cho bookmark, ví dụ: <strong>Connect Wifi</strong>. Ở phần URL, dán vào đoạn mã sau và lưu lại: <code>javascript:document.querySelector('form').submit();</code></p>
<p>Xong! Từ giờ trở đi mỗi lần nhấn kết nối Wifi, trang quảng cáo hiện ra thì các bạn hãy nhấn nút Connect Wifi trên thanh đánh dấu của bạn (thay vì phải mở Dev Tools và chạy mã lệnh).</p>
<h3 id="heading-extension-giup-ket-noi-tu-dong"><strong>Extension giúp kết nối tự động</strong></h3>
<p>Dựa theo đoạn mã ở trên, mình có một ý tưởng là làm một <a target="_blank" href="https://j2team.dev/blog/j2team-security-bao-mat-tai-khoan-facebook">extension</a> mà mỗi khi trang connect.awing.vn được mở ra, extension sẽ ngay lập tức thực thi đoạn mã và bạn sẽ kết nối với Internet ngay lập tức mà không cần làm gì cả.</p>
<p>Mình sẽ cập nhật link tải extension trong bài này sau nhé.</p>
<p>Nếu thấy bài viết hữu ích, hãy chia sẻ nó với bạn bè để ủng hộ tác giả viết nhiều hơn, hehe!</p>
]]></content:encoded></item><item><title><![CDATA[Lý do không nên cài nhiều extension! Báo cáo hiệu suất Chrome Extension 2020]]></title><description><![CDATA[Là một nhà phát triển extension cho trình duyệt, bản thân tớ khá quan tâm tới vấn đề hiệu suất, kích cỡ sau khi đóng gói extension để xuất bản lên Chrome Store. Tớ đã kiểm tra xem 1000 extension phổ biến nhất cho Chrome ảnh hưởng thế nào tới hiệu suấ...]]></description><link>https://blog.junookyo.com/bao-cao-hieu-suat-chrome-extension-2020</link><guid isPermaLink="true">https://blog.junookyo.com/bao-cao-hieu-suat-chrome-extension-2020</guid><category><![CDATA[chrome extension]]></category><dc:creator><![CDATA[JUNO_OKYO]]></dc:creator><pubDate>Wed, 17 Jun 2020 05:00:00 GMT</pubDate><content:encoded><![CDATA[<p>Là một nhà phát triển <a target="_blank" href="https://j2team.dev/blog/j2team-cookies-netflix-grammarly">extension cho trình duyệt</a>, bản thân tớ khá quan tâm tới vấn đề hiệu suất, kích cỡ sau khi đóng gói extension để xuất bản lên Chrome Store. Tớ đã kiểm tra xem 1000 extension phổ biến nhất cho Chrome ảnh hưởng thế nào tới hiệu suất trình duyệt. Và đây là kết quả!</p>
<p>Các số liệu chính mà tớ đánh giá là mức tiêu thụ CPU, mức tiêu thụ bộ nhớ và liệu extension có khiến trang hiển thị chậm hơn hay không (tốc độ render).</p>
<h3 id="heading-tac-dong-toi-hieu-suat-cua-top-100-extension"><strong>Tác động tới hiệu suất của Top 100 Extension</strong></h3>
<p>Chúng ta cùng bắt đầu với 100 extension được sử dụng nhiều nhất trên Chrome nhé! Mỗi một extension dưới đây đều có trên 2 triệu lượt cài đặt.</p>
<p>Chúng ta sẽ nhìn vào 4 điểm khác nhau:</p>
<ul>
<li><p>Thời gian CPU của trang: Luồng chính (main thread) của trang chạy trong bao lâu và nó làm gì?</p>
</li>
<li><p>Độ trễ hiển thị trang (render): Mất bao lâu để trang bắt đầu hiển thị nội dung?</p>
</li>
<li><p>Thời gian CPU chạy nền: Extension xử lý bao nhiêu tác vụ trong trang nền?</p>
</li>
<li><p>Mức tiêu thụ bộ nhớ trình duyệt: Các thành phần khác nhau của trình duyệt sử dụng hết bao nhiêu bộ nhớ?</p>
</li>
</ul>
<h3 id="heading-thoi-gian-cpu-cua-trang"><strong>Thời gian CPU của trang</strong></h3>
<p>Các đoạn mã JavaScript khi thực thi và xử lý logic bố cục trang sẽ chặn luồng chính của trình duyệt (render-blocking), khiến trình duyệt không thể phản hồi tương tác của người dùng.</p>
<p>Trong trường hợp nếu không có extension nào được cài đặt thì thời gian tải trang example.com sẽ mất khoảng 40ms. Nếu bạn cài Evernote hoặc Grammarly thì thời gian này sẽ tăng lên hơn 500ms.</p>
<p>Biểu đồ dưới đây hiển thị 20 extension Chrome làm trang tải chậm nhất trong số 100 extension được sử dụng nhiều nhất. 80 extension còn lại chỉ tăng thời gian lên thêm dưới 100ms.</p>
<p><img src="https://j2team.dev/storage/canvas/images/gE2WyEsw5FslayVcm13ipKoQCEF52RiVoKfZuUPt.png" alt="J2TEAM" class="image--center mx-auto" /></p>
<p>Thay vì hoạt động trên các trang đặc biệt, những extension này chèn code vào mọi trang được mở bởi người dùng. Hãy xem thử một trong số chúng làm gì nhé!</p>
<p><strong>Evernote Web Clipper</strong></p>
<p>Extension này có hơn 4 triệu người dùng. Nó thêm mã JavaScript có kích cỡ hơn 2.9MB vào mọi trang. Thời gian để xử lý và biên dịch đoạn mã này là 140ms.</p>
<p><img src="https://j2team.dev/storage/canvas/images/lSyxZ2XGoF5iMadIptbedWCLm67gcLE24g0JfYDt.png" alt="J2TEAM" class="image--center mx-auto" /></p>
<p>Một khi gói mã đó được nạp và thực thi, nó tiêu tốn thêm 300ms nữa.</p>
<p>Đoạn mã này thực sự có làm bất cứ điều gì không? <strong>Không!</strong> Trừ khi người dùng nhấn vào biểu tượng của Evernote.</p>
<p>Đoạn mã này sẽ thiết lập một trình lắng nghe sự kiện để thực thi khi người dùng nhấn vào biểu tượng extension, nhưng điều này có thể được thực hiện được mà không cần nạp toàn bộ gói mã JavaScript trên.</p>
<p><strong>Grammarly, Clever, Avira Password Manager, Skype</strong></p>
<p>Các extension dưới đây cũng làm điều tương tự: nạp một đống mã lệnh không cần thiết.</p>
<p><img src="https://j2team.dev/storage/canvas/images/BZX9w0j5ctpSIEqoJ89KsUPH8Y3pBn278HJgtCVZ.png" alt="J2TEAM" class="image--center mx-auto" /></p>
<p>Các extension thường xuyên chèn mã vào tất cả các trang, thay vì chỉ chèn trong một số tên miền chỉ định. Trình quản lý mật khẩu (như Avira Password Manager) thì cần kiểm tra xem trong trang có cái form đăng nhập nào không. Tiện ích kiểm tra ngữ pháp (như Grammarly) thì cần coi xem có ô nhập văn bản nào không.</p>
<p>Tuy nhiên, để có hiệu suất tốt hơn, các đoạn mã kiểm tra điều kiện nên được tách biệt với đoạn mã chức năng chính của extension. Phần lớn đoạn mã chỉ nên nạp khi cần thiết. Honey đã thực hiện thay đổi này vào năm ngoái và nó thực sự cải thiện tác động về hiệu suất.</p>
<p>Thú vị thay, Skype chỉ tăng thêm 150ms thời gian CPU, dù cho nó có một gói mã JavaScript với dung lượng khá lớn. Theo tớ thì điều này là do mã của nó chủ yếu bao gồm các object cấu hình tĩnh và các chuỗi để phân tích và thực thi.</p>
<p><strong>Ghostery</strong></p>
<p>Tớ đã rất ngạc nhiên khi thấy Ghostery ở vị trí tương đối cao trong danh sách. Không giống như các extension khác, đoạn mã được chèn vào thực sự làm điều gì đó trên trang, cụ thể là hiển thị cho người dùng biết có bao nhiêu trình theo dõi đã bị chặn.</p>
<p>Ghostery chèn đoạn mã JavaScript có kích cỡ 160KB và làm tăng thêm 120ms thời gian CPU – không phải là một con số lớn. Tuy nhiên, một vài đoạn mã trong số này là render-blocking (chặn quá trình hiển thị trang), chúng ta sẽ xem xét trong phần tiếp theo.</p>
<h3 id="heading-do-tre-hien-thi-trang"><strong>Độ trễ hiển thị trang</strong></h3>
<p>Để kiểm tra xem liệu extension có chặn hiển thị trang hay không chúng ta có thể nhìn vào số liệu <a target="_blank" href="https://web.dev/first-contentful-paint/">First Contentful Paint</a> (FCP) – thời điểm trình duyệt bắt đầu hiển thị văn bản hoặc hình ảnh.</p>
<p>Biểu đồ sau là danh sách các extension có ảnh hưởng lớn nhất tới FCP.</p>
<p><img src="https://j2team.dev/storage/canvas/images/ZpQZHhNJ0fdhJHvfUEG8UDtl2OxiGBPhvJrBtm8M.png" alt="J2TEAM" class="image--center mx-auto" /></p>
<p>Các extension Chrome có thể chỉ định các đoạn mã JavaScript và CSS cần chèn vào trang. Theo mặc định, chúng sẽ được chèn vào trang sau khi trang tải xong và ở trạng thái không hoạt động (idle).</p>
<p>Tuy nhiên, các nhà phát triển có thể quyết định nạp các tài nguyên này ngay khi trang bắt đầu tải. Ví dụ: Dark Reader thay đổi nội dung trang thành giao diện tối. Sẽ thật kì quặc nếu trang hiển thị trong một giao diện sáng và sau đó đột ngột chuyển thành tối. Trường hợp này thì rất hợp lý để chèn mã (CSS/JS) trước khi trang bắt đầu hiển thị, để ngay khi trang bắt đầu hiển thị thì người dùng đã thấy giao diện tối vì CSS đã nạp xong.</p>
<p>Số lượng mã được chèn vào trang nên được giảm đến mức tối thiểu. Tin vui là chỉ có 6 trong số các extension ở biểu đồ trên gây ra độ trễ hiển thị hơn 100ms.</p>
<h3 id="heading-thoi-gian-cpu-chay-nen"><strong>Thời gian CPU chạy nền</strong></h3>
<p>Không phải mọi tiến trình mà một extension trình duyệt hoạt động đều diễn ra trên một trang mà người dùng có thể nhìn thấy. Hầu hết các extension Chrome sử dụng thêm một thứ gọi là trang nền (background page), trang này cho phép extension thực hiện những việc như lắng nghe các truy vấn HTTP hoặc cập nhật biểu tượng extension.</p>
<p>Ví dụ: <a target="_blank" href="https://j2team.dev/blog/j2team-security-bao-mat-tai-khoan-facebook">J2TEAM Security</a> sử dụng trang nền để lắng nghe các truy vấn cập nhật trạng thái đọc tin nhắn do Facebook gửi, từ đó tạo ra tính năng "chặn seen" mà các bạn đang dùng hằng ngày. Hay các extension chặn Quảng cáo như uBlock sẽ dùng trang nền để chặn các truy vấn nạp quảng cáo trên các trang web.</p>
<p><img src="https://j2team.dev/storage/canvas/images/41dK92U9NSxJVnCIp8YqkPi1XdLfGTu7isfZPiXz.png" alt="J2TEAM" class="image--center mx-auto" /></p>
<p>Avirar Browser Safety dành gần 3s để chạy mã trong trang nền, trong khi tất cả các extension khác chỉ tiêu tốn dưới 200ms.</p>
<h3 id="heading-muc-do-tieu-thu-bo-nho-trinh-duyet"><strong>Mức độ tiêu thụ bộ nhớ trình duyệt</strong></h3>
<p>Các extension có thể làm tăng mức tiêu thụ bộ nhớ, dù là các trang được mở bởi người dùng hay trong các trang nền của extension.</p>
<p>Một lần nữa, Avira Browser Safety đứng đầu danh sách này, nó tăng mức tiêu thụ bộ nhớ thêm 218MB.</p>
<p><img src="https://j2team.dev/storage/canvas/images/SPfrnvDc1jxyFu4KxskGIvxQmdVaRXg3fRYkWxzF.png" alt="J2TEAM" class="image--center mx-auto" /></p>
<p>Một số trang nền cũng có thể chứa iframe, ví dụ như extension Amazon Assistant:</p>
<p><img src="https://j2team.dev/storage/canvas/images/lHKmUjGOEWblcrfQJxP6TvMjY9Wyvp0Njfsl9KYj.png" alt="J2TEAM" class="image--center mx-auto" /></p>
<p>Một extension với trang nền thường làm tăng mức tiêu thụ bộ nhớ thêm ít nhất là 10MB. Nếu không có trang nền nào và chỉ có một tệp mã nhỏ chạy trên trang thì tác động tới bộ nhớ có thể ở mức tối thiểu.</p>
<h3 id="heading-cac-nha-phat-trien-extension-co-the-lam-gi-de-toi-uu-hieu-suat"><strong>Các nhà phát triển extension có thể làm gì để tối ưu hiệu suất?</strong></h3>
<p>Các nhà phát triển có thể giới hạn chi phí hiệu suất bằng cách chỉ tải các tệp mã lệnh khi cần thiết. Nếu có thể, hãy dùng bộ lọc URL được cung cấp bởi nền tảng extension của Chrome/Chromium.</p>
<p>Nếu đó không phải là một cách hợp lý trong trường hợp extension của bạn, hãy sử dụng một đoạn mã nhỏ để kiểm tra xem extension có cần thực hiện điều gì đó trên trang hay không. Nếu có, đoạn mã nhỏ này có thể nạp thêm đoạn mã bổ sung.</p>
<p>Tuyệt đối tránh tải các tệp lệnh nội dung ở thời điểm document_start. Cố gắng giữ kích thước mã dưới 100KB.</p>
<p>Nếu có bộ lọc URL, tránh lặp lại danh sách hàng ngàn URL, đặc biệt nếu điều kiện phụ thuộc vào logic phức tạp hoặc các biểu thức chính quy (regex).</p>
<p>Nếu extension của bạn cập nhật biểu tượng trong thời gian chạy (runtime), hãy trì hoãn việc này. Mỗi lần cập nhật chỉ mất khoảng 25ms, nhưng điều này sẽ tăng thêm nếu bạn cập nhật biểu tượng 10 lần trong khi đang tải trang.</p>
<h3 id="heading-ket-luan"><strong>Kết luận</strong></h3>
<p>Hầu hết các trang web mất ít nhất một giây để tải, vì vậy nếu một extension tăng thêm 100ms có thể người dùng không nhận thấy. Tuy nhiên, điều này xảy ra với mọi trang sẽ thật tệ. Bởi vì mọi người thường cài đặt rất nhiều extension chứ không chỉ một, nên một tác động nhỏ về hiệu suất có thể cộng dồn lại thành một hiệu ứng tiêu cực lớn đối với trải nghiệm người dùng.</p>
<p>Nếu thấy bài viết hữu ích, hãy chia sẻ với mọi người nhé!</p>
<p><em>Theo debugbear.com</em></p>
]]></content:encoded></item><item><title><![CDATA[Cách sử dụng J2TEAM Security để bật khiên avatar Facebook]]></title><description><![CDATA[J2TEAM Security là một tiện ích phổ biến đối với người dùng Facebook tại Việt Nam, tiện ích mở rộng cho trình duyệt này giúp bạn tăng cường bảo mật cho tài khoản Facebook cũng như mang lại nhiều tính năng cực kỳ hấp dẫn.
Trong bài viết này, tớ sẽ hướ...]]></description><link>https://blog.junookyo.com/j2team-security-bat-khien-avatar-facebook</link><guid isPermaLink="true">https://blog.junookyo.com/j2team-security-bat-khien-avatar-facebook</guid><category><![CDATA[Facebook]]></category><category><![CDATA[Tutorial]]></category><category><![CDATA[j2team]]></category><category><![CDATA[chrome extension]]></category><dc:creator><![CDATA[JUNO_OKYO]]></dc:creator><pubDate>Mon, 15 Jun 2020 05:00:00 GMT</pubDate><content:encoded><![CDATA[<p><a target="_blank" href="https://j2team.dev/blog/j2team-security-bao-mat-tai-khoan-facebook">J2TEAM Security</a> là một tiện ích phổ biến đối với người dùng Facebook tại Việt Nam, tiện ích mở rộng cho trình duyệt này giúp bạn tăng cường bảo mật cho tài khoản Facebook cũng như mang lại nhiều tính năng cực kỳ hấp dẫn.</p>
<p>Trong bài viết này, tớ sẽ hướng dẫn các bạn cách sử dụng <strong>J2TEAM Security</strong> để kích hoạt tính năng <strong>Profile Picture Guard</strong> hay mọi người thường gọi là <strong>bật khiên avatar Facebook</strong>.</p>
<h3 id="heading-bat-khien-avatar-facebook-la-gi"><strong>Bật khiên avatar Facebook là gì?</strong></h3>
<p>Đây là một tính năng vốn dĩ chỉ khả dụng tại quốc gia Ấn Độ, sau khi kích hoạt khiên:</p>
<ul>
<li><p>Người khác sẽ không thể tải hoặc chia sẻ ảnh đại diện của bạn trên Facebook.</p>
</li>
<li><p>Chỉ bạn hoặc bạn bè của bạn có thể gắn thẻ ảnh đại diện của bạn.</p>
</li>
<li><p>Một biểu tượng chiếc khiên sẽ hiển thị trên ảnh đại diện (ở trang cá nhân) để người khác biết ảnh đại diện của bạn đang được bảo vệ.</p>
</li>
</ul>
<p>Bạn có thể xem video giới thiệu của Facebook để biết thêm thông tin: <a target="_blank" href="https://www.facebook.com/fbsafety/videos/1357031717667996/">https://www.facebook.com/fbsafety/videos/1357031717667996/</a></p>
<h3 id="heading-cach-bat-khien-avatar-facebook-bang-j2team-security"><strong>Cách bật khiên avatar Facebook bằng J2TEAM Security</strong></h3>
<p>Trước tiên các bạn cài đặt J2TEAM Security (xem hướng dẫn nếu chưa cài). Sau đó các bạn nhấn vào biểu tượng của phần mở rộng ở phía trên góc phải trình duyệt. Khi trang tiện ích mở ra, nhấn vào <strong>Facebook Tools</strong> &gt; <strong>Avatar Guard</strong>.</p>
<p><img src="https://j2team.dev/storage/canvas/images/ykkSvxqcxr4yp5lMZHICQ1LSe85pXCm65kqkri31.png" alt="j2team-security-profile-picture-guard" class="image--center mx-auto" /></p>
<p>j2team-security-profile-picture-guard</p>
<p>Cuối cùng, chỉ việc nhấn nút <strong>Enable Profile Picture Guard</strong> (Kích hoạt bảo vệ ảnh đại diện).</p>
<p><img src="https://j2team.dev/storage/canvas/images/NUvVQEQCD2JLYLOglP1HFHV7SAdO32IHBFY0pNSG.png" alt="j2team-security-profile-picture-guard" class="image--center mx-auto" /></p>
<p>Vì tài khoản của tớ đã kích hoạt rồi nên trong ảnh trên nút hiển thị là “Disable” (Vô hiệu hóa). Sau khi kích hoạt, các bạn có thể vào lại trang này và nhấn nút Vô hiệu hóa bất cứ lúc nào nếu không cần <strong>bảo vệ ảnh đại diện</strong> nữa.</p>
]]></content:encoded></item><item><title><![CDATA[J2TEAM Security là gì? Cách tải và cài đặt, bảo mật tài khoản Facebook]]></title><description><![CDATA[J2TEAM Security là một phần mở rộng cho trình duyệt (add-on/extension). Tiện ích này giúp tăng cường bảo mật cho tài khoản Facebook của bạn bằng cách:
Chặn các trang web lừa đảo, độc hại
J2TEAM Security được thiết kế với tính năng chính là chặn các t...]]></description><link>https://blog.junookyo.com/j2team-security-bao-mat-tai-khoan-facebook</link><guid isPermaLink="true">https://blog.junookyo.com/j2team-security-bao-mat-tai-khoan-facebook</guid><category><![CDATA[Facebook]]></category><category><![CDATA[chrome extension]]></category><category><![CDATA[j2team]]></category><category><![CDATA[Security]]></category><dc:creator><![CDATA[JUNO_OKYO]]></dc:creator><pubDate>Mon, 15 Jun 2020 05:00:00 GMT</pubDate><content:encoded><![CDATA[<p>J2TEAM Security là một phần mở rộng cho trình duyệt (add-on/extension). Tiện ích này giúp tăng cường <strong>bảo mật cho tài khoản Facebook</strong> của bạn bằng cách:</p>
<h3 id="heading-chan-cac-trang-web-lua-dao-doc-hai"><strong>Chặn các trang web lừa đảo, độc hại</strong></h3>
<p>J2TEAM Security được thiết kế với tính năng chính là chặn các trang web có giao diện giả mạo trang đăng nhập của Facebook. Ngoài ra, nó còn chặn rất nhiều trang web chứa mã độc thông qua Cơ sở dữ liệu đã biết.</p>
<h3 id="heading-chan-cac-chien-dich-phat-tan-ma-doc-qua-facebook-chat-messenger"><strong>Chặn các chiến dịch phát tán mã độc qua Facebook Chat (Messenger)</strong></h3>
<p>Bằng cách phản ứng kịp thời với các chiến dịch tấn công có chủ đích, J2TEAM Security có thể bảo vệ bạn khỏi những mã độc lây lan qua Facebook Chat, ví dụ như trong video sau:</p>
<div class="embed-wrapper"><div class="embed-loading"><div class="loadingRow"></div><div class="loadingRow"></div></div><a class="embed-card" href="https://www.youtube.com/watch?v=ilEg1Q_i9Cs">https://www.youtube.com/watch?v=ilEg1Q_i9Cs</a></div>
<p> </p>
<p>Nếu bạn quan tâm về các chi tiết kỹ thuật, hãy đọc các bài <a target="_blank" href="https://www.junookyo.com/2016/11/ma-doc-facebook-qua-tin-nhan.html">phân tích mã độc</a> trên JUNO_OKYO Blog nhé!</p>
<h3 id="heading-chan-clickjacking"><strong>Chặn Clickjacking</strong></h3>
<p>Clickjacking là một kỹ thuật nhằm đánh cắp các “cú click” của người dùng. Khi thực hiện một cú click, người dùng nghĩ là mình nhấn chuột lên một đối tượng đang hiển thị trên màn hình, nhưng thực ra lại đang truy cập vào một trang web hoàn toàn khác. <a target="_blank" href="https://www.junookyo.com/2013/11/clickjacking-qua-khu-hien-tai-va-tuong-lai.html">Đọc thêm về Clickjacking!</a></p>
<p>Kỹ thuật này thường được áp dụng để tấn công người dùng Facebook bằng cách sử dụng các nút Like ẩn trên các trang web, các nút Like này được thiết kế để bám theo con trỏ trên màn hình, dù người dùng nhấn chuột ở vị trí nào thì họ cũng nhấn vào nút Like này.</p>
<p><strong>J2TEAM Security</strong> bảo vệ bạn bằng cách nhận diện các nút Like đang có trên trang web, kiểm tra xem nút Like này có thể nhận biết được bởi người dùng hay nó đang ẩn. Trong trường hợp nút Like ẩn, J2TEAM Security sẽ xóa các nút Like này khỏi trang web.</p>
<h3 id="heading-chan-cac-ma-doc-dao-tien-ao"><strong>Chặn các mã độc đào tiền ảo</strong></h3>
<p>Một số nhà phát triển đã kết hợp JavaScript với khả năng của trình duyệt để khai thác máy tính của người dùng như một công cụ đào tiền ảo. Dù chúng được thiết kế với tùy chọn thông báo cho người truy cập biết, nhưng người dùng thì với mong muốn kiếm được nhiều nên thường cài đặt mà không thông báo cho người truy cập.</p>
<p>Vậy nên mỗi khi truy cập phải những trang web như vậy, máy tính của bạn thường kêu rú lên vì CPU bắt đầu hoạt động mạnh hơn do các đoạn mã xấu kia bắt đầu thực thi.</p>
<p><strong>J2TEAM Security</strong> sẽ nhận diện và chặn chúng ngay từ khi bạn vừa truy cập trang web và đưa ra cảnh báo cho bạn biết. Có rất nhiều trường Đại Học ở VN đã bị kẻ xấu cài đặt mã độc và bị phát giác nhờ có J2TEAM Security. Bạn có thể đọc một số bài viết như vậy trên J2TEAM Community:</p>
<ul>
<li><p>https://www.facebook.com/groups/j2team.community/permalink/981342485531205/</p>
</li>
<li><p>https://www.facebook.com/groups/j2team.community/permalink/606172386381552/</p>
</li>
</ul>
<h3 id="heading-chan-self-xss"><strong>Chặn Self-XSS</strong></h3>
<p>Các bạn có thể xem bài viết của Facebook về Self-XSS: <a target="_blank" href="https://www.facebook.com/help/543344735779134/">https://www.facebook.com/help/543344735779134/</a></p>
<h3 id="heading-kiem-tra-bao-mat-tai-khoan-facebook"><strong>Kiểm tra bảo mật tài khoản Facebook</strong></h3>
<p>J2TEAM Security cung cấp một công cụ giúp quét nhanh các thiết lập hiện tại trên tài khoản Facebook của bạn và cho bạn biết thiết lập nào đang ở mức không an toàn.</p>
<h3 id="heading-tai-va-cai-dat-j2team-security"><strong>Tải và cài đặt J2TEAM Security</strong></h3>
<p>Rất đơn giản, chỉ việc truy cập vào một trong các liên kết sau (tùy theo trình duyệt của bạn):</p>
<ul>
<li><p><a target="_blank" href="https://chrome.google.com/webstore/detail/j2team-security/hmlcjjclebjnfohgmgikjfnbmfkigocc">Cài đặt cho trình duyệt Chrome, Cốc Cốc và các trình duyệt dựa trên Chromium.</a></p>
</li>
<li><p><a target="_blank" href="https://microsoftedge.microsoft.com/addons/detail/j2team-security/nckdadddljhnbimojbhccmjhckkfaang">Cài đặt cho trình duyệt Microsoft Edge.</a></p>
</li>
</ul>
]]></content:encoded></item><item><title><![CDATA[J2TEAM Cookies là gì? So sánh với Edit This Cookie]]></title><description><![CDATA[Ngoài J2TEAM Security thì J2TEAM Cookies cũng là một phần mở rộng khá nổi tiếng được phát triển bởi JUNO_OKYO. Cùng tìm hiểu về phần mở rộng này nhé!

Cookie là gì?
Cookie là các tệp được trang web bạn truy cập tạo ra. Cookie giúp trải nghiệm trực tu...]]></description><link>https://blog.junookyo.com/j2team-cookies-netflix-grammarly</link><guid isPermaLink="true">https://blog.junookyo.com/j2team-cookies-netflix-grammarly</guid><category><![CDATA[chrome extension]]></category><category><![CDATA[j2team]]></category><category><![CDATA[cookies]]></category><dc:creator><![CDATA[JUNO_OKYO]]></dc:creator><pubDate>Mon, 15 Jun 2020 05:00:00 GMT</pubDate><content:encoded><![CDATA[<p>Ngoài <a target="_blank" href="https://j2team.dev/blog/j2team-security-bao-mat-tai-khoan-facebook">J2TEAM Security</a> thì <strong>J2TEAM Cookies</strong> cũng là một phần mở rộng khá nổi tiếng được phát triển bởi JUNO_OKYO. Cùng tìm hiểu về phần mở rộng này nhé!</p>
<p><img src="https://2.bp.blogspot.com/-oE7G13rYN2Y/WXq5Lwy_pLI/AAAAAAAAD3M/ti2Zg9JkswIW8YmyfVZ8uq82P-PhndlyACLcBGAs/s1600/j2team-cookies-extension.png" alt="j2team-cookies-chrome-extension" class="image--center mx-auto" /></p>
<h3 id="heading-cookie-la-gi"><strong>Cookie là gì?</strong></h3>
<p><strong>Cookie</strong> là các tệp được trang web bạn truy cập tạo ra. Cookie giúp trải nghiệm trực tuyến của bạn dễ dàng hơn bằng cách lưu thông tin duyệt web. Với cookie, các trang web có thể duy trì trạng thái đăng nhập của bạn, ghi nhớ tùy chọn trang web và cung cấp nội dung phù hợp với vị trí của bạn..</p>
<p>Có hai loại cookie:</p>
<ul>
<li><p>Cookie của bên thứ nhất do trang web mà bạn truy cập tạo ra. Trang web được hiển thị trong thanh địa chỉ.</p>
</li>
<li><p>Cookie của bên thứ ba do các trang web khác tạo ra. Các trang web này sở hữu một số nội dung như quảng cáo hoặc hình ảnh mà bạn thấy trên trang web mình truy cập.</p>
</li>
</ul>
<h3 id="heading-j2team-cookies-la-gi"><strong>J2TEAM Cookies là gì?</strong></h3>
<p>Đây là một phần mở rộng (add-on/extension) cho trình duyệt, giúp bạn dễ dàng chia sẻ tài khoản trực tuyến với mọi người mà không tiết lộ mật khẩu của bạn. Nó hoạt động bằng cách xuất cookie của trang web bất kì với tùy chọn đặt mật khẩu để bảo vệ cookie. Sau đó, bạn chỉ cần chia sẻ file cookie và mật khẩu giải mã (nếu có).</p>
<p>Xem video giới thiệu sau để hiểu cách thức hoạt động của J2TEAM Cookies:</p>
<div class="embed-wrapper"><div class="embed-loading"><div class="loadingRow"></div><div class="loadingRow"></div></div><a class="embed-card" href="https://www.youtube.com/watch?v=qiEid8TeDyU">https://www.youtube.com/watch?v=qiEid8TeDyU</a></div>
<p> </p>
<h3 id="heading-so-sanh-j2team-cookies-va-editthiscookie"><strong>So sánh J2TEAM Cookies và EditThisCookie</strong></h3>
<p>EditThisCookie là một tiện ích quản lý Cookie, với mọi tính năng như thêm, sửa, xóa, xuất, nhập,… Với hơn 2 triệu người sử dụng, đây chắc chắn là tiện ích số 1 về Cookies trên Chrome Store. Bản thân tớ là tác giả của J2TEAM Cookies cũng từng sử dụng phần mở rộng này.</p>
<p><strong>J2TEAM Cookies</strong> lại hướng đến mục đích thiên về chia sẻ tài khoản hơn là quản lý cookie, vì vậy nó chỉ cung cấp hai tính năng duy nhất: xuất toàn bộ cookie và nhập cookie do người khác chia sẻ. Nếu bạn chỉ cần chia sẻ tài khoản cho bạn bè, ví dụ như tài khoản Netflix, Grammarly, Fshare,… thì J2TEAM Cookies chính là lựa chọn tuyệt vời dành cho bạn!</p>
<p>Rất nhiều website đã tin dùng J2TEAM Cookies để chia sẻ tài khoản premium của họ:</p>
<ul>
<li><p><a target="_blank" href="https://j2team.dev/go/netflix-cookies">Chia sẻ Netflix Cookies</a></p>
</li>
<li><p><a target="_blank" href="https://j2team.dev/go/grammarly-cookies">Chia sẻ Grammarly Cookies</a></p>
</li>
<li><p><a target="_blank" href="https://j2team.dev/go/fshare-cookies">Chia sẻ Fshare Cookies</a></p>
</li>
</ul>
<p>Nếu cảm thấy hữu ích, đừng quên <a target="_blank" href="https://chrome.google.com/webstore/detail/j2team-cookies/okpidcojinmlaakglciglbpcpajaibco/reviews">đánh giá trên Chrome Store</a> để ủng hộ tớ nhé!</p>
]]></content:encoded></item><item><title><![CDATA[Lỗ hổng Cross-Site Scripting trên Google Translate (Bounty $3133.70)]]></title><description><![CDATA[Tôi đã kiếm được $3133.70 từ Google như thế nào?

Một bug tưởng chừng như đơn giản nhưng lại không hề đơn giản chút nào khi bạn cần phải là... người Việt.

Video PoC XSS Google Translate (Proof of Concept)
https://www.youtube.com/watch?v=Q3AUguoreyU
...]]></description><link>https://blog.junookyo.com/lo-hong-xss-tren-google-translate</link><guid isPermaLink="true">https://blog.junookyo.com/lo-hong-xss-tren-google-translate</guid><category><![CDATA[Google]]></category><category><![CDATA[hacking]]></category><category><![CDATA[bugbounty]]></category><category><![CDATA[Security]]></category><dc:creator><![CDATA[JUNO_OKYO]]></dc:creator><pubDate>Sat, 13 Jun 2020 05:00:00 GMT</pubDate><content:encoded><![CDATA[<h3 id="heading-toi-da-kiem-duoc-313370-tu-google-nhu-the-nao"><strong>Tôi đã kiếm được $3133.70 từ Google như thế nào?</strong></h3>
<blockquote>
<p>Một bug tưởng chừng như đơn giản nhưng lại không hề đơn giản chút nào khi bạn cần phải là... người Việt.</p>
</blockquote>
<p><strong>Video PoC XSS Google Translate (Proof of Concept)</strong></p>
<div class="embed-wrapper"><div class="embed-loading"><div class="loadingRow"></div><div class="loadingRow"></div></div><a class="embed-card" href="https://www.youtube.com/watch?v=Q3AUguoreyU">https://www.youtube.com/watch?v=Q3AUguoreyU</a></div>
<p> </p>
<p><strong>Cross-Site Scripting</strong> (<a target="_blank" href="https://en.wikipedia.org/wiki/Cross-site_scripting">XSS</a>) trên tên miền <a target="_blank" href="https://translate.google.com/"><strong>translate.google.com</strong></a> của Google.</p>
<p>2h sáng cùng với thời tiết mùa đông ở Hà Nội khi mà mọi người đã yên giấc thì mình vẫn còn đang say mê với công việc hằng ngày, sau khi hoàn thành công việc thì cũng đã 2h45.</p>
<p>Quyết định “giải trí” một chút rồi mới đi ngủ, nhưng mình lại gặp vấn đề về ngôn ngữ khi tìm kiếm phim. Trong lúc dịch tên phim từ <strong>Tiếng Việt</strong> sang <strong>Tiếng Anh</strong> trên translate.google.com thì mình đã vô tình phát hiện ra một vấn đề mà tính năng "<em>gợi ý từ</em>" (tại ngôn ngữ chính <strong><em>Vietnamese</em></strong>) của <strong>Google Translator</strong> mắc phải</p>
<p><img src="https://i.imgur.com/ut2KFf0.png" alt="J2TEAM" class="image--center mx-auto" /></p>
<p>Lúc này mình thử F12 ở trình duyệt để mở công cụ <strong>DevTools</strong> và kiểm tra thì mình phát hiện là đoạn HTML mình chèn vào ở trên đang được thực thi.</p>
<p><img src="https://i.imgur.com/91e6W0R.png" alt="J2TEAM" class="image--center mx-auto" /></p>
<p>À há thì ra Google chưa lọc và mã hoá các thẻ HTML trong tính năng này. Vậy là mình có thể khai thác <strong>XSS</strong> ở đây rồi.</p>
<p>Mình đã thử đổi ngôn ngữ chính sang ngôn ngữ khác nhưng không khả thi, vì các thẻ HTML được mã hoá và lọc ra. Lỗi này xuất hiện khi bạn chọn ngôn ngữ chính là Vietnamese.</p>
<p>Tiếp tục với các đoạn HTML khác để nhằm tạo ra bảng thông báo để hiển thị ra tên miền và phiên làm việc của người dùng.</p>
<p>(Cái khó của việc này là phải canh được độ dài và ký tự hợp lý để <em>Translator</em> hiển thị ra "gợi ý từ").</p>
<p>Và cuối cùng thì mình cũng mò được đoạn <strong>XSS</strong> như ý:</p>
<pre><code class="lang-plaintext">&lt;iframe onload="javascript:prompt(document.domain, document.cookie)" id="xss" role="xss"&gt;hello xss
</code></pre>
<p><img src="https://i.imgur.com/DcLYRoF.png" alt="J2TEAM" class="image--center mx-auto" /></p>
<h3 id="heading-nhung-lieu-google-co-chap-nhan-lo-hong-nay"><strong>Nhưng liệu Google có chấp nhận lỗ hổng này?</strong></h3>
<p>Nếu Google sử dụng phương thức POST thay vì GET để lấy kết quả gợi ý thì có phải nó là sẽ không được chấp chận không? Vì đoạn mã đó bạn phải gửi cho nạn nhân thì nó mới thực thi mà, mà liệu rằng bạn gửi cho nạn nhân đoạn mã đó thì họ cũng sẽ thực hiện nó chứ?</p>
<p>Address URL hiển thị trên trình duyệt:</p>
<pre><code class="lang-plaintext">https://translate.google.com/?hl=en#view=home&amp;op=translate&amp;sl=vi&amp;tl=en&amp;text=%3Ciframe%20onload=%22javascript:alert(document.domain)%22%20id=%22xss%22%20role=%22xss%22%3Ehello%20xss
</code></pre>
<p>Lúc này mình nhìn lên địa chỉ url ở trình duyệt thì để ý các tham số được truyền vào.</p>
<pre><code class="lang-plaintext">&amp;sl=vi =&gt; Ngôn ngữ chính
&amp;tl=en =&gt; Ngôn ngữ sau khi dịch
&amp;text =&gt; Đoạn văn bản
</code></pre>
<p>Thế là mình nghĩ chắc chắn sẽ được, mình chỉ cần mã hoá đoạn thực thi XSS rồi truyền vào tham số TEXT ở trên và gửi liên kết cho nạn nhân là đủ.</p>
<p>Sau khi có đủ cơ sở về bug và mình đã gửi một báo cáo lên Google.</p>
<p>Nhưng sau đó lại nhận được phản hồi của Google là không cho đó là bug vì tên miền nằm trong "<strong>sandbox domains</strong>" và họ cho rằng nó không hợp lệ, nên đã thay đổi trạng thái thành "<strong>Won't Fix (Intended Behavior)</strong>".</p>
<p><img src="https://i.imgur.com/fmegPRr.png" alt="J2TEAM" class="image--center mx-auto" /></p>
<p>Lúc này mình khá buồn, nhưng không sao mình đã vào đọc lại để tìm kiếm thông tin về việc tên miền "<strong>sandbox</strong>".</p>
<p><img src="https://i.imgur.com/uLwWF7E.png" alt="J2TEAM" class="image--center mx-auto" /></p>
<p>Mình xin nói sơ qua về "sandbox domains" chút.</p>
<p><strong><em>Sandbox domains</em></strong> - Thường được dùng để chứa tất cả nội dung bao gồm luôn cả các nội dung có chứa <strong>virus, malware, trojan</strong>….và nó không ảnh hưởng đến những máy chủ khác. Nó được tách biệt ra khỏi máy chủ chính có chứa dữ liệu của người dùng. Do đó nó là an toàn.</p>
<p>Nhưng lạ thay là tên miền "<strong>translate.google.com</strong>" không có trong danh sách đó, và mình chắc chắn rằng nó hợp lệ. mình đã gửi đi 2 phản hồi để chứng minh việc nhầm lẫn của họ.</p>
<p>Sau 7 ngày kể từ lúc mình gửi 2 phản hồi thì không thấy họ phản hồi gì thêm, nên mình tiếp tục phản hồi thêm lần nữa, và kết quả là họ đã xem xét lại thay đổi trạng thái cho mình và chấp nhận đó là bug và họp team để đánh giá mức độ cũng như việc đưa ra mức tiền thưởng cho bug này.</p>
<p>Cuối cùng mình xin gửi lời cảm ơn đến một số anh/em và một số thành viên trong nhóm “<strong>Cộng đồng săn tiền thưởng</strong>”, trong suốt quá trình gửi phản hồi để chứng minh về việc nhầm lẫn này và tạo điều kiện cho mình có thêm động lực để chứng minh.</p>
<h3 id="heading-timeline"><strong>Timeline:</strong></h3>
<p><code>14/11/2019 14:05 - Mình gửi báo cáo</code></p>
<p><code>14/11/2019 20:29 - Nhận được phản hồi của Google, nhưng bị phản hồi là “Won't Fix (Intended Behavior)”.</code></p>
<p><code>14/11/2019 21:29 - Mình cung cấp thêm thông tin</code></p>
<p><code>15/11/2019 00:36 - Mình chứng minh tên miền đó là hợp lệ.</code></p>
<p><code>21/11/2019 23:23 - Mình tiếp tục chứng minh tên miền hợp lệ và gửi kèm một video PoC.</code></p>
<p><code>22/11/2019 00:12 - Google thay đổi trạng thái và xác nhận đó và đánh giá lại bug.</code></p>
<p><code>28/11/2019 01:20 - Google thông báo mức tiền thưởng là $3133.70</code></p>
<p><code>23/12/2019 03:47 - Google phản hồi đã fix bug.</code></p>
]]></content:encoded></item><item><title><![CDATA[Cách lọc thành viên bị vô hiệu khỏi nhóm Facebook]]></title><description><![CDATA[Trong quá trình phát triển nhóm Facebook, nhiều khi bạn sẽ muốn tìm cách xóa các thành viên không hoạt động khỏi nhóm, đây có thể là các tài khoản bị vô hiệu hoặc gặp vấn đề về tài khoản nên không thể sử dụng tiếp.
Facebook có hẳn một trang riêng để ...]]></description><link>https://blog.junookyo.com/cach-loc-thanh-vien-nhom-facebook</link><guid isPermaLink="true">https://blog.junookyo.com/cach-loc-thanh-vien-nhom-facebook</guid><category><![CDATA[Facebook]]></category><category><![CDATA[Tutorial]]></category><dc:creator><![CDATA[JUNO_OKYO]]></dc:creator><pubDate>Tue, 02 Jun 2020 05:00:00 GMT</pubDate><content:encoded><![CDATA[<p>Trong quá trình phát triển nhóm Facebook, nhiều khi bạn sẽ muốn tìm cách xóa các thành viên không hoạt động khỏi nhóm, đây có thể là các tài khoản bị vô hiệu hoặc gặp vấn đề về tài khoản nên không thể sử dụng tiếp.</p>
<p>Facebook có hẳn một trang riêng để liệt kê những tài khoản như vậy, bạn có thể truy cập bằng cách vào trang Members (liên kết ở cột trái trong nhóm của bạn) &gt; Unavailable (liên kết ở cột bên phải). Lưu ý: trang này chỉ thấy khi bạn truy cập từ phiên bản Web PC của Facebook. Liên kết có dạng:</p>
<p><a target="_blank" href="http://facebook.com/groups/&lt;GROUP_ID&gt;/unavailable_accounts/">facebook.com/groups/&lt;GROUP_ID&gt;/unavailable_accounts/</a></p>
<p>Ở đây, bạn có thể xóa từng tài khoản ra khỏi nhóm, nhưng không thể nào xóa toàn bộ trong một thao tác đơn giản, vì vậy trong bài viết này, mình sẽ chia sẻ với các bạn một đoạn mã nhỏ giúp bạn dễ dàng xóa toàn bộ tài khoản bị vô hiệu, không hoạt động ra khỏi nhóm.</p>
<div class="gist-block embed-wrapper" data-gist-show-loading="false" data-id="7cc8554b74ff8af3af522b42b95e73d8"><div class="embed-loading"><div class="loadingRow"></div><div class="loadingRow"></div></div><a href="https://gist.github.com/J2TEAM/7cc8554b74ff8af3af522b42b95e73d8" class="embed-card">https://gist.github.com/J2TEAM/7cc8554b74ff8af3af522b42b95e73d8</a></div><p> </p>
<h3 id="heading-cach-loc-nhanh-tai-khoan-bi-vo-hieu-ra-khoi-nhom"><strong>Cách lọc nhanh tài khoản bị vô hiệu ra khỏi nhóm</strong></h3>
<p>Bước 1: Các bạn sao chép đoạn mã ở trên.</p>
<p>Bước 2: Nhấn F12 để mở công cụ dành cho nhà phát triển (Dev Tools), chuyển qua tab Console nếu đang ở một tab khác. Dán đoạn mã trên vào, nhìn ở đoạn cuối sẽ thấy <strong>YOUR_GROUP_ID</strong>. Các bạn thay đoạn này thành ID nhóm của bạn trên Facebook.</p>
<p>Cách lấy ID nhóm của bạn: nhấn chuột phải vào ảnh bìa nhóm, chọn sao chép liên kết. Sau đó bạn nhìn vào liên kết sẽ thấy dạng:</p>
<p><a target="_blank" href="https://www.facebook.com/364997627165697/photos/">https://www.facebook.com/364997627165697/photos/</a>...</p>
<p>Trong đó, đoạn số ở đầu chính là ID nhóm.</p>
<p>Bước 3: Nhấn ENTER và chờ đoạn mã thực hiện xóa toàn bộ thành viên, khi chạy xong ở trên Console sẽ hiện chữ “Done!”.</p>
<p><img src="https://j2team.dev/storage/canvas/images/BUSfLeZxGGWvxugXbzosE6Z1Q1HgJXhXjjPkgYbf.png" alt="j2team-loc-thanh-vien" class="image--center mx-auto" /></p>
]]></content:encoded></item><item><title><![CDATA[Hack tiền điện thoại chỉ trong một nốt nhạc?!]]></title><description><![CDATA[TL;DR: Mình phát hiện ra một lỗ hổng trong bộ API của một nhà mạng cho phép nạp tiền vào bất cứ số điện thoại nào của nhà mạng đó mà không cần thanh toán.
Mở đầu
Thời còn nhỏ, khi chơi game các bạn có bao giờ mơ mộng đến những thứ như "hack tiền", "h...]]></description><link>https://blog.junookyo.com/hack-tien-dien-thoai</link><guid isPermaLink="true">https://blog.junookyo.com/hack-tien-dien-thoai</guid><category><![CDATA[hacking]]></category><category><![CDATA[Security]]></category><category><![CDATA[j2team]]></category><dc:creator><![CDATA[JUNO_OKYO]]></dc:creator><pubDate>Thu, 28 May 2020 05:00:00 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/stock/unsplash/pjAH2Ax4uWk/upload/d3070a4b2b075531fb639353333d98bc.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><strong>TL;DR: Mình phát hiện ra một lỗ hổng trong bộ API của một nhà mạng cho phép nạp tiền vào bất cứ số điện thoại nào của nhà mạng đó mà không cần thanh toán.</strong></p>
<h3 id="heading-mo-dau"><strong>Mở đầu</strong></h3>
<p>Thời còn nhỏ, khi chơi game các bạn có bao giờ mơ mộng đến những thứ như "hack tiền", "hack đồ" trong game, những thứ mà nôm na sẽ khiến bạn trở nên "giàu" hơn so với phần còn lại (khác với kiểu hack game bắn bách phát bách trúng nhé :v). Đã bao giờ bạn dùng lệnh coinage trong đế chế hay IFIWEREARICHMAN trong GTA? Cảm giác nhấn nút cái có đầy tiền quả thật rất sung sướng phải không? Nhưng ngược lại, có bao giờ bạn thất vọng khi thử "hack" mà chẳng nhận được gì chưa? Mình thì bị nhiều rồi, thử mấy trang quảng cáo "hack tiền" với mấy game online mà xem, tiền thì không có mà thậm chí còn mất cả tài khoản ấy chứ. Lớn lên mới biết người ta dựng lên những thứ như vậy chỉ để lừa bạn nạp thẻ hoặc chiếm thông tin đăng nhập của bạn (phishing), hay lừa bạn click vào quảng cáo trên website để kiếm lời (clickbait). Nếu có là lỗi thật thì thường cũng sẽ bị fix trong vòng một nốt nhạc, và chẳng ai nhắc đến nó nữa.</p>
<p>Nói ví dụ về game cho các bạn dễ hiểu. Bài writeup của mình cũng về vấn đề "hack tiền", nhưng thứ mà mình lấy được là tiền trong tài khoản điện thoại. Cũng là những mơ mộng ấy, cũng cảm giác hồi hộp như vậy, và với mình là cảm giác vui mừng khi thành công cũng như hào hứng khi được chia sẻ những dòng này, và hi vọng rằng những phát hiện của mình sẽ không làm bạn thất vọng.</p>
<p>Vì mục đích bảo mật và cũng để phân biệt với lỗ hổng trước đó mà mình tìm được (<a target="_blank" href="https://goo.gl/f83SAn">https://goo.gl/f83SAn</a>), nên mình sẽ gọi bên công ty này là "Y". Tất cả tên gọi trong bài viết cũng như trong ảnh đều sẽ sử dụng tên này.</p>
<h3 id="heading-lo-hong-cua-y-nam-o-dau"><strong>Lỗ hổng của Y nằm ở đâu?</strong></h3>
<p>Lỗ hổng của Y nằm trong bộ API của ứng dụng Android, khá giống với lỗ hổng của X mình đã đề cập ở trên. Tuy nhiên, vì app của Y bảo mật hơn (theo mình đoán là có SSL Pinning) nên mình không thể dùng Fiddler để capture request theo cách thông thường mà phải dịch ngược mã nguồn để phân tích.</p>
<h3 id="heading-qua-trinh-dich-nguoc-ung-dung-cua-y"><strong>Quá trình dịch ngược ứng dụng của Y</strong></h3>
<p>Để dịch ngược ứng dụng của Y, trước hết mình cần một bản apk của ứng dụng, có thể tìm một cách dễ dàng trên các trang lưu trữ như apkpure, còn cách mình hay dùng là pull trực tiếp từ Android thông qua adb.</p>
<p>Việc đầu tiên mình thường làm sau khi có apk đó là sử dụng 2 công cụ dex2jar và jd-gui để dịch ngược mã nguồn của ứng dụng về code Java, sau đó nghiên cứu những phần code chức năng để tìm ra lỗ hổng.</p>
<p>Sau khi dịch ngược ứng dụng của Y, mình được một cấu trúc thư mục mã nguồn như thế này:</p>
<p><img src="https://1.bp.blogspot.com/-vV7pCLGyptk/WwRsCzhB2JI/AAAAAAAAAos/26wsnb97yFQtYhGD6fYtTbeJu05LFQkMACLcBGAs/s1600/Screenshot_92.png" alt="J2TEAM" class="image--center mx-auto" /></p>
<p>Theo kinh nghiệm bản thân, mình tìm kiếm mã nguồn trong thư mục com/y/, tuy nhiên trong thư mục này chỉ gồm một file <a target="_blank" href="http://R.java">R.java</a> vốn chỉ để chứa thông tin. Mình cũng đã đọc hết file này và y rằng không tìm được đoạn code nào có vẻ có giá trị :(.</p>
<p><img src="https://4.bp.blogspot.com/-FmtintKwcuQ/WwRseUD1PRI/AAAAAAAAAo0/T7n9IU48xjcL4XCod7LGBQNixEyxWnC3gCLcBGAs/s1600/Screenshot_93.png" alt="J2TEAM" class="image--center mx-auto" /></p>
<p>Sau khi lục tung hết mấy thư mục mã nguồn mà không có kết quả, mình đoán rằng cần phải tiếp cận vấn đề này theo một hướng khác. Và đó cũng chính là lúc mình bắt đầu để ý đến từ khóa xamarin. Vì trước đó đã từng đọc qua nên mình biết Xamarin là một nền tảng cho phép lập trình ứng dụng di động bằng ngôn ngữ C# của .NET framework. Mình thì chỉ nhớ mấy thư viên của C# có phần mở rộng .dll thôi, nên là quyết định quay lại tìm xem trong apk có file .dll nào không.</p>
<p>Vì file .apk thực chất cũng chỉ là một file nén, nên mình đổi định dạng lại thành .zip và giải nén, mình lại được một cấu trúc thư mục thế này:</p>
<p><img src="https://1.bp.blogspot.com/-WG9ikxf5iNw/WwRyEwGKO9I/AAAAAAAAApM/mfyIQLzOHf8NQVk7XInw9ZMzPJegVfYiwCLcBGAs/s1600/Screenshot_94.png" alt="J2TEAM" class="image--center mx-auto" /></p>
<p>Mở thư mục assemblies, được một nùi file .dll thế này. Mình thì chú ý đến file Y.dll.</p>
<p><img src="https://4.bp.blogspot.com/-vHLwjiLdq-Y/WwRyl1WKolI/AAAAAAAAApU/gwzfE0ZgapwlGh2zgunri6xhEjGIH1ZwgCLcBGAs/s1600/Screenshot_95.png" alt="J2TEAM" class="image--center mx-auto" /></p>
<p>Để dịch ngược file .NET chúng ta cũng cần chơi theo kiểu .NET. Vì vậy mình dùng Telerik JustDecompile để mở và phân tích file Y.dll.</p>
<p>Đầu tiên, trong file .dll này, mình tìm được một hàm khai báo base API của server</p>
<div class="gist-block embed-wrapper" data-gist-show-loading="false" data-id="58439d4f861f88434577f9adae90005c"><div class="embed-loading"><div class="loadingRow"></div><div class="loadingRow"></div></div><a href="https://gist.github.com/t-rekttt/58439d4f861f88434577f9adae90005c" class="embed-card">https://gist.github.com/t-rekttt/58439d4f861f88434577f9adae90005c</a></div><p> </p>
<p>Từ hàm này mình biết được một số thông tin như: </p>
<ul>
<li><p>Ứng dụng này giao tiếp với server qua HTTP requests.</p>
</li>
<li><p>Định dạng dữ liệu JSON.</p>
</li>
<li><p>Base API của server là <a target="_blank" href="https://y.com.vn/api/">https://y.com.vn/api/</a>. </p>
</li>
</ul>
<p>Và để biết cụ thể ứng dụng tương tác với server thế nào thì mình cần tìm thêm các hàm gọi API.</p>
<p>Trong file .dll vừa mở, mình tiếp tục tìm được một class có tên AccountService mà thông qua tên các hàm xử lý (Register, Login, ResetPassword, GetProfile), mình đoán class này có nhiệm vụ xử lý các tác vụ trên tài khoản như đăng ký, đăng nhập, đặt lại mật khẩu,...</p>
<p>Đây là phần code xử lý của class nói trên:</p>
<div class="gist-block embed-wrapper" data-gist-show-loading="false" data-id="02bb0e6eceb04cdf84ff3ab9c24274b8"><div class="embed-loading"><div class="loadingRow"></div><div class="loadingRow"></div></div><a href="https://gist.github.com/t-rekttt/02bb0e6eceb04cdf84ff3ab9c24274b8" class="embed-card">https://gist.github.com/t-rekttt/02bb0e6eceb04cdf84ff3ab9c24274b8</a></div><p> </p>
<p>Từ đây, mình bắt đầu thử tạo ra một request hợp lệ tới server. Ví dụ từ hàm login:</p>
<div class="gist-block embed-wrapper" data-gist-show-loading="false" data-id="9b9fcf03185eb3fb37baabe0c44eacdd"><div class="embed-loading"><div class="loadingRow"></div><div class="loadingRow"></div></div><a href="https://gist.github.com/t-rekttt/9b9fcf03185eb3fb37baabe0c44eacdd" class="embed-card">https://gist.github.com/t-rekttt/9b9fcf03185eb3fb37baabe0c44eacdd</a></div><p> </p>
<p>Mình biết được một số thông tin như sau:</p>
<ul>
<li><p>Method của request là POST</p>
</li>
<li><p>Path là login/</p>
</li>
<li><p>Request body gồm loginId và password</p>
</li>
</ul>
<p>Cộng với việc biết base API và định dạng dữ liệu JSON, mình xây dựng được một request thế này:</p>
<p><img src="https://3.bp.blogspot.com/-IhJ0loonKHE/WwY8MEX_lXI/AAAAAAAAApo/WBk1CKG8e806jfELnogeaDwdfn5XcRmNwCLcBGAs/s1600/Screenshot_96.png" alt="J2TEAM" class="image--center mx-auto" /></p>
<p>Và qua việc đăng nhập thử mình biết được định dạng request như trên của mình là hợp lệ, và nếu thông tin đăng nhập đúng thì server trả về một số thông tin tài khoản như thế này:</p>
<p><img src="https://3.bp.blogspot.com/-fr0sOsw4E4g/WwY9jfraa9I/AAAAAAAAAp0/yY5xFQGhbLIyP6R3UeYC4WAzU9KPfn_xACLcBGAs/s1600/Screenshot_97.png" alt="J2TEAM" class="image--center mx-auto" /></p>
<p>Sau khi biết cách tạo request đến server, mình tiếp tục để ý đến 2 hàm sau:</p>
<div class="gist-block embed-wrapper" data-gist-show-loading="false" data-id="31848f40e6f08e5ebdf5a7235ba7e54f"><div class="embed-loading"><div class="loadingRow"></div><div class="loadingRow"></div></div><a href="https://gist.github.com/t-rekttt/31848f40e6f08e5ebdf5a7235ba7e54f" class="embed-card">https://gist.github.com/t-rekttt/31848f40e6f08e5ebdf5a7235ba7e54f</a></div><p> </p>
<p>Nhìn vào từ khóa Topup, mình đoán chức năng của 2 hàm này liên quan tới việc nạp tiền điện thoại.</p>
<p>Hàm đầu tiên mình đoán có tác dụng gọi API để nạp thẻ, với msisdn là số điện thoại cần nạp và voucherCode là mã thẻ, và Settings.CurrentUser.Msisdn là số điện thoại của tài khoản hiện tại (trong trường hợp bạn nạp thẻ cho một tài khoản khác).</p>
<p>Từ đó mình xây dựng được một request như sau:</p>
<p><img src="https://2.bp.blogspot.com/-SEGMWcnr9wM/WwZB-FB3RxI/AAAAAAAAAqQ/ZNkUks8a99w-l3No6DhTZG_HB-jqZz49QCLcBGAs/s1600/Screenshot_98.png" alt="J2TEAM" /></p>
<p>Với các tham số:</p>
<ul>
<li><p>&lt;current_user_phone_number&gt; là số điện thoại của tài khoản hiện tại</p>
</li>
<li><p>&lt;voucher_code&gt; là mã thẻ</p>
</li>
<li><p>&lt;target_phone_number&gt; là số điện thoại cần nạp</p>
</li>
</ul>
<p>Để biết response khi nạp thẻ đúng thì mình đã nạp thử 1 thẻ 20.000đ của nhà mạng này bằng cách gửi request như trên, và tham số trả về chỉ gồm một con số 20000 nên mình đoán đây là giá trị của thẻ nếu nạp thẻ thành công.</p>
<p>Nếu thử nạp lại thẻ đó một lần nữa thì response trả về sẽ là ERROR: VOUCHER_IS_ALREADY_CONSUMED.</p>
<p>Thử với một mã thẻ không tồn tại thì response trả về là ERROR: VOUCHER_PIN_NOT_FOUND_IN_DB</p>
<p>Sau đó mình thử lặp lại request nạp tiền nhiều lần với nhiều mã thẻ random khác nhau, tuy không nạp được thẻ nào nhưng cũng không thấy dấu hiệu bị rate limit. Như vậy hệ thống của Y có khả năng bị bruteforce mã thẻ, bằng cách thử nạp tất cả các mã thẻ có độ dài bằng với độ dài hợp lệ.</p>
<p><strong>Tuy nhiên đó vẫn chưa phải lỗi khiến mình viết ra bài này...</strong></p>
<p>Từ hàm thứ hai:</p>
<div class="gist-block embed-wrapper" data-gist-show-loading="false" data-id="3256ec94256d70dd824c8b29c62f0af9"><div class="embed-loading"><div class="loadingRow"></div><div class="loadingRow"></div></div><a href="https://gist.github.com/t-rekttt/3256ec94256d70dd824c8b29c62f0af9" class="embed-card">https://gist.github.com/t-rekttt/3256ec94256d70dd824c8b29c62f0af9</a></div><p> </p>
<p>Ta biết được một số thông tin như sau:</p>
<ul>
<li><p>Method của request là GET</p>
</li>
<li><p>Request URL có dạng subscriber/etopup/&lt;msisdn&gt;/&lt;amount&gt;, với msisdn, là số điện thoại của tài khoản hiện tại, và một biến &lt;amount&gt;</p>
</li>
</ul>
<p>Dựa vào từ khóa TopUpSuccessfulNotification, mình đoán hàm này dùng để thông báo việc nạp tiền thành công.</p>
<p>Tuy nhiên...</p>
<p>Liệu hàm này là để thông báo việc nạp tiền thành công cho người dùng ứng dụng, hay cho server?</p>
<p>Tại sao một hàm có chức năng thông báo lại sử dụng biến amount? Phải chăng biến này dùng để "thông báo" số tiền cần nạp?</p>
<p>Để giải quyết mối nghi này, mình tạo một request có dạng như sau đến server của Y (mặc dù method ghi là GET nhưng mình dùng POST thấy được nên sau đó không để ý test lại luôn):</p>
<p><img src="https://3.bp.blogspot.com/-NwJvGt6hdJU/WwZLept4YlI/AAAAAAAAAqk/gpAOkTf7LTwEP2eZyyNpEs_5ePH6EukDQCLcBGAs/s1600/Screenshot_99.png" alt="J2TEAM" class="image--center mx-auto" /></p>
<p>Với &lt;phone_number&gt; là số điện thoại của mình, &lt;amount&gt; mình thử con số 1337</p>
<p>Thật kì lạ, server trả về con số 21337, bằng với số tiền trong tài khoản của mình là 20000 cộng thêm con số 1337 ở trên.</p>
<p>Ngay sau đó mình check thử số tiền trong tài khoản bằng cú pháp *101#</p>
<p><img src="https://3.bp.blogspot.com/-49YIxWrSmIA/WwZShpkrcvI/AAAAAAAAAq4/Vq88QFFVoT05uKRNy3wWCdat6NTlHEvBgCLcBGAs/s1600/Screenshot_101.png" alt="J2TEAM" class="image--center mx-auto" /></p>
<p>Thì thấy số tiền lúc này đã thay đổi đúng như trong response trả về. Sau khi thử đi thử lại vài lần trên các số điện thoại khác nhau, mình nhận thấy rằng có thể dùng API này để nạp tiền vào bất cứ tài khoản nào thuộc nhà mạng Y, chậm chí khi nạp xong còn có tin nhắn quảng cáo của nhà mạng gửi về giống như khi nạp tiền bằng thẻ cào.</p>
<h3 id="heading-proof-of-concept"><strong>Proof of Concept</strong></h3>
<div class="embed-wrapper"><div class="embed-loading"><div class="loadingRow"></div><div class="loadingRow"></div></div><a class="embed-card" href="https://www.youtube.com/watch?v=uDxYZNY6mtc">https://www.youtube.com/watch?v=uDxYZNY6mtc</a></div>
<p> </p>
<h3 id="heading-phan-tich-dai-vay-tai-sao-co-the-goi-la-hack-duoc-cua-y-sau-mot-not-nhac"><strong>Phân tích dài vậy, tại sao có thể gọi là hack được của Y "sau một nốt nhạc"?</strong></h3>
<p>Sau khi phân tích và lấy được API của Y, những lần sau để nạp tiền mình chỉ cần request đến đúng API đó là được, thậm chí có thể viết script để chỉ cần nhập số điện thoại và số tiền là nạp được. Mình đã demo ngay chính trong PoC ở trên bằng một đoạn script Python.</p>
<h3 id="heading-lo-hong-nay-tu-dau-ma-co"><strong>Lỗ hổng này từ đâu mà có?</strong></h3>
<p>Mình đã tìm thử xem hàm gây ra lỗ hổng được sử dụng ở đâu trong code, tuy nhiên tìm không thấy, nên mình đoán đây là phần code đã bị Y "bỏ quên" trong ứng dụng cũng như API trên server.</p>
<p>Chẳng hiểu ai lại đi làm ra cái "tính năng" này, nhưng nếu ít nhất anh ta chịu remove dead code đi thì có lẽ mọi việc đã chả đến nỗi, ít ra thì sẽ không bị một đứa rảnh ruồi nào đó như mình dịch ngược ứng dụng và phát hiện ra chẳng hạn :D.</p>
<h3 id="heading-timeline"><strong>Timeline</strong></h3>
<ul>
<li><p>2/3/2018: Báo cáo lỗ hổng tới Y</p>
</li>
<li><p>1/4/2018: Xác nhận Y đã fix lỗ hổng</p>
</li>
</ul>
<p>P/S: Vì mình không có nhiều hiểu biết về Android cũng như C# nên có chỗ nào sai sót mong được góp ý thêm.</p>
]]></content:encoded></item><item><title><![CDATA[10 extension hay nhất cho Firefox]]></title><description><![CDATA[Trước đây, mình đã từng chia sẻ danh sách các extension cho Chrome mà bạn nên dùng. Hôm nay tớ sẽ tiếp tục chia sẻ các extension tuyệt vời cho Firefox nhé!
1. uBlock Origin

Một công cụ chặn quảng cáo hiệu quả: sử dụng ít bộ nhớ, CPU và có thể nạp, á...]]></description><link>https://blog.junookyo.com/10-extension-hay-nhat-cho-firefox</link><guid isPermaLink="true">https://blog.junookyo.com/10-extension-hay-nhat-cho-firefox</guid><category><![CDATA[Firefox]]></category><dc:creator><![CDATA[JUNO_OKYO]]></dc:creator><pubDate>Sun, 08 Mar 2020 05:00:00 GMT</pubDate><content:encoded><![CDATA[<p><strong>Trước đây, mình đã từng chia sẻ danh sách các extension cho Chrome mà bạn nên dùng. Hôm nay tớ sẽ tiếp tục chia sẻ các extension tuyệt vời cho Firefox nhé!</strong></p>
<h3 id="heading-1-ublock-originhttpsj2teamdevfirefox-extensionublock-origin"><strong>1.</strong> <a target="_blank" href="https://j2team.dev/firefox-extension/ublock-origin"><strong>uBlock Origin</strong></a></h3>
<p><img src="https://j2team.dev/storage/canvas/images/c0rkvRPn2BStBKhLPROqyrnLTiUIKl7GrjdZVtqj.png" alt="J2TEAM" /></p>
<p>Một công cụ chặn quảng cáo hiệu quả: sử dụng ít bộ nhớ, CPU và có thể nạp, áp dụng hàng ngàn bộ lọc so với những công cụ chặn quảng cáo hiện nay.</p>
<h3 id="heading-2-video-downloadhelperhttpsj2teamdevfirefox-extensionvideo-downloadhelper"><strong>2.</strong> <a target="_blank" href="https://j2team.dev/firefox-extension/video-downloadhelper"><strong>Video DownloadHelper</strong></a></h3>
<p>Tiện ích giúp dễ dàng tải về và chuyển đổi video từ hàng trăm trang web giống như YouTube.</p>
<h3 id="heading-3-facebook-containerhttpsj2teamdevfirefox-extensionfacebook-container"><strong>3.</strong> <a target="_blank" href="https://j2team.dev/firefox-extension/facebook-container"><strong>Facebook Container</strong></a></h3>
<p><img src="https://j2team.dev/storage/canvas/images/34XBo81jQkOf5hkQKg2sbr23TsASWuuzfQHiDbQM.png" alt="J2TEAM" /></p>
<p>Tiện ích này phát triển bởi chính Firefox, giúp chặn sự theo dõi của Facebook khi bạn truy cập các trang web thứ ba.</p>
<h3 id="heading-4-grammarly-for-firefoxhttpsj2teamdevfirefox-extensiongrammarly-1"><strong>4.</strong> <a target="_blank" href="https://j2team.dev/firefox-extension/grammarly-1"><strong>Grammarly for Firefox</strong></a></h3>
<p>Khá nổi tiếng rồi, tiện ích giúp kiểm tra ngữ pháp khi bạn viết trên bất cứ trang web nào. Có thể hỗ trợ sữa lỗi tự động.</p>
<h3 id="heading-5-honeyhttpsj2teamdevfirefox-extensionhoney"><strong>5.</strong> <a target="_blank" href="https://j2team.dev/firefox-extension/honey"><strong>Honey</strong></a></h3>
<p>Tự động tìm và thử mã giảm giá chỉ với 1 cú nhấp chuột. Hoạt động trên hàng ngàn trang thương mại điện tử.</p>
<h3 id="heading-6-enhancer-for-youtubehttpsj2teamdevfirefox-extensionenhancer-for-youtube"><strong>6.</strong> <a target="_blank" href="https://j2team.dev/firefox-extension/enhancer-for-youtube"><strong>Enhancer for YouTube™</strong></a></h3>
<p>Mang lại cho bạn rất nhiều tính năng hay ho trên Youtube.</p>
<h3 id="heading-7-to-google-translatehttpsj2teamdevfirefox-extensionto-google-translate"><strong>7.</strong> <a target="_blank" href="https://j2team.dev/firefox-extension/to-google-translate"><strong>To Google Translate</strong></a></h3>
<p>Tiện ích giúp dịch nhanh văn bản trên web bằng cách chọn và nhấn chuột phải.</p>
<h3 id="heading-8-noscript-security-suitehttpsj2teamdevfirefox-extensionnoscript"><strong>8.</strong> <a target="_blank" href="https://j2team.dev/firefox-extension/noscript"><strong>NoScript Security Suite</strong></a></h3>
<p>Nếu bạn quan tâm về bảo mật thì đây là một tiện ích đáng lưu ý. Nó cho phép bạn chọn những trang web tin cậy có thể thực thi mã JavaScript.</p>
<h3 id="heading-9-dark-readerhttpsj2teamdevfirefox-extensiondarkreader"><strong>9.</strong> <a target="_blank" href="https://j2team.dev/firefox-extension/darkreader"><strong>Dark Reader</strong></a></h3>
<p>Cung cấp giao diện tối cho mọi trang web, đôi mắt của bạn sẽ cảm ơn bạn vì điều này.</p>
<h3 id="heading-10-firefox-multi-account-containershttpsj2teamdevfirefox-extensionmulti-account-containers"><strong>10.</strong> <a target="_blank" href="https://j2team.dev/firefox-extension/multi-account-containers"><strong>Firefox Multi-Account Containers</strong></a></h3>
<p>Lại là một tiện ích khác từ chính Firefox. Giúp bạn có thể dùng nhiều tài khoản trên một trang web mà không phải làm mấy thủ thuật như mở tab thường và tab ẩn danh hay dùng nhiều trình duyệt khác nhau cho từng tài khoản.</p>
]]></content:encoded></item></channel></rss>