Qua mặt email obfuscation của Cloudflare với 20 dòng code
cloudflare
3
email-obfuscation
1
algorithm
33
White

Cẩm Huỳnh viết ngày 25/09/2017

Hôm nọ hệ thống dò lỗi tự động chạy bằng cơm @huytd phát hiện ra email của mình trên blog hqc.io bị lỗi hiển thị thành thế này.

alt text

Lúc đầu mình cứ tưởng là bị lỗi unicode trong quá trình biên dịch của Elixir (blog mình dùng Nabo), cơ mà khi view source thì phát hiện như thế này.

alt text

Email Obfuscation là gì?

Tò mò bấm vào link :point_up: để xem thì biết đây là chức năng Email Obfuscation của CloudFlare.

Email obfuscation là chức năng mà Cloudflare giúp chống lại các bạn "cào tặc", những người mà chuyên "bò" (crawl) khắp mọi ngóc ngách của Internet để tìm email mà spam. Email obfuscation có thể dịch ra là "làm mờ email", bạn nào hay xem JAV chắc biết thế nào là làm mờ.

Trong quá khứ, người ta sáng tạo ra nhiều cách để chống các bạn "cào tặc", thủ pháp thông thường là viết email dưới dạng human.resource at department dot company dot com. Cách này tránh được spam nhưng người dùng không thế click ngay vào link mà gửi email như <a href="mailto: human.resource@department.company.com"></a>.

Vậy Cloudflare đã làm sao để thoả cả hai mục đích 1) chống "cào"2) dễ dùng.

Nó hoạt động ra sao?

Khi bạn view-source hoặc curl một webpage được bật email obfuscation, Cloudflare sẽ mã hoá các email trong webpage dưới dạng như bạn đã thấy trên hình.

/cdn-cgi/l/email-protection#723193c8db1f523a0793c9c11c1a524e11131f321a03115c1f174c

Đồng thời Cloudflare sẽ lén lút cài một đoạn Javascript nhỏ ở phần dưới cùng của thẻ <body>.

alt text

Khi webpage được load ở browser của người dùng, đoạn Javascript đó sẽ chạy và giải mã các địa chỉ email lại thành như cũ. Ngon lành cành đào, được cả râu ông nọ lẫn cằm bà kia.

Qua mặt nó như thế nào?

Để biết cách qua mặt email obfuscation, ta phải tìm hiểu một chút xem thuật toán của nó obfuscate email như thế nào.

Để ý đoạn hex code sau dấu #.

72  31-93-c8-db-1f-52-3a-07-93-c9-c1-1c-1a-52-4e-11-13-1f-32-1a-03-11-5c-1f-17-4c

2 kí tự hex code đầu tiên (72) chính là khoá, các cặp đôi hex tiếp theo là phần bị mã hoá.

Để giải mã Cloudflare dùng phép XOR lần lượt các cặp hex bị mã hoá với khoá.

0x31 ^ 0x72 = 67 //  'C'
0x93 ^ 0x72 = 225 // 'á'
...
0x11 ^ 0x72 = 99  // 'c'
0x5c ^ 0x72 = 46  // '.'
0x1f ^ 0x72 = 109 // 'm'
0x17 ^ 0x72 = 101 // 'e'
0x4c ^ 0x72 = 62  // '>'

=> "Cẩm Huỳnh <cam@hqc.me>"

Viết code

obfuscated = "/cdn-cgi/l/email-protection#723193c8db1f523a0793c9c11c1a524e11131f321a03115c1f174c"
pattern = "/cdn-cgi/l/email-protection#"
start = obfuscated.index(pattern)
decrypted = ""

if start
  from = index + pattern.size
  to = from + 1
  key = obfuscated[from..to].to_i(16) # key HEX

  loop do
    from += 2
    to += 2
    break if to >= obfuscated.size # end of string

    xored = obfuscated[from..to].to_i(16) ^ key # XOR it
    decrypted += xored.chr 
  end
end

Chưa đến 20 dòng code.

Bài học

Đầu tiên bài viết này không được viết nhằm mục đích chê bai giải thuật bảo mật hay thủ pháp obfuscation của Cloudflare, vì mình nghiệp dư ở mảng này. Mong nhận được các bình luận liên quan đến vấn đề này.

Mình nghĩ Cloudflare hoàn toàn có thể tăng độ khó của việc giải mã bằng cách thay vì luôn đặt khoá ở 2 kí tự đầu, họ có thể đặt khoá ở một vị trí bất kì trên hex string và đặt biến chứa vị trí của khoá trong đoạn Javascript chèn vào. Như vậy sẽ khó hơn rất nhiều cho một amateur như mình.

Đồng thời thuật toán của Cloudflare có vẻ obfuscate luôn cả chủ nhân của email và chưa chạy tốt với unicode cho lắm. Tên của mình "Cẩm Huỳnh" được obfuscate thành cái đoạn string quái dị ở trên.

Cách làm này cần Javascript để chạy, bạn bè mình nhiều người disable Javascript. :cry: Làm sao để họ gửi email cho mình đây.

Bài viết này sẽ giúp tôi tăng lương như thế nào?

Như thường lệ, bài viết này không giúp bạn tăng lương, nhưng nó giúp mình fix cái lỗi ở đầu bài.

Cách fix lỗi này khá đơn giản.

alt text

Bình luận


White
{{ comment.user.name }}
Bỏ hay Hay
{{comment.like_count}}
Male avatar
{{ comment_error }}
Hủy
   

Hiển thị thử

Chỉnh sửa

White

Cẩm Huỳnh

45 bài viết.
433 người follow
Kipalog
{{userFollowed ? 'Following' : 'Follow'}}
Cùng một tác giả
White
52 5
image cover]imgcover] “Make it work, make it right, make it fast.” Bạn vừa viết xong một ứng dụng web :tada:. Mọi thứ chạy ổn. Code cũng đã được...
Cẩm Huỳnh viết 1 tháng trước
52 5
White
43 9
(Ảnh) Vì sao lại là Bật Đèn? Ai từng đọc qua Tắt Đèn hẳn đã biết tác phẩm được kết thúc bằng tình huống: Buông tay, chị vội choàng dậy, mở cửa...
Cẩm Huỳnh viết hơn 1 năm trước
43 9
White
41 25
Vừa rồi mình vừa tiết kiệm được $5 mỗi tháng sau khi migrate cái (Link) từ Digital Ocean sang Heroku Free Dyno. (Ảnh) Kết quả thật mĩ mãn vì hầu ...
Cẩm Huỳnh viết hơn 1 năm trước
41 25
Bài viết liên quan
White
34 6
Nếu bạn muốn xây dựng một website mà chỉ bao gồm HTML, CSS và Javascript. Bạn có thể xây dựng 1 static web hoàn toàn miễn phí phục vụ cho việc học ...
Derek Nguyen viết hơn 1 năm trước
34 6
{{like_count}}

kipalog

{{ comment_count }}

bình luận

{{liked ? "Đã kipalog" : "Kipalog"}}


White
{{userFollowed ? 'Following' : 'Follow'}}
45 bài viết.
433 người follow

 Đầu mục bài viết

Vẫn còn nữa! x

Kipalog vẫn còn rất nhiều bài viết hay và chủ đề thú vị chờ bạn khám phá!