[SVATTT2017] Web 300 - Whichgirls

Đề bài: Là gì quên rồi! :(

Sau khi fuzzing các kiểu con đà điểu thì mình thấy tham số page bị dính lỗi Local File Inclusion. Kết hợp PHP Wrapper php://filter thì mình lấy được source code của trang web.

Đầu tiền mình kiểm tra index.php

Nhìn vào đoạn đầu của index.php, mình thấy rằng các request từ client gửi đến index.php đều được lưu lại tại /tmp/log/log_request_web300.txt

Ố ồ! Một ý tưởng tuyệt vời lóe lên trong đầu mình. Local File Inclusion to Remote Code Execution via log file. Perfect wombo combo! Feel like daxua gank tem 15gg!

Rất tiếc đời không như mơ, trang web không bị lỗi Poison Null Byte nên không thể sử dụng combo trên được. Hự!

Tiếp theo mình vẫn cứ phân vân về log request ở trên, không biết BTC log lại để kiểm soát các hành vi phá hoại thật hay đấy chỉ là trap và flag có liên quan đến tệp log kia (và mình xoay vòng vòng như thế trong khoảng 2 tiếng rưỡi đồng hồ @@).

Tận đến khi team mình bị kick xuống hạng thứ 9 (tương đương với việc ở nhà khỏi đi Đà Nẵng du lịch nữa) thì mình mới bắt đầu cuống cuồng lên và mình quyết định chuyển nghĩ theo cách tiếp cận khác.

Mình kiểm tra login.php

Trang login.php có 3 chức năng chính, đó là đăng nhập, đăng ký và reset mật khẩu.

Nhìn qua thì mình thấy tất cả các giá trị của input đều bị escape hết sạch. Có lẽ nào không phải là SQL Injection. Kiểm tra lại kĩ hơn xem nào.

Đăng nhập: input bị escape hết rồi => không inject được.

Đăng ký: input cũng bị escape hết => không inject được part 2.

Reset mật khẩu: có 2 truy vấn được thực hiện

- Truy vấn thứ nhất nhận giá trị name truyền vào, escape và lấy ra thông tin tài khoản tương ứng.

- Truy vấn thứ hai sẽ cập nhật password resetinfo dựa theo giá trị username vừa lấy được truy vấn thứ nhất (huh, không escape à).

Vậy là phần reset mật khẩu có thể khai thác được thông qua Second Order SQL Injection. Đúng là trời không bao giờ phụ người hiền!

PoC như sau:

- Đăng ký một user có name là zork

- Đăng ký tiếp user thứ hai có name là zork' and 1=1-- -

- Thực hiện reset mật khẩu của user thứ hai. Câu lệnh update mật khẩu sẽ trở thành update users set password='$passwordnew', resetinfo='$details' where username='zork' and 1=1-- -'

- Như vậy thay vì user thứ hai được reset mật khẩu thì chương trình lai reset mật khẩu của user thứ nhất (kiểm tra bằng cách thử đăng nhập vào user thứ nhất)

Việc tiếp theo mình chỉ cần code 1 đoạn chương trình khai thác để dump database ra thôi:

Ở trên là đoạn code kiểm tra 1 điều kiện SQL có đúng hay không. Mọi người có thể sử dụng để viết chương trình khai thác lấy cơ sở dữ liệu.

select group_concat(flag) from flag where flag like 'SVATTT2017%'

=> Flag: SVATTT2017{2order}

Nhận xét

Bài đăng phổ biến từ blog này

[SVATTT2017] Web 100 - Tên là gì ấy chả nhớ?