Viết chương trình xác định phiên bản WordPress

Hôm bữa có việc cần làm với WordPress, mình mới lên mạng truy cập trang wordpress.org để tải cái CMS của nó về. Có một cái lỗi nhỏ gây lỗi cực kỳ nghiêm trọng trong core của phiên bản 4.7 (attacker có thể thay đổi nội dung của các bài viết), do đó mà mình phải tìm và tải bản đó về cài đặt thử nghiệm.

Cũng nhờ mày mò tìm cách cài rồi bị lỗi, mà bây giờ biết cách cài XAMPP trên môi trường Linux =))

Sau khi cài đặt thành công, chỉnh sửa cái bài Hello có sẵn của nó rồi mở code Python lên tấn công thay đổi nội dung bài viết, mình mới nhận ra có gì đó kì kì. Code tấn công không chạy. Thế là phải mày mò đi vào dashboard của trang localhost đó, xác định lại phiên bản. Và đúng như dự đoán, phiên bản CMS đã hô biến thành bản mới nhất hiện tại là 4.9.1 rồi.

Bỏ qua cái chuyện khai thác lỗi Unauthenticated Content Injection kia đi. Sau khi làm lại đúng phiên bản thì chuyện tấn công là đơn giản. Vấn đề là: có cách nào xác định phiên bản CMS WordPress của một trang bất kỳ, mà không cần phải vào dashboard của nó hay không? Hoặc một câu hỏi thẳng thắn hơn: có cách nào không cần quyền quản trị của trang web mà vẫn có thể xác định phiên bản của nó nhanh chóng không?

Sau khi mở source code của một vài trang web dùng CMS của WordPress ra xem, câu trả lời là: hoàn toàn có thể!

Đi soi hàng của một số em chân dài, à nhầm, soi code của một số trang, mình cũng nhanh chóng nhận ra, có một thẻ <meta> chứa thông tin phiên bản hiện tại của WordPress.

<meta name=”generatorcontent=”WordPress 4.9” />

Ta-daa! Vậy là xong rồi. Quá dễ dàng, phơi hàng lồ lộ thế này thì đâu có gì khó khăn nữa. Mở Visual Studio lên và tạo ra phần mềm be bé của mình thôi.

Do mình được nhồi C# suốt 3 năm chứ không phải Java hay anh nào khác, nên thạo C# hơn. Nếu muốn bạn có thể dùng bất kỳ ngôn ngữ nào bạn thạo và có hỗ trợ rồi làm theo ý tưởng này.

Việc gì cũng vậy, trước tiên là phải định hình được cái dung nhan, còn chất lượng và âm thanh từ từ tính sau. Nói cho vui vậy thôi, đi chọn người đầu ấp tay gối cùng mình mà lựa kiểu này là xác định khóc cả một dòng sông đêm tân hôn và cả những đêm còn lại =)))

identifyVersionWordPress

Chương trình chạy đơn giản như sau:

  1. Nếu thanh địa chỉ trống thì nút GET VERSION sẽ bị tắt.
  2. Ngay khi có sự thay đổi ở URL (tức là gõ vào địa chỉ trang web) thì nó mới load trang web ngầm lên trong WebBrowser control.
  3. Load thành công trang web thì mới sáng cái nút GET VERSION lên cho người dùng sử dụng.
  4. Khi người dùng nhấn nút, nó sẽ thực hiện kiểm tra cái thẻ <meta> và xác định phiên bản, in ra bên dưới dòng chữ “Phiên bản CMS đang dùng:” cho ta thấy.

Ở đây, nếu muốn thì có thể cải tiến lại, gộp chung bước 3 và bước 4 làm thành một thôi. Tức là lúc này:

  1. Nếu thanh địa chỉ trống thì nút GET VERSION sẽ bị tắt.
  2. Ngay khi có sự thay đổi ở URL (tức là gõ vào địa chỉ trang web) thì nó mới load trang web ngầm lên trong WebBrowser control.
  3. Đồng thời, kiểm tra luôn thẻ <meta> chứa thông tin phiên bản WordPress của website này. Xuất ra màn hình kết quả ngay lập tức.

Nhưng do lúc bắt tay code, không có nghĩ được sâu xa tới mức như vầy, thậm chí còn có trục trặc ở khâu xử lý thẻ <meta> nữa. Nói chung, có nút nhấn luôn mang lại cảm giác an toàn.

Nhưng không thể nào mọi chuyện đơn giản như thế. Trong các trang web dùng CMS WordPress, có ít nhất 2 thẻ <meta> có cấu trúc giống nhau, chỉ khác nhau về mặt nội dung ta đang xét.

<meta name=”generatorcontent=”WordPress 4.9” />

<meta name=”generatorcontent=”Powered by Visual Composer – drag and drop page builder for WordPress.“/>

Chúng đều có name là “generator”, có cả thuộc tính content nhưng khác nhau. Code xử lý chỗ này chưa hay, nên trong chương trình của mình, nó lấy luôn cả 2 content này. Và trả về màn hình câu “Powered by Visual Composer – drag and drop page builder for WordPress.” Khá là bực mình.

Nhưng sau khi ngồi phân tích kỹ hơn xíu, ta nhận thấy dòng chứa phiên bản có từ bắt đầu là WordPress <number_version>. Như vậy, lọc ra trong những thẻ <meta> tìm được, thẻ nào có content bắt đầu bằng chữ “WordPress” thì nó là dòng chứa phiên bản.

Thăm dò một số trang web dùng WordPress, mình thấy ý tưởng này khả thi, không bị lỗi về mặt suy luận.

Nếu muốn dùng thử, bạn có thể truy cập vào đây và tải về. Lưu ý, máy tính phải cài .NET Framework 4.5.1 trở lên nếu muốn sử dụng (do lúc code là build trên nền framework version này):

https://github.com/votinhthuong/identifyWordPress

VÕ TÌNH THƯƠNG

votinhthuong9@gmail.com

 

Advertisements

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Google+ photo

You are commenting using your Google+ account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s