Làm thế nào để bắt đầu với CTF mảng Web?
Web là một trong những mảng dễ tiếp cận khi chơi CTF. Vậy bắt đầu CTF mảng Web như thế nào?
Giờ đặt một website trước mặt mình thì không thể cứ thế mà làm. Làm gì? Tìm flag? Một chuỗi bí mật do người ra đề giấu ở đâu đó quanh cái web. Muốn tìm được nó trước hết phải xem đề bài gợi ý cái gì, cho cái gì, trong web có gì, làm sao để khai thác mấy cái đó. Từ đây lại có một vấn đề: Phải hiểu về web trước đã.
Ø Web hoạt động thế nào?
Chúng ta sẽ cần nắm kiến thức về web qua những vấn đề như thế này:
- Cách hoạt động của web từ phía client cho đến phía server sẽ có những gì?
- Client gửi request cho server và nhận lại response như thế nào? Qua đâu? (HTTP, HTTP Header, HTTP Methods)
- Cách client và server lưu trữ thông tin của nhau (qua cơ sở dữ liệu, cookie, session, …).
- Các ngôn ngữ cấu thành 1 trang web hoặc thường được dùng khi xây dựng web. (HTML, CSS, JS, PHP, SQL ...)
- Thông tin whois của 1 trang web (ip, owner,...)
1. Liên quan đến HTTP
Mỗi khi truy cập một website, từ phía client phải gửi request lên server qua giao thức HTTP, và những request này được thể hiện dưới dạng HTTP header. Giống như việc muốn gửi bức thư thì phải có địa chỉ nhận, tên người viết, thông tin về người viết, nội dung dung thư thì có yêu cầu,... Các headers cũng chứa những thông tin tương tự như vậy.
Những headers này có rất nhiều nên các bạn có thể tự google tìm hiểu. Đặc biệt là chú ý về cookie, user-agent, là 2 trường hay được dùng trong các bài ctf.
Gửi một HTTP request đi cũng có thể gửi được bằng nhiều dạng khác nhau. Các dạng này chính là các HTTP Methods hay còn gọi là HTTP Verb. Dạng của nó bao gồm GET, POST, PUT, DELETE, OPTIONS,... Thường dùng nhất là POST và GET. Các bạn nên tìm hiểu kỹ điểm giống và khác của 2 methods này.
Một số bài khi dùng POST, GET đều không nhận được gì từ phía server, nhưng khi đổi sang HEAD, PUT, hoặc method khác thì lại ra kết quả. Lý do là ở file .htaccess đã block 2 method đó.
Tham khảo:
Nói tiếp đến response. Hẳn các bạn đã không ít lần gặp những thông báo kiểu 404 Not Found hoặc 403 Forbidden khi truy cập một url nào đó. Đó là vì sau một request được gửi đến server, ta sẽ nhận được response. Trong response, một cái luôn luôn có là HTTP Status Code. Mỗi đầu số 1xx 2xx 3xx 4xx 5xx có một ý nghĩa khác nhau.
Tham khảo:
Cuối cùng là việc thao tác với các headers. Trên Firefox mình hay dùng addon
2. Liên quan đến các ngôn ngữ lập trình web
Với nhiều bài CTF chúng ta sẽ phải đọc hiểu code, phân tích hoặc đoán code. Nói chung ta cần trang bị kiến thức về lập trình, hiểu từng ngôn ngữ để làm gì. Ví dụ như html, css thì giới hạn cũng để thể hiện giao diện web, ở html5 "xịn" hơn thì làm được game gì đó; js thì làm được nhiều hơn, hiệu ứng, tính toán …, quan trọng mấy thằng này đều là kiểu ngôn ngữ ở phía client, tức là chạy được luôn ở phía máy mình, và mình xem được code gốc của nó.
Đối với PHP, ASP, JSP,... đây là các ngôn ngữ được biên dịch trên server, và code gốc thì không xem được nhưng có rất nhiều bài CTF chủ động cho người chơi đọc code để phân tích hoặc có lỗi giúp ta có thể đọc code từ đó khai thác.
Tóm lại ta cần học HTML, CSS, JS và một ngôn ngữ server nào đó như PHP hoặc JSP (ít nhất ở mức đọc hiểu).
3. Liên quan đến Cookie, Session
o Nắm được định nghĩa cookie, session
o Nắm được cách thức lưu trữ của cookie, session.
Lưu ý quan trọng là cookie có thể thay đổi được ở phía client. Session thì chỉ đổi được id (tức là làm mới id, hoặc làm rỗng id). Phía server nếu đọc cookie ko phân biệt ip, đặc điểm trình duyệt người dùng,... thì ta có thể dựa vào đó để khai thác. Ví dụ xác thực admin qua cookie (có một trường id=1234; user=guest, giờ nếu sửa thành id=1;user=admin thì sẽ có thể đăng nhập dưới quyền admin).
Trong CTF đối khi có một bài SQL injection qua cookie. Nói chung cookie cũng là dữ liệu từ phía người dùng, tức là mình có thể thay đổi, và truyền các dữ liệu sai trái lên server.
4. Liên quan đến SQL Injection
o SQL injection cơ bản
o SQL injection - Blind: Không thể trực tiếp get ra đoạn dữ liệu mình muốn và phải get từng ký tự, hoặc dựa và các câu lệnh điều kiện đúng sai,...
o SQL injection - Error based: Có thể nói là mở rộng của blind, tùy vào dữ liệu đúng hoặc sai mà server trả về kết quả khác nhau.
o SQL injection - Time based: Dùng một câu lệnh SQL chứa lệnh Sleep(), hoặc một hàm nào đó để nghỉ khi gặp điều kiện đúng. Ví dụ IF(điều kiện, điều kiện nếu đúng-> Sleep(10), đk nếu sai -> null)
o SQL Injection cơ bản mình học qua course này, có thể ko cần học hết, chỉ cần nắm rõ cách khai thác qua SQL sau đó có thể tự tìm hiểu thêm tùy bài ctf:
5. Local & Remote File Inclusion
o Chi tiết:
o Một clip ví dụ:
6. XSS
Mọi thông tin chi tiết xin truy cập vào link sau:
7. Luyện Tập
Đọc qua tất cả những thông tin phía trên thì đúng là có phần hơi quá tải. Lúc đầu mới chơi CTF mình cũng không có nhiều kiến thức đến vậy. Bài viết này mình muốn là một nơi tổng hợp tương đối các kiến thức cần thiết để các bạn biết sẽ cần trang bị những gì, tìm vấn đề ở đâu,... Sau cùng dưới đây là những nơi mình đã luyện tập CTF mà thấy rất hiệu quả
o
o
o
o
Chúc các bạn vui vẻ
#CodeBattle2018
công nghệ thông tin
Cảm ơn bạn đã chia sẻ. Để đấu được CTF đúng là có rất nhiều thứ cần phải học!
Có câu khá khó về đề bài web năm ngoái trong CodeBattle2017: Họ cung cấp một trang web: "trong trang web chỉ có một chỗ để nhập text và nút submit". Và kết quả đó là bạn phải nhập và submit 20 lần chữ "PHP" (không nhầm là như vậy) thì mới có Flag hiện ra.
Và mình không biết tại sao anh cùng team mình lại có thể tìm ra được đáp án như vậy? =)). Theo như kiến thức của bạn cung cấp trên thì mình nghi ngờ vào hai trường hợp: "Cookie" (dữ liệu được giữ ở mỗi ip) hoặc "Javascript" (dữ liệu được xử lý trực tiếp theo sự kiện).
Dương Lee
Cảm ơn bạn đã chia sẻ. Để đấu được CTF đúng là có rất nhiều thứ cần phải học!
Có câu khá khó về đề bài web năm ngoái trong CodeBattle2017: Họ cung cấp một trang web: "trong trang web chỉ có một chỗ để nhập text và nút submit". Và kết quả đó là bạn phải nhập và submit 20 lần chữ "PHP" (không nhầm là như vậy) thì mới có Flag hiện ra.
Và mình không biết tại sao anh cùng team mình lại có thể tìm ra được đáp án như vậy? =)). Theo như kiến thức của bạn cung cấp trên thì mình nghi ngờ vào hai trường hợp: "Cookie" (dữ liệu được giữ ở mỗi ip) hoặc "Javascript" (dữ liệu được xử lý trực tiếp theo sự kiện).